TX2440 看手册学习2440-深入理解中断处理机制(ADS1.2编译)
这一节比较简单,我们就简单地说.
5个16位的定时器.分别是Timer0-4. Timer0-3具有PWM功能,也就是说有往外输出方波的引脚.Timer4是一个内置的定时器,没有输出引脚.Timer0还有个功能叫死区生成器.下面重点说说死区生成器的定义.s3c2440有2个8位分频器:Timer0-1共用一个8位分频器,Timer2-4共用另一个8位分频器.
死区生成器:其它不多说了.直接上图
主要包含这几个寄存器:定时器配置寄存器0(TCFG0),定时器配置寄存器1(TCFG1),定时器控制寄存器(TCON),计数缓冲寄存器TCNTBn,比较缓冲寄存器TCMPBn,计数观察寄存器TCNTOn.
定时器输出时钟频率公式:PCLK / (prescaler + 1) / divider ,其中prescaler:0~255;divider :2,4,8,16.
时序图:
代码实练:
void Delay(int time)
{
U32 val = (PCLK>>3)/1000-1; // |-----|-----|
// 1 0
// 如果val = 1,实际运行两个计数.所以减1
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= 3<<8; //prescaler = 3+1
rTCFG1 &= ~(0xf<<12);
rTCFG1 |= 0<<12; //mux = 1/2 //1秒运PLCK/8个计数. 运行一个计数花费8/PLCK秒时间.也就是0.32us一个计数.
rTCNTB3 = val; //一个周期PCLK/8/1000个计数,也就是说一个周期1ms
rTCMPB3 = val>>1; // 50%
rTCON &= ~(0xf<<16);
rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
/*
__asm
{
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
}
*/
rTCON &= ~(2<<16); //clear manual update bit
/* //清除手动更新位之前,rTCNTO3是不会变化的,也就是定时器是不会开始的。
__asm
{
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
}
*/
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3<val>>1);
};
}
int iSec = 0;
void __irq Time1IRQHandle(void)
{
rSRCPND |= (1<<11);
rINTPND |= (1<<11);
myUart_Printf("%d\n",iSec++);
}
void TimeIntOneSec()
{
U32 val = 50000;
pISR_TIMER1 = (unsigned)Time1IRQHandle; //注意:函数地址一定是无符号的32位,不能强转成有符号的.
myUart_Printf("(unsigned)Time1IRQHandle = %u\n",(unsigned)Time1IRQHandle);
myUart_Printf("*(int*)Time1IRQHandle = %u\n",(unsigned)(*(int*)Time1IRQHandle));
rINTMSK &= ~(1<<11);
// PCLK / (prescaler + 1) / divider
rTCFG0 &= ~(0xff);
rTCFG0 |= 24; //prescaler = 24+1
rTCFG1 &= ~(0xf<<4);
rTCFG1 |= 0<<4; //divider = 2 // (24+1)*2 / 25M = 2us一个计数.
rTCNTB1 = val; //一个周期100ms
rTCMPB1 = val>>1; // 50%
rTCON &= ~(0xf<<8);
rTCON |= 0xb<<8; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
rTCON &= ~(2<<8); //clear manual update bit
myUart_Printf("IRQ initial is OK!\n");
}