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

转载自:https://blog.csdn.net/liyuanbhu/article/details/7626636

9S12 系列单片机的ECT (Enhanced Capture Timer Module)模块是在原68HC12 的 Standard Timer module 基础上加以增强功能形成的。

ECT 模块主要由以下几部分组成,参看图1:

  • 一个带可编程预分频的16位向上计数的自由运行计数器
  • 8个独立的定时器通道,每个通道具备输入捕捉/输出比较功能
  • 4个8位脉冲累加器,也可设置成2个16位脉冲累加器
  • 一个带可编程预分频的16位的向下计数的计数器

图 1 ECT 模块结构示意图

从上面示意图中可以就看出,ECT 模块相当的复杂,不是简单的几句话就能说明白的。我也是通过很长时间的学习实践,才逐步掌握了ECT模块的使用。

本文将通过一系列的实例,从最简单的功能开始,逐步展开。一步一步的展示ECT 模块的强大功能。

实验1:自由运行计数器(TCNT)与溢出中断

自由运行计数器(TCNT)也称为自由运行主定时器,是一个16位的计数器,可以说是ECT的核心。在系统复位时,这个自由运行计数器的初值为$0000。当ECT 模块运行时,自由运行计数器从$0000~$FFFF 循环递增计数。当计数器溢出复零时,会置位中断标志。利用这个计数器,可以产生一个周期的中断信号。

TCNT 的输入时钟也是可以选择的,图2 给出了TCNT 的时钟源的示意图。可以看出,TCNT的输入时钟可以来源于总线时钟、总线时钟经过预分频、外部引脚输入的脉冲、外部引脚输入脉冲经过脉冲累加器分频这四种选择。当然,选择哪个时钟源其实就是在程序中设置一下相应的寄存器这么简单。

图 2 TCNT 的时钟源

了解了上面的介绍,就可以开始本文的第一个例子了,这个例子非常简单,将BUS CLOCK 分频后作为TCNT 的输入时钟,使能 TCNT 溢出中断。

在开始代码之前,还需要介绍几个程序中用到的寄存器。

TCNT寄存器(Timer Count Register)

这个寄存器其实已经介绍过了,它是一个16 位的只读寄存器。在每个时钟输入下计数值会自动加1,当计数值为 0xFFFF 后下一个时钟脉冲会使计数器溢出为 0x0000。程序中可以随时读取 TCNT 的值,唯一需要注意的是 TCNT 是个16位的寄存器,读取时要一次将其读出,如果分为高低两个字节读取,读到的数据不一定能拼接成一个有效的计数值。

图 3 TCNT 寄存器

TFLG2寄存器 (Main Timer Interrupt Flag 2)

这个寄存器只有最高位TOF 是有意义的。当TCNT 溢出时会置位 TOF 位,程序中可以轮询这一位来判断TCNT 是否溢出了。当然这种轮询的方法效率很低,更实用的方法是利用 TCNT 溢出中断。向TOF 位写 1 会清除TOF,在 TCNT 溢出中断中就必须清除 TOF,否则就不会响应下一次溢出中断。

图 4 TFLG2 寄存器

TSCR2 寄存器(Timer System Control Register 2)

这个寄存器由三部分功能组成。

TOI 位是 Timer Overflow Interrupt Enable 的简写。TOI 位为 0时表示禁止 TCNT 溢出中断,这时只能通过轮询 TOF 位来判断是TCNT计数器是否溢出了。TOI 位为 1 表示使能 TCNT溢出中断。

TCRE 位是 Timer Counter Reset Enable 的简写。TCRE 位为 0表示TCNT自由运行,TCRE 位为1表示当TCNT = OC7 时复位。

PR2、PR1、PR0 是总线时钟的预分频因子。当 PR2-0 组成的三位 2进制数为 N 时,表示将 BUS CLOCK 分频 2^N。

图 5 TSCR2 寄存器

TSCR1寄存器(Timer System Control Register 1)

TEN 位为0时 ECT模块被禁用。TEN 位为1时 ECT模块被使能。

TSWAI(Timer Module Stops While in Wait) 位为0时,ECT 模块在 STOP 模式下仍旧运行。TSWAI位为1时,ECT 模块在 STOP 模式停止运行。

TSFRZ (Timer and Modulus Counter Stop While in Freeze Mode),这一位与 TSWAI 位类似。

TFFCA (Timer Fast Flag Clear All)我还没仔细研究,作用不明。

图 6 TSCR1 寄存器

有了上面这些介绍,就可以很容易的看懂下面的代码了。在我的实验板上,晶振频率为16.384MHz,因为没有开启PLL,BUS CLOCK 为8.192MHz,内核频率为16.384MHz。8.192MHz被128预分频后为 64KHz,16位计数器溢出频率为0.98Hz(64000/65536)

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "sci.h"
 

    void ECTInit(void) 
     
    {
       TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8MHz/128=64KHz
       TSCR2_TOI  = 1;  //timer overflow interrupt enable
       TSCR1_TEN  = 1;  //timer enable
    }
     
    void main(void) 
    {
      SCIInit();
      SCISetBaudRate (SCI0, 9600, 8192000L);
      ECTInit();
      EnableInterrupts;
      for(;;) 
      {
       _FEED_COP(); /* feeds the dog */
      } /* loop forever */
     
    }
     
     
    interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void) 
    {
       TFLG2_TOF  = 1;  //clear timer overflow flag
       SCIPutChar(SCI0, 'x');
    }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值