TX2440 看手册学习2440-定时器的使用(ADS1.2编译)

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");
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值