2410共有5個定時器,其中timer4沒有引腳輸出,其余都可以用作pwm。0、1共用一個預分頻器
本文引用地址:http://cafeforensic.com/article/201611/319913.htm2、3、4共用一個預分頻器
TCFG0 [0:7][8:15] 分別對應這兩個預分頻器,分頻值不要忘了+1,因為分頻值不能為0
TCFG1[0:3][][][][][] 分別對應這每個定時器自己的分頻值
TCNTB0 定時器的計數值
TCMPB0 定時器的比較值
我理解的PWM,在一個固定的時間周期中,也就是TCNTB0這個值,一個周期開始后,TCNTB0開始減1計數,當減到和TCMPB0 相等時,TOUT0輸出反轉,當TCNTB0減到0時,TOUT0輸出再次反轉,一個新的計數周期開始。
TCNTO0 定時器監(jiān)聽寄存器
TCON0 控制寄存器
在第一次使用定時器時,需要手動更新位1以使TCNTB0/TCMPB0 裝入內部寄存器。CNT0/TCMP0中。下一次如果還要設置這一位,需要先將它清0.
DMA模式
給出一個實現timer0的例子
void init_irq(void)
{
rPRIORITY = (rPRIORITY & ((~0x01) | (0x03 << 7))) | (0x0 << 7);
//rINTMSK &= (~(1 << 0)) & (~(1 << 2)) & (~(1 << 5));
rINTMSK &= ((~(1 << 0)) & (~(1 << 2)));
pISR_EINT0 = (unsigned)Eint0_ISR;
pISR_EINT2 = (unsigned)Eint2_ISR;
//pISR_EINT4_7 = (unsigned)Eint4_7_ISR;
rINTMSK &= ~(1 << 10);//允許timer0的中斷
pISR_TIMER0 = (unsigned)Eint10_TIMER0_ISR; //將中斷函數賦值
}
void Timer0_init()
{
//rTCFG0設置預分頻器
//PCLK 50M/200 = 250KHz
rTCFG0 = (rTCFG0 & (~(0xFF << 0))) | (200 << 0);
//rTCFG1設置工作在哪種分頻 2、4、8、16或者是TCLK0/TCLK1
rTCFG1 = (rTCFG1 & (~(0xF << 0))) | (3 << 0);//16分頻
rTCNTB0 = 30000; //計數值
rTCON |=(1 << 1); //手動將計數值裝入TCNT0中
rTCON &= ~(1 << 1);// 這位一定要再次清零,否則,定時器不會自動裝載
rTCON |=(1 << 3) | (1 << 0);//開啟定時器,并自動裝載
}
void __irq Eint10_TIMER0_ISR(void)
{
i++;
rSRCPND = BIT_TIMER0;
rINTPND = BIT_TIMER0;
}
評論