上一篇,我们一起学习了简单的外部中断的实现。有了对中断的实践经验后,我们这一节来讨论一下定时器中断。CC2430共有4个定时器,可分3类:定时器1、定时器2、定时器3/4(3与4的用法一致)。
由于笔者也是刚刚接触CC2430,涉及定时器的项目实战经验基本为零,所以不打算(也无能为力)深入剖析定时器。本篇仅就定时器1的计数溢出中断用法做简单的实验性探索,对于其输入捕获/输出比较/PWM功能则略去不提。定时器2、定时器3/4也只做简单的功能介绍。等笔者的功力达到一定火候之后,再来站在Zigbee实战经验的高度来完善本篇随笔。
定时器1是一个16位定时器,具有定时器/计数器/脉宽调制功能。它有3个单独可编程 输入捕获/输出比较 信道,每一个信道都可以用来当做PWM输出或用来捕获输入信号的边沿时间(关于什么是输入捕获/输出比较,以及如何实现PWM输出,读者可自行查阅CC2430中文手册)。
定时器有一个很重要的概念:操作模式。
操作模式包含: 自由运行模式(free-running)、 模模式(modulo)和 正计数/倒计数模式(up-down)。
下面是摘自CC2430中文手册对3种模式的介绍:
比较三种模式可以看出:自由运行模式的溢出值为0xFFFF不可变;而其他两种模式则可通过对T1CC0赋值,以精确控制定时器的溢出值。本实验正是利用此特性,通过特定的T1CC0,使定时器每隔1s触发一次中断,从而精确控制LED灯的闪烁间隔为1s。
在定时器的modulo模式下,精确控制LED灯的闪烁间隔为1s,即:亮0.5s → 暗0.5s → 亮0.5s → 暗0.5s ...... → 亮0.5s → 暗0.5s(即从暗转亮的时刻间隔为1s)。亮/暗的反转通过溢出中断来实现。
前面已提到,LED灯的状态为:亮0.5s → 暗0.5s → 亮0.5s → 暗0.5s ...... → 亮0.5s → 暗0.5s,而且需用溢出中断实现,因此要求定时器的溢出周期为0.5s。为此,需要计算出相应的溢出值(暂设为N)。
系统时钟频率选为32MHz,提供给定时器的时钟频率默认为16MHz(两者都由特殊功能寄存器 CLKCON 来配置,具体可查阅CC2430中文手册)。
对于定时器1,设置其时钟分频为128分频。
综上所述,可列式如下:
求出N=62500,其十六进制为 0xF424,即需要设置 T1CC0H=0xF4,T1CC0L=0x24 即可 。
OK,编译程序并在线调试,开发板上的LED1如期闪烁起来,感觉闪烁间隔大概在1s。但这还不足以证明实验的成功,若能严格测定间隔为1s就完美了~ 于是我打开WIN 7的时钟(点击任务栏右边的时间即可)。一边看着秒针,一边用眼角余光瞄着LED1的闪烁。结果是:在两分钟内,两者的步调基本完全一致(这种精度还可以容忍~)。到此,实验才可以说基本完工,嘿嘿~
定时器2又称 MAC定时器,是专门为支持IEEE 802.15.4 MAC 中的事件跟踪协议而特别设计的。该定时器具有一个可以用来记录已经发生的周期数的8位溢出计数器;有一个16位捕获寄存器,用来记录一个帧开始定界符接收/发送的精确时间或者传输完成的精确时间;还含有一个16位输出比较寄存器,用来在特定时间对无线模块产生各种命令选通信号(开始接受,开始发送等)。
定时器3/4是8位定时器,具有定时器/计数器/PWM功能。T3/T4有2个输出比较信道,每个信道都可用来当做PWM输出。
本节主要学习了定时器1的计数溢出中断的方法,实现了精确控制LED灯闪烁间隔为1s。对其他几个定时器只是一笔带过,以后再回头补充。下一节,我们来介绍关于CC2430串口通信的相关内容。
下一节:Zigbee之旅(五):几个重要的CC2430基础实验——串口通信(未完成)