最近做了一个项目,是用飞思卡尔的单片机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。
因此该定时器不能用于实际的工程。