HCS12的定时器研究(1)

2019-04-15 15:36发布

最近做了一个项目,是用飞思卡尔的单片机MC9S12XEP100,这个单片机与之前用的很多单片机有许多不同的地方,为此笔者也被一些问题苦恼了很长时间,现在把这些经验和教训写下来供大家批评。
为叙述方便,以下的单片机都简称为HCS12
定时器的问题
HCS12单片机有三种定时器,ECT(Enhanced Capture Timer),TIM(Standard Timer Module),PIT(Periodic Interrupt Timer)。 三种定时器的控制方式不一样。 1. ECT static void ECT_Timer_Init(void) 
{
    ECT_TSCR1=0x90;//计数器使能TEN|快速清零TFFCA
    ECT_TSCR2=0X85;//DIV 32->80ms    131
    ECT_TCNT =0xcf2c;     //    
 //   ECT_PACTL=0X50;  //PT7 PIN,PACN32 16BIT  
 ECT_TSCR1_TEN = 0;        
}
ECT定时器的几个寄存器的定义可以查手册,上面的代码是基于主频16M写的,通过32分频,可以得到每个周期为80MS,通过设置TCNT寄存器可以设定从什么位置开始计时。 如上面代码设置了0XCF2C,那么定时的时间是(0xffff-0xcf2c)*(80/65536)=25ms. ECT模块是一个功能非常强大的模块,可以计数,捕捉脉冲,也可以用定时中断。它的中断程序如下: #pragma CODE_SEG __NEAR_SEG NON_BANKED 
void interrupt 16 ECT_Timer_Overflow(void) { // 80ms timer overflow
  ECT_TFLG2_TOF = 1;    //清定时器溢出标志位    
  PORTB_PB7=~PORTB_PB7;   
  ECT_TCNT=0xcf2c;      
}
进入中断先清除溢出标志位,然后执行动作,即将PB7反向,从而可以得到周期为50ms的方波,最后再将TCNT设置为0xcf2c。 但是问题来了: 在连接BDM仿真器的时候定时时间非常准确,PB7每25ms翻转一次,方波的周期是50ms。但是断开仿真器,让电路板单片模式运行,用示波器再查看PB7的波形,发现周期变成了80MS。 经过查手册发现TCNT寄存器在TEST模式下是READ&WRITE的,在单片模式下是READ ONLY。 因此该定时器不能用于实际的工程。