实验二: Timer定时应用实验
2.1实验目的
1. 认识并了解 CC2530 定时器;
2. 学习定时器的基本配置与应用;
3. 在 ZigBee 模块上运行定时器程序。
2.2实验原理
根据数据手册可知 CC2530 总共有 4 个定时器,但是定时器 2 被系统占用,可用的只有三个,分别为 定时器 1、3、4。其中定时器 3 和定时器 4 是两个 8 位定时器,定时器 1 是一个独立的 16 位定时器,本 节主要介绍基于定时器 1 的定时应用。定时器的一个很重要的概念是操作模式,该模式包含自由运行模 式(free-running)、模模式(modulo)和正计数/倒计数模式(up-down)。以下为摘自 CC2530 中文手册 关于 3 种模式的介绍:
在自由运行操作模式下,计数器从 0x0000 开始,每个活动时钟边沿增加 1。 当计数器达到 0xFFFF 时(溢出),计数器载入 0x0000,继续递增它的值,如图 3.2.1 所示。当达到终计数值 0xFFFF,设置 标志 IRCON.T1IF 和 T1STAT.OVFIF。如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将产生 一个中断请求。自由运行模式可以用于产生独立的时间间隔,输出信号频率。
当定时器运行在模模式时,16 位计数器从 0x0000 开始,每个活动时钟边沿增加 1。当计数器的计数 值达到 T1CC0 时溢出。寄存器 T1CC0H 与 T1CC0L 保存的终计数值将复位到 0x0000,并继续递增。如果 定时器开始于T1CC0以上的一个值,当达到终计数值(0xFFFF)时,设置标志IRCON.T1IF和 T1CTL.OVFIF。 如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将产生一个中断请求。该模式可以用于周期不是 0xFFFF 的应用程序。计数器的操作展示在图 3.2.2 中。
在正计数/倒计数模式,计数器反复从 0x0000 开始,正计数直到达到 T1CC0H 与 T1CC0L 保存的值。 然后计数器将倒计数直到 0x0000,如图 3.2.3 所示。这个定时器用于周期必须是对称输出脉冲而不是 0xFFFF 的应用程序,因此允许中心对齐的 PWM 输出应用的实现。在正计数/倒计数模式,当达到终计 数值时,设置标志 IRCON.T1IF 和 T1CTL.OVFIF。如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将产生一个中断请求。
由以上三种模式的比较可以得出:自由运行模式的溢出值为 0xFFFF 不可变;而其他两种模式则通过 对 T1CC0 赋值,以精确控制定时器的溢出值。
本实验通过对 CC2530 内部定时器 T1 的配置与使用,实现对 ZigBee 模块上的 LED 灯以 1 秒为时间单 位进行均等时间的定时闪烁,即让模块上的 LED 指示灯实现 0.5s 亮与 0.5s 灭,它们亮灭的时间是均等 的。这种均等的时间实现效果正是由 CC2530 的内部定时器 T1 来实现的。
2.2.1 电路分析与程序配置
本节使用 CC2530 的定时器 1 来实现对 LED 的定时闪烁时间控制,所使用的原理图与 3.1 节的一致,即:D4 所对应的 I/O 为 P1_0,D2 所对应的 I/O 为 P1_1,D3 所对应的 I/O 为 P1_2,本实验选择 P1_0, P1_1 和 P1_2 I/O 引脚,P1_0 控制模块上的 LED 灯 Status/Data,P1_1 控制模块上的 LED 灯 Net,P1_2 控制模块上的 LED 灯 User1。故在软件上只要配置好 P1_0,P1_1,P1_2 并初始化好定时器 1 即可。
本次实验学习到的新寄存器:
T1CTL:定时器 1 的控制寄存器。D1、D0 控制运行模式;D3、D2 设置分频值。
T1STAT:定时器 1 的状态寄存器,D4~D0 为通道 4~通道 0 的中断标志,D5 为溢出标志位,当计数到 终计数值时自动置 1。
IRCON:中断标志寄存器;0 为无中断请求。1 为有中断请求。
IEN1:中断允许寄存器 1
2.3 实验步骤
1. 正确连接 ZB-LINK 调试器到 PC 机和 ZigBee 模块,可参考第 1 章的 1.3 节进行连接;
2. 打开:【配套光盘04-实验例程02-ZigBee技术与应用第三章 CC2530基础功能实验3.2 Timer 定时应用实验实验代码】中的实验工程:“timer.eww”,选择 Project→Rebuild All 重新编译 工程;
3. 选择 Project→Download and debug 将程序下载到 ZigBee 模块,下载完成后点
退出;
4. 按下 ZB-LINK 调试器的复位按钮让刚才下载的程序重新运行。
2.4实验源码
#include <ioCC2530.h> //引入CC2530所对应的头文件(包含各SFR的定义)
#include "sys_init.h"uint counter=0; //统计溢出次数/*主函数-------------------------------------------------------*/
void main()
{led_init(); //LED初始化 time1_init(); //T1中断初始化while(1);
}/*中断服务子程序-------------------------------------------------------*/
#pragma vector = T1_VECTOR __interrupt void T1_ISR(void) { EA=0; //关总中断 counter++;if(counter>15) //0.5s时间{counter=0; D4 = !D4;D2 = !D2;D3 = !D3;}T1IF=0; //清中断标志EA=1; //开总中断 }
2.5 实验结果与分析
程序运行后,会发现 ZigBee 模块上的所有 LED 指示灯在定时器 1 的作用下开始以1秒为周期,0.5s 为亮灭时间间隔的方式不停地闪烁,从而达到了本节实验所要求的实验效果。