飞思卡尔单片机 ECT学习资料.docx

上传人:b****6 文档编号:3906074 上传时间:2022-11-26 格式:DOCX 页数:25 大小:823.46KB
下载 相关 举报
飞思卡尔单片机 ECT学习资料.docx_第1页
第1页 / 共25页
飞思卡尔单片机 ECT学习资料.docx_第2页
第2页 / 共25页
飞思卡尔单片机 ECT学习资料.docx_第3页
第3页 / 共25页
飞思卡尔单片机 ECT学习资料.docx_第4页
第4页 / 共25页
飞思卡尔单片机 ECT学习资料.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

飞思卡尔单片机 ECT学习资料.docx

《飞思卡尔单片机 ECT学习资料.docx》由会员分享,可在线阅读,更多相关《飞思卡尔单片机 ECT学习资料.docx(25页珍藏版)》请在冰豆网上搜索。

飞思卡尔单片机 ECT学习资料.docx

飞思卡尔单片机ECT学习资料

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

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

∙一个带可编程预分频的16位向上计数的自由运行计数器

∙8个独立的定时器通道,每个通道具备输入捕捉/输出比较功能

∙4个8位脉冲累加器,也可设置成2个16位脉冲累加器

∙一个带可编程预分频的16位的向下计数的计数器

    从上面示意图中可以就看出,ECT 模块相当的复杂,不是简单的几句话就能说明白的。

我也是通过很长时间的学习实践,才逐步掌握了ECT模块的使用。

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

一步一步的展示ECT 模块的强大功能。

实验1:

自由运行计数器(TCNT)与溢出中断

    自由运行计数器(TCNT)也称为自由运行主定时器,是一个16位的计数器,可以说是ECT的核心。

在系统复位时,这个自由运行计数器的初值为$0000。

当ECT 模块运行时,自由运行计数器从$0000~$FFFF 循环递增计数。

当计数器溢出复零时,会置位中断标志。

利用这个计数器,可以产生一个周期的中断信号。

TCNT 的输入时钟也是可以选择的,图2 给出了TCNT 的时钟源的示意图。

可以看出,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)

[cpp] viewplaincopy

1.#include       /* common defines and macros */  

2.#include "derivative.h"      /* derivative-specific definitions */  

3.#include "sci.h"  

4.  

5.void ECTInit(void)   

6.  

7.{  

8.   TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8MHz/128=64KHz  

9.   TSCR2_TOI  = 1;  //timer overflow interrupt enable  

10.   TSCR1_TEN  = 1;  //timer enable  

11.}  

12.  

13.void main(void)   

14.{  

15.  SCIInit();  

16.  SCISetBaudRate (SCI0, 9600, 8192000L);  

17.  ECTInit();  

18.  EnableInterrupts;  

19.  for(;;)   

20.  {  

21.   _FEED_COP(); /* feeds the dog */  

22.  } /* loop forever */  

23.  

24.}  

25.  

26.  

27.interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void)   

28.{  

29.   TFLG2_TOF  = 1;  //clear timer overflow flag  

30.   SCIPutChar(SCI0, 'x');  

31.} 

实验2:

输出比较功能(Output Compare)

    所谓输出比较功能就是根据需要设置输出比较寄存器的值,自由运行计数器的值与输出比较寄存器的值每隔4个总线周期比较一次,当两者相等时,会在规定的通道引脚上输出预定的电平。

如果允许中断,会产生一次输出比较中断。

相应需要操作的寄存器有如下几个:

TCx 寄存器(Timer Input Capture/Output Compare 0-7)

总共8个16位寄存器,分别对应8个输出比较通道。

当 TCx = TCNT 时满足输出比较条件,这时根据程序设置在对应输出管腿输出特定的电平(具体方法见TCTL1/TCTL2 寄存器的功能设置)或者产生对应的中断事件。

TIOS寄存器(Timer Input Capture/Output Compare Select)

用来设定某一通道是输入捕捉功能还是输出比较功能。

IOSx = 1 对应位为输出比较功能,IOSx = 0 对应位为输入捕捉功能。

图 7 TIOS寄存器

TIE寄存器(Timer Interrupt Enable Register)

其中某一位置 1 后则使能相应的通道的中断,这里控制的中断既包括输出比较中断也包括后面要介绍的输入捕捉中断。

 

图 8 TIE寄存器

TCTL1/TCTL2 寄存器(Timer Control Register 1/2)

用来决定输出比较时的输出模式和输出电平。

具体参见表格 1。

表格 1 输出比较动作

OMx

OLx

动作

0

0

不输出

0

1

每次翻转OCx 的电平

1

0

OCx = 0

1

1

OCx = 1

 

图 9 TCTL1/TCTL2 寄存器

TFLG1寄存器(Main Timer Interrupt Flag 1)

用来标识中断条件发生了,对某一位写1则清除对应位。

图10TFLG1寄存器

有了这些就可以开始第二个例子了。

第二个例子利用通道0和通道1的输出比较功能。

在 TCNT = TC0 时将对应的PT0 管腿的输出电平翻转,并且产生相应中断。

在 TCNT = TC1时将对应的PT1 管腿的输出电平翻转,并且产生相应中断。

这样,PT0和PT1 就会输出两个具有恒定相位差的同频方波信号了。

[cpp] viewplaincopy

1.#include       /* common defines and macros */  

2.#include "derivative.h"      /* derivative-specific definitions */  

3.#include "sci.h"  

4.  

5.void ECTInit(void)   

6.{  

7.    //TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8  

8.    TSCR2_TOI  = 1;  //timer overflow interrupt enable  

9.    TSCR1_TEN  = 1;  //timer enable  

10.      

11.    TIOS_IOS0 = 1; // channel 0 as output compare  

12.    TIOS_IOS1 = 1; // channel 1 as output compare  

13.    TC0 = 10000;  

14.    TC1 = 20000;  

15.    TIE_C0I = 1;  // 使能 channel 0 中断  

16.    TIE_C1I = 1;  // 使能 channel 1 中断  

17.      

18.    TCTL2_OL0 = 1;  

19.    TCTL2_OM0 = 0;  

20.      

21.    TCTL2_OL1 = 1;  

22.    TCTL2_OM1 = 0;  

23.}  

24.void main(void)   

25.{  

26.    SCIInit();  

27.    SCISetBaudRate (SCI0, 9600, 8192000L);  

28.    ECTInit();  

29.    DDRM_DDRM0 = 1;  

30.    DDRM_DDRM1 = 1;  

31.    DDRM_DDRM2 = 1;  

32.    EnableInterrupts;  

33.      

34.    for(;;)   

35.    {  

36.        _FEED_COP(); /* feeds the dog */  

37.    } /* loop forever */  

38.}  

39.                         

40.                  

41.interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void)   

42.{  

43.    TFLG2 = TFLG2_TOF_MASK;  //clear timer overflow interrupt flag  

44.    PTM_PTM0 = ~ PTM_PTM0;  

45.}  

46.  

47.interrupt VectorNumber_Vtimch0 void ECT_0_ISR(void)   

48.{  

49.    unsigned int value;  

50.      

51.    TFLG1 = TFLG1_C0F_MASK;   //clear channel 0 interrupt flag  

52.    PTM_PTM1 = ~ PTM_PTM1;  

53.}  

54.interrupt VectorNumber_Vtimch1 void ECT_1_ISR(void)   

55.{  

56.    TFLG1 = TFLG1_C1F_MASK;    //clear channel 1 interrupt flag  

57.    PTM_PTM2 = ~ PTM_PTM2;  

58.}  

59.interrupt VectorNumber_Vtimch7 void ECT_7_ISR(void)   

60.{  

61.    TFLG1 = TFLG1_C7F_MASK;    //clear channel 7 interrupt flag  

62.} 

下面是用 USBee 抓下来的波形图。

Port M 0 是在溢出中断中翻转的。

PT0 、PT1分别对应两个输出比较通道,两个上升沿的时间间隔为 1/8192=1.22ms,测量结果与理论值完全相同。

 

下面将程序做一个很小的修改。

将 TC0 和 TC1 的值改成相同的。

[cpp] viewplaincopy

1.void ECTInit(void)   

2.{  

3.    //TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8  

4.    TSCR2_TOI  = 1;  //timer overflow interrupt enable  

5.    TSCR1_TEN  = 1;  //timer enable  

6.      

7.    TIOS_IOS0 = 1; // channel 0 as output compare  

8.    TIOS_IOS1 = 1; // channel 1 as output compare  

9.    TC0 = 10000;  

10.    TC1 = 10000;  

11.    TIE_C0I = 1;  // 使能 channel 0 中断  

12.    TIE_C1I = 1;  // 使能 channel 1 中断  

13.      

14.    TCTL2_OL0 = 1;  

15.    TCTL2_OM0 = 0;  

16.      

17.    TCTL2_OL1 = 1;  

18.    TCTL2_OM1 = 0;  

19.} 

 

 

从波形图中可以看出,输出是正常的。

但是有些低版本的 ECT 模块有些问题,在这种情况下只有 通道 0 的中断能够响应,通道1的中断无法响应。

实验3:

输出比较 7 通道的特殊功能

    输出比较通道OC7 具有特殊的权限,可以废止其他输出比较通道的动作,直接决定各个输出通道的状态。

这种特权功能是通过配置两个额外的寄存器OC7M和OC7D来实现的。

OC7M寄存器(Output Compare 7 Mask Register)

使OC7Mx=1,OC7强行参与管理通道x的输出,但通道OC7 对通道OC0~OC6的管理仅限于使其引脚PT0~PT6 清0或置1,不能将引脚电平翻转,引脚的动作来自于输出比较7数据寄存器OC7D中的对应位OC7Dx定义的电平状态,必须事先通过程序设置。

图 11 OC7M寄存器

OC7D寄存器(Output Compare 7 Data Register)

OC7Dx=0,则对应事件发生时相应PTx位将被输出为低电平,OC7Dx=1,则对应事件发生时相应PTx位将被输出为高电平。

图 12 OC7D寄存器

可以开始我们的实验了。

这个实验将在PT0 管腿上输出一个占空比位1/4 的方波。

实现方法为在 TCNT = 10000 时将 PT0 置为高电平,TCNT = 26384 时将PT0 置为低电平。

下面是程序片段。

[cpp] viewplaincopy

1.

#include       /* common defines and macros */  

2.#include "derivative.h"      /* derivative-specific definitions */  

3.#include "sci.h"

void ECTInit(void)   

4.{  

5.    //TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8  

6.      

7.    TIOS_IOS0 = 1; // channel 0 as output compare  

8.    TC0 = 10000;

    TCTL2_OL0 = 1;  

9.    TCTL2_OM0 = 1; // 使 channel 0 输出高电平  

10.          

11.    TIOS_IOS7 = 1; // channel 7 as output compare  

12.    TC7 = 26384;  

13.    //TIE_C7I = 1;  // 使能 channel 7 中断  

14.      

15.    OC7M_OC7M0 = 1;  

16.    OC7D = 0;      // 使 channel 0 输出低电平  

17.      

18.    TCTL1_OL7 = 0;  

19.    TCTL1_OM7 = 0;  

20.      

21.    TSCR2_TOI  = 1;  //timer overflow interrupt enable  

22.    TSCR1_TEN  = 1;  //timer enable      

23.}  

24.void main(void)   

25.{  

26.    SCIInit();  

27.    SCISetBaudRate (SCI0, 9600, 8192000L);  

28.    ECTInit();  

29.    DDRM_DDRM0 = 1;  

30.    EnableInterrupts;  

31.      

32.    for(;;)   

33.    {  

34.        _FEED_COP(); /* feeds the dog */  

35.    } /* loop forever */  

36.}  

37.                  

38.                  

39.interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void)   

40.{  

41.    TFLG2 = TFLG2_TOF_MASK;  //clear timer overflow interrupt flag  

42.    PTM_PTM0 = ~ PTM_PTM0;  

43.}

interrupt VectorNumber_Vtimch0 void ECT_0_ISR(void)   

44.{  

45.      

46.    TFLG1 = TFLG1_C0F_MASK;   //clear channel 0 interrupt flag  

47.}  

48.interrupt VectorNumber_Vtimch1 void ECT_1_ISR(void)   

49.{  

50.    TFLG1 = TFLG1_C1F_MASK;    //clear channel 1 interrupt flag  

51.}  

52.

 

 

利用这种方式可以模拟个 PWM 功能出来。

不过模拟出来的PWM周期只有8种选择。

在第一篇应用笔记中,我提到过TCSR2寄存器有一位叫 TCRE。

TCRE 位是 Timer Counter Reset Enable 的简写。

TCRE 位为 0表示TCNT自由运行,TCRE 位为1表示当TCNT = OC7 时复位。

下面将给出一个利用 TCRE的例子。

同样是占空比25%,但是同时还调整了波形的周期。

这个例子中,TC0 = 1000, TC7 = 4000。

PT0 在1000时翻转一下,在4000时再翻转一下。

同时4000时将TCNT值复位到0重新计数。

这样波形的频率就成了 4000/8192000=4.88ms。

[cpp] viewplaincopy

1.void ECTInit(void)   

2.{  

3.    TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8  

4.      

5.    TIOS_IOS0 = 1; // channel 0 as output compare  

6.    TC0 = 1000;  

7.    TIE_C0I = 1;  // 使能 channel 0 中断  

8.    TCTL2_OL0 = 1;  

9.    TCTL2_OM0 = 1; // 使 channel 0 输出高电平  

10.          

11.    TIOS_IOS7 = 1; // channel 7 as output compare  

12.    TC7 = 4000;  

13.    TIE_C7I = 1;  // 使能 channel 7 中断  

14.    TCTL1 = 0x40;  

15.      

16.    OC7M_OC7M0 = 1;  

17.    OC7D = 0;      // 使 channel 0 输出低电平  

18.      

19.    TCTL1_OL7 = 0;  

20. 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1