9S12系列单片机的ECT(EnhancedCaptureTimerModule)模块是在原68HC12的StandardTimermodule基础上加以增强功用构成的。
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);
- }