定時器配置的相關寄存器如下(以s3c2440手冊順序列出)
1. TCFG0:定時器配置寄存器0
功能:定義器的死區長度及預標定器值的設置
說明:bit[0:7]設置定時器0和1的預標定器值,bit[8:15]設置定時器2、3和4的預標定器值。
2. TCFG1:定時器配置寄存器1
功能:DMA方式選擇、時鐘分頻以及外部時鐘選擇
注意:bit[23:20]=0000時,不選擇DMA(初學者)
3. TCON:定時器控制寄存器
功能:自動重載是否開啟,輸出反相是否開啟,手動更新設置,定時器的開啟和停止。
4. TCNTB:定時器緩存寄存器
功能:存儲定時器初始計數值。當遞減計數器減為0時,定義時器中斷請求生成通知CPU定時器操作完成。此時相應的TCNTB的值裝載到遞減計數器中繼續下一個操作。
注意:遞減計數器為16位計數器,最重要的一點:若要重新裝載,必須使能自動重載位。
5. TCMPB:定時器比較緩存寄存器
功能:用於脈寬調制。當遞減計數器的值與比較寄存器中的值匹配時,定時器控制邏輯改變輸出電平
6. TCNTO:計數觀察寄存器
功能:該寄存器中的值代表當前遞減計數器中的值
以TQ2440開發板所帶程序為例,其中有一個毫秒級的延時函數(基於定時器3)。
void Delay(int time)
{
U32 val = (PCLK>>3)/1000-1; ------PCLK頻率為50MHz(視實際時鐘配置而定)。此時val的值為6249。其中有一個減1的情況,個人認為是重新裝載過程需要一個時鐘周期(個人觀點,歡迎指正),所以減1。
rTCFG0 &= ~(0xff<<8); //預標定器1清0
rTCFG0 |= 3<<8; //prescaler = 3+1,死區長度為0
rTCFG1 &= ~(0xf<<12); //MUX3清0
rTCFG1 |= 0<<12; //MUX3= 1/2
rTCNTB3 = val; -----由此算出頻率為,1000Hz。計算為freq=50M/4/2/6249
rTCMPB3 = val>>1; // ------占空比為50%,當TCNT03中的值為//val的一半時,輸出邏輯電平改變
rTCON &= ~(0xf<<16); //定時器的相關控制位清0
rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, //start timer 3
rTCON &= ~(2<<16); //清除手動更新位
while(time--) {
while(rTCNTO3>=val>>1); ------等待TCNTO3從6249到3124
while(rTCNTO3<val>>1); -------等待TCNTO3從3124到6249(自動重載後的值)
}
}