2410共有5个定时器,其间timer4没有引脚输出,其他都可以用作pwm。
0、1共用一个预分频器
2、3、4共用一个预分频器
TCFG0 [0:7][8:15] 别离对应这两个预分频器,分频值不要忘了+1,由于分频值不能为0
TCFG1[0:3][][][][][] 别离对应这每个定时器自己的分频值
TCNTB0 定时器的计数值
TCMPB0 定时器的比较值
我了解的PWM,在一个固定的时刻周期中,也便是TCNTB0这个值,一个周期开端后,TCNTB0开端减1计数,当减到和TCMPB0 持平时,TOUT0输出回转,当TCNTB0减到0时,TOUT0输出再次回转,一个新的计数周期开端。
TCNTO0 定时器监听寄存器
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;
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/262300.html