微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Freescale 9S12 系列单片机应用笔记(ECT 模块) 1

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

时间:11-20 来源:互联网 点击:
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. }


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top