您的位置 首页 发布

Freescale 9S12 系列单片机使用笔记(ECT 模块) 1

9S12系列单片机的ECT(EnhancedCaptureTimerModule)模块是在原68HC12的StandardTimermodule基础上加以增强功能形成的。ECT模块主要由以下…

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)

  1. #include/*commondefinesandmacros*/
  2. #include”derivative.h”/*derivative-specificdefinitions*/
  3. #include”sci.h”
  4. voidECTInit(void)
  5. {
  6. TSCR2_PR=7;//prescalefactoris8,busclock/128=8MHz/128=64KHz
  7. TSCR2_TOI=1;//timeroverflowinterruptenable
  8. TSCR1_TEN=1;//timerenable
  9. }
  10. voidmain(void)
  11. {
  12. SCIInit();
  13. SCISetBaudRate(SCI0,9600,8192000L);
  14. ECTInit();
  15. EnableInterrupts;
  16. for(;;)
  17. {
  18. _FEED_COP();/*feedsthedog*/
  19. }/*loopforever*/
  20. }
  21. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
  22. {
  23. TFLG2_TOF=1;//cleartimeroverflowflag
  24. SCIPutChar(SCI0,x);
  25. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/264160.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部