2410共有5個(gè)定時(shí)器,其中timer4沒(méi)有引腳輸出,其余都可以用作pwm。0、1共用一個(gè)預(yù)分頻器
本文引用地址:http://www.biyoush.com/article/201611/319913.htm2、3、4共用一個(gè)預(yù)分頻器
TCFG0 [0:7][8:15] 分別對(duì)應(yīng)這兩個(gè)預(yù)分頻器,分頻值不要忘了+1,因?yàn)榉诸l值不能為0
TCFG1[0:3][][][][][] 分別對(duì)應(yīng)這每個(gè)定時(shí)器自己的分頻值
TCNTB0 定時(shí)器的計(jì)數(shù)值
TCMPB0 定時(shí)器的比較值
我理解的PWM,在一個(gè)固定的時(shí)間周期中,也就是TCNTB0這個(gè)值,一個(gè)周期開(kāi)始后,TCNTB0開(kāi)始減1計(jì)數(shù),當(dāng)減到和TCMPB0 相等時(shí),TOUT0輸出反轉(zhuǎn),當(dāng)TCNTB0減到0時(shí),TOUT0輸出再次反轉(zhuǎn),一個(gè)新的計(jì)數(shù)周期開(kāi)始。
TCNTO0 定時(shí)器監(jiān)聽(tīng)寄存器
TCON0 控制寄存器
在第一次使用定時(shí)器時(shí),需要手動(dòng)更新位1以使TCNTB0/TCMPB0 裝入內(nèi)部寄存器。CNT0/TCMP0中。下一次如果還要設(shè)置這一位,需要先將它清0.
DMA模式
給出一個(gè)實(shí)現(xiàn)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; //將中斷函數(shù)賦值
}
void Timer0_init()
{
//rTCFG0設(shè)置預(yù)分頻器
//PCLK 50M/200 = 250KHz
rTCFG0 = (rTCFG0 & (~(0xFF << 0))) | (200 << 0);
//rTCFG1設(shè)置工作在哪種分頻 2、4、8、16或者是TCLK0/TCLK1
rTCFG1 = (rTCFG1 & (~(0xF << 0))) | (3 << 0);//16分頻
rTCNTB0 = 30000; //計(jì)數(shù)值
rTCON |=(1 << 1); //手動(dòng)將計(jì)數(shù)值裝入TCNT0中
rTCON &= ~(1 << 1);// 這位一定要再次清零,否則,定時(shí)器不會(huì)自動(dòng)裝載
rTCON |=(1 << 3) | (1 << 0);//開(kāi)啟定時(shí)器,并自動(dòng)裝載
}
void __irq Eint10_TIMER0_ISR(void)
{
i++;
rSRCPND = BIT_TIMER0;
rINTPND = BIT_TIMER0;
}
評(píng)論