Freescale 9S12 系列单片机应用笔记(ECT 模块) 1
ECT模块主要由以下几部分组成,参看图1:
- 一个带可编程预分频的16位向上计数的自由运行计数器
- 8个独立的定时器通道,每个通道具备输入捕捉/输出比较功能
- 4个8位脉冲累加器,也可设置成2个16位脉冲累加器
- 一个带可编程预分频的16位的向下计数的计数器
图1ECT模块结构示意图
从上面示意图中可以就看出,ECT模块相当的复杂,不是简单的几句话就能说明白的。我也是通过很长时间的学习实践,才逐步掌握了ECT模块的使用。
本文将通过一系列的实例,从最简单的功能开始,逐步展开。一步一步的展示ECT模块的强大功能。
实验1:自由运行计数器(TCNT)与溢出中断
自由运行计数器(TCNT)也称为自由运行主定时器,是一个16位的计数器,可以说是ECT的核心。在系统复位时,这个自由运行计数器的初值为$0000。当ECT模块运行时,自由运行计数器从$0000~$FFFF循环递增计数。当计数器溢出复零时,会置位中断标志。利用这个计数器,可以产生一个周期的中断信号。
TCNT的输入时钟也是可以选择的,图2给出了TCNT的时钟源的示意图。可以看出,TCNT的输入时钟可以来源于总线时钟、总线时钟经过预分频、外部引脚输入的脉冲、外部引脚输入脉冲经过脉冲累加器分频这四种选择。当然,选择哪个时钟源其实就是在程序中设置一下相应的寄存器这么简单。
图2TCNT的时钟源
了解了上面的介绍,就可以开始本文的第一个例子了,这个例子非常简单,将BUSCLOCK分频后作为TCNT的输入时钟,使能TCNT溢出中断。
在开始代码之前,还需要介绍几个程序中用到的寄存器。
TCNT寄存器(TimerCountRegister)
这个寄存器其实已经介绍过了,它是一个16位的只读寄存器。在每个时钟输入下计数值会自动加1,当计数值为0xFFFF后下一个时钟脉冲会使计数器溢出为0x0000。程序中可以随时读取TCNT的值,唯一需要注意的是TCNT是个16位的寄存器,读取时要一次将其读出,如果分为高低两个字节读取,读到的数据不一定能拼接成一个有效的计数值。
图3TCNT寄存器
TFLG2寄存器(MainTimerInterruptFlag2)
这个寄存器只有最高位TOF是有意义的。当TCNT溢出时会置位TOF位,程序中可以轮询这一位来判断TCNT是否溢出了。当然这种轮询的方法效率很低,更实用的方法是利用TCNT溢出中断。向TOF位写1会清除TOF,在TCNT溢出中断中就必须清除TOF,否则就不会响应下一次溢出中断。
图4TFLG2寄存器
TSCR2寄存器(TimerSystemControlRegister2)
这个寄存器由三部分功能组成。
TOI位是TimerOverflowInterruptEnable的简写。TOI位为0时表示禁止TCNT溢出中断,这时只能通过轮询TOF位来判断是TCNT计数器是否溢出了。TOI位为1表示使能TCNT溢出中断。
TCRE位是TimerCounterResetEnable的简写。TCRE位为0表示TCNT自由运行,TCRE位为1表示当TCNT=OC7时复位。
PR2、PR1、PR0是总线时钟的预分频因子。当PR2-0组成的三位2进制数为N时,表示将BUSCLOCK分频2^N。
图5TSCR2寄存器
TSCR1寄存器(TimerSystemControlRegister1)
TEN位为0时ECT模块被禁用。TEN位为1时ECT模块被使能。
TSWAI(TimerModuleStopsWhileinWait)位为0时,ECT模块在STOP模式下仍旧运行。TSWAI位为1时,ECT模块在STOP模式停止运行。
TSFRZ(TimerandModulusCounterStopWhileinFreezeMode),这一位与TSWAI位类似。
TFFCA(TimerFastFlagClearAll)我还没仔细研究,作用不明。
图6TSCR1寄存器
有了上面这些介绍,就可以很容易的看懂下面的代码了。在我的实验板上,晶振频率为16.384MHz,因为没有开启PLL,BUSCLOCK为8.192MHz,内核频率为16.384MHz。8.192MHz被128预分频后为64KHz,16位计数器溢出频率为0.98Hz(64000/65536)
- #include
/*commondefinesandmacros*/ - #include"derivative.h"/*derivative-specificdefinitions*/
- #include"sci.h"
- voidECTInit(void)
- {
- TSCR2_PR=7;//prescalefactoris8,busclock/128=8MHz/128=64KHz
- TSCR2_TOI=1;//timeroverflowinterruptenable
- TSCR1_TEN=1;//timerenable
- }
- voidmain(void)
- {
- SCIInit();
- SCISetBaudRate(SCI0,9600,8192000L);
- ECTInit();
- EnableInterrupts;
- for(;;)
- {
- _FEED_COP();/*feedsthedog*/
- }/*loopforever*/
- }
- interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
- {
- TFLG2_TOF=1;//cleartimeroverflowflag
- SCIPutChar(SCI0,x);
- }
Freescale9S12系列单片机ECT模 相关文章: