GNU ARM匯編--(九)s3c2440的PWM
PWM TIMER
概述
s3c2440有5個16bit的定時器.Timer0,1,2和3有PWM功能.Timer4是沒有輸出管腳的內(nèi)部定時器.Timer0有一個dead-zone產(chǎn)生器,用于大電流設備.
Timer0和1共用一個8bit的預分頻器,而timer2,3,4共用另外一個8bit的預分頻器.每一個定時器都有一個時鐘除法器,可以產(chǎn)生5個不同的除法信號(1/2,1/4,1/8,1/16和TCLK).每一個定時器從時鐘除法器接收各自的時鐘信號,除法器從各自的8bit預分頻器接收時鐘.8bit的預分頻器是可編程控制的,將PCLK除成要加載的值,存在TCFG0和TCFG1中.
當定時器啟用時定時器計數(shù)緩沖寄存器(TCNTBn)將初始值加載到down-counter中.定時器比較緩沖寄存器(TCMPBn)將初始值加載到比較寄存器中與donw-counter的值比較.當頻率變化時TCNTBn和TCMPBn的雙緩沖屬性保證定時器產(chǎn)生穩(wěn)定的輸出.
每個定時器有自己的16bit down-counter,由定時器時鐘驅(qū)動.當down-counter為0,定時器中斷請求產(chǎn)生來通知CPU定時器操作以及完成了.當定時器的計數(shù)器為0,相關(guān)的TCNTBn的值會自動的加載到down-counter中來繼續(xù)下一次操作.然而,當定時器停止,比如在定時器運行中清除TCONn的定時器使能位,TCNTBn不會重加載到計數(shù)器中.
TCMPBn的值被用于PWM.當down-counter的值與比較寄存器的值吻合時,定時器控制邏輯會改變輸出電平.所以比較寄存器決定PWM輸出的打開時間.
屬性
5個16bit的定時器
兩個8bit的預分頻器&兩個4bit的除法器
輸出波形可編程控制
自動重加載模式或one-shot pulse mode
dead-zone產(chǎn)生器
PWM TIMER OPERATION
Prescaler&Divider
BASIC TIMER OPERATION
一個定時器(除了5)有TCNTBn,TCNTn,TCMPBn和TCMPn.當定時器為0時TCNTBn和TCMPBn加載到TCNTn和TCMPn中.當TCNTn為0,如果中斷開啟的話就會產(chǎn)生一個中斷請求.
AUTO RELOAD&DOUBLE BUFFERING
PWM定時器有一個雙緩沖功能,保證下次定時器操作時重加載的值改變時無需停止當前的定時器操作.所以新的定時器的值設定,當前的定時器操作也可以成功完成.
定時器的值可以寫到TCNTBn中,定時器的當前計數(shù)值可以從TCNTOn中讀到.TCNTBn被讀取的值,不表明計數(shù)器的當前狀態(tài),而是下一次定時器持續(xù)期間的重加載值.
當TCNTn為0,自動重加載操作會復制TCNTBn到TCNTn中.如果TCNTn為0,而自動重加載的使能位為0,那么TCNTn不會再操作了.
TIMER INITIALIZATION USING MANUAL UPDATE BIT AND INVERTER BIT
當down-counter為0,定時器的自動重加載操作就會動作.所以user要預先定義TCNTn的初始值.在這種情況下,初始值通過手動更新位進行加載.下面的步驟描述如何啟動一個定時器:
1.向TCNTBn和TCMPBn中些初始值
2.設置定時器的手動更新位.推薦配置inverter on/off bit(不管用不用)
3.設置定時器的開始位來啟動定時器(同時清除手動更新位)
如果定時器被強行停止,TCNTn保持計數(shù)器的值而且不會從TCNTBm中重加載.如果要設置一個新值,要執(zhí)行手動更新.
注意:不論何時TOUT inverter on/off bit被更改,在定時器運行時TOUTn的邏輯值都會改變.因此,最好在配置手動更新位的時候配置inverter on/off bit.
TIMER OPERATION
上面的圖是下面操作的結(jié)果:
1.使能自動重加載功能.設置TCNTBn為160(50+110),TCMPBn為110.設置手動更新位并配置反轉(zhuǎn)位(on/off).手動更新位將TCNTn和TCMPn的值更新到TCNTBn和TCMPBn中. 接下來設置TCNTBn為80(40+40),TCMPBn為40,它們決定下一次重加載的值.
2.設置開始位,手動更新位設為0.關(guān)閉反轉(zhuǎn)器,打開自動重加載.在等待時間后定時器開始計數(shù)
3.當TCNTn和TCMPn有相同的值時,TOUTn的邏輯電平由低變?yōu)楦?/p>
4.當TCNTn為0時,中斷請求產(chǎn)生,TCNTBn的值被加載到一個臨時寄存器.在下次定時器周期,TCNTn會重載臨時寄存器的值.
5.在中斷服務例程中,TCNTBn設為80(20+60),TCMPBn設置為60,同樣用于下一次周期.
6.當TCNTn和TCMPn有相同的值時,TOUTn的邏輯電平由低變?yōu)楦?/p>
7.當TCNTn為0,TCNTn自動加載TCNTBn的值,觸發(fā)中斷請求.
8.在中斷服務例程中自動重加載和中斷請求被禁用,停止定時器
9.當TCNTn與TCMPn有相同值,TOUTn的邏輯電平由低變?yōu)楦?/p>
10.即使TCNT0為0,因為自動重加載被禁用了所以TCNTn不會再重加載,定時器停止了
11.沒有中斷請求產(chǎn)生了
PULSE WIDTH MODULATION(PWM)
通過使用TCMPBn來實現(xiàn)PWM功能.PWM的頻率由TCNTBn來決定.
減少TCMPBn的值可以有更高的PWM值.增加TCMPBn的值可以有更低的PWM值.如果輸出反轉(zhuǎn)使能了,增加和減少操作也要反轉(zhuǎn).
雙緩沖功能允許在ISR中將下一次PWM的TCMPBn的值在當前PWM的周期的任何一個時間點被寫入.
OUTPUT LEVEL CONTROL
假定反轉(zhuǎn)功能時關(guān)閉的,下面的步驟描述如何保證TOUT是高還是低:
1.關(guān)閉自動重加載位.TOUTn時高電平,當TCNTn為0時定時器停止.
2.通過清除定時器的開始位來停止定時器.如果TCNTn<=TCMPn,輸出高;如果TCNTn>TCMPn,輸出低.
3.可以通過TCON的反轉(zhuǎn)開關(guān)來決定TOUT是否反轉(zhuǎn).反轉(zhuǎn)器會移除額外的電流來適應輸出電平.
PWM的各個寄存器描述
(注:因為TQ2440的板子是用TOUT0來控制蜂鳴器的,所以有些寄存器就不關(guān)注了)
定時器配置寄存器0(TCFG0)
定時器輸入時鐘周期 = PCLK/(prescaler + 1)/(divider value)
{prescaler} = 0~255
{divider value} = 2,4,8,16
Register Address R/W Description
TCFG0 0x51000000 R/W 配置兩個8的預分頻器
TCFG0 Bit Description
Dead zone length [23:16] 死區(qū)的長度,長度等于timer0的單位長度
Prescaler1 [15:8] 這個是給Timer2 3 4用的
Prescaler0 [7:0] 這個是給Timer0 1用的
定時器配置寄存器1(TCFG1)
Register Address R/W Description
TCFG1 0x51000004 R/W 5路MUX和DMA模式選擇寄存器
TCFG1 Bit Description
DMA mode [23:20] 選擇DMA請求通道
0000=No select 0001=Timer00010=Timer1
0011=Timer20100=Timer3 0101=Timer4
MUX4 [19:16] 為PWM Timer4選擇復用輸入
0000=1/2 0001=1/4 0000=1/8
0011=1/16 01xx=External TCLK1
MUX3 [15:12] 為PWM Timer3選擇復用輸入
0000=1/2 0001=1/4 0000=1/8
0011=1/16 01xx=External TCLK1
MUX2 [11:8] 為PWM Timer2選擇復用輸入
0000=1/2 0001=1/4 0000=1/8
0011=1/16 01xx=External TCLK1
MUX1 [7:4] 為PWM Timer1選擇復用輸入
0000=1/2 0001=1/4 0010=1/8
0011=1/16 01xx=External TCLK1
MUX0 [3:0] 為PWM Timer0選擇復用輸入
0000=1/2 0001=1/4 0010=1/8
0011=1/16 01xx=External TCLK1
評論