目录
一、实验介绍
CC2530定时器1 是一个独立的16 位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现。
定时器1 的功能如下:
- 五个捕获
- 上升沿、下降沿或任何边沿的输入捕获
- 设置、清除或切换输出比较
- 自由运行、模或正计数/倒计数操作
- 可被1,8,32 或128 整除的时钟分频器
- 在每个捕获/比较和最终计数上生成中断请求
- DMA 触发功能
二、实验目的
- 通过本实验了解CC2530 的T1定时器的相关寄存器配置;
- 通过本实验了解CC2530的T1定时器功能的运用。
三、实验设备
3.1、硬件设备
- ZIGBEE开发板
- SmartRF04EB仿真器
3.2、软件环境
- IAR Embedded Workbench for 8051集成开发环境
四、实验原理
4.1、计数器
定时器1有5个通道,定时器2为睡眠定时器,定时器3和定时器4只有2个通道。
定时器包括一个16位计数器。计数器可以作为一个自由运行计数器、模计数器、正计数/倒计数器运行,用于中心对齐的PWM。
在定时器1中,可以通过两个8位的SFR读取16位的计数器值,分别是T1CNTH和T1CNTL,分别包含在高位字节和低位字节。
在定时器1中由T1CTL寄存器设置分频器值,分频器值可以从1、8、32、128中选择。当达到最终计数值(溢出)时,计数器产生一个中断请求。当T1CTL后2位写入00时计数器暂停计数;写入非00时计数器开始计数。
4.2、操作模式
4.2.1、自由运行模式
计数器从0x0000开始计数,每个活动时钟边沿加1,当计数值达到0xFFFF(溢出)时,计数器写入0x0000,继续计数。
当达到最终计数值(0xFFFF)时,IRCON寄存器的第1位和T1STAT寄存器的第5位置1。若设置了中断则对应产生一个中断请求。
自由运行模式可以用于产生独立的时间间隔,输出信号频率。
4.2.2、模模式
计数器从0x0000开始计数,当计数值达到T1CC0(溢出)时,寄存器T1CC0H:T1CC0L保存最终计数值,计数值复位到0x0000,继续计数。
如果计数值开始于大于T1CC0值的一个数,则当达到0xFFFF时,IRCON寄存器的第1位和T1STAT寄存器的第5位置1。若设置了中断则对应产生一个中断请求。
模模式可以用于周期不是0xFFFF的应用程序。
4.2.3、正计数/倒计数模式
计数器从0x0000开始,当计数器正计数到T1CC0值时,计数器从T1CC0值倒计数到0x0000。
当达到最终计数值时,IRCON寄存器的第1位和T1STAT寄存器的第5位置1。若设置了中断则对应产生一个中断请求。
正计数/倒计数模式用于周期必须是对称输出脉冲而不是0xFFFF的应用程序。
4.3、通道模式
4.3.1、输入捕获模式
配置为输入捕获的通道对应的IO口必须配置为输入模式,且为定时器1的外设引脚。
定时器启动后,任何一个边沿都触发一个捕获,所以定时器可以捕获一个外部事件发生的时间。
4.3.2、输出比较模式
配置为输入比较的通道对应的IO口必须配置为输出模式。
定时器启动后,如果比较寄存器T1CCnH:T1CCnL的内容等于计数器内容,输出引脚根据T1CCLn寄存器第5-3位内容执行。
4.4、相关寄存器
4.4.1、T1CNTH和T1CNTL
用于存储定时器1的计数器值,T1CNTH存储计数器高8位值,T1CNTL存储低8位值。
当读取T1CNTL时,计数器的高位字节在那时被缓冲到T1CNTH,以便高位字节可以从T1CNTH中读出,因为T1CNTL必须总是在读取T1CNTH之前首先读取。

4.4.2、T1CTL
T1CTL后2位可以用来设置启动或停止计数器,以及用来设置定时器的操作模式。
第2位和第3位用来设置分频器的划分值,如写入11设置为128分频。

4.4.3、T1STAT
T1STAT寄存器用于设置定时器1各通道中断设置,如同打开中断。寄存器第5位如同总中断。第0位改为定时器1通道0中断标志。

4.4.4、IRCON
IRCON寄存器的第1位为定时器1的中断标志。当检测到第1位为1时,说明定时器1触发中断。

4.4.5、T1CCTL0
当配置为输出比较模式,定时器启动后,如果比较寄存器T1CCnH:T1CCnL的内容等于计数器内容,输出引脚根据T1CCLn寄存器第5-3位内容执行。

4.5、溢出时间计算
系统在不配置时默认工作频率为16MHz,经过本实验配置的128分频,工作频率为:
16
M
128
=
0.125
M
H
z
\frac{16M}{128}=0.125MHz
12816M=0.125MHz
定时器为此溢出时间:
T
=
1
0.125
M
H
z
×
65536
=
0.524288
≈
0.5
s
T=\frac{1}{0.125MHz} \times 65536=0.524288 \approx 0.5s
T=0.125MHz1×65536=0.524288≈0.5s
其中
1
0.125
M
H
z
\frac{1}{0.125MHz}
0.125MHz1是每个工作频率为16MHz且128分频的时钟周期,当定时器溢出时有0xFFFF(溢出)个周期。
五、实验演示
本次实验演示的是利用定时器实现LED1在1s内更换状态。
首先是分别创建timer1.c和timer1.h文件。
在timer1.c内,我们要配置定时器1每0.5s计数一次,回顾4.5内容可以清楚设置工作频率为16MHz且设置128分频。由于系统在不配置时默认工作频率为16MHz,所以我们只需要设置定时器1实现128分频,而设置定时器1实现128分频是通过配置T1CTL寄存器来实现。

我们仅需在T1CTL寄存器的第3位和第2位写入11,另外我们只需要简单的计数,所以只需将定时器1配置为自由运行模式,即在T1CTL寄存器的第1位和第0位写入01。
要想实现定时器1每记一次数就改变LED1的状态,只需打开定时器1的一个通道的中断,每次计数器值加1时进入一次中断,而用于管理该中断的是T1STAT寄存器。

如果我们设置的是通道0的中断,需要将T1STAT寄存器的第0位写入1,此外我们还需要开启定时器1的总中断,即将T1STAT寄存器的第5位写入1。
综上所述,定时器的初始化就配置好了,下面我们把timer1.c的内容写在下面:
#include "headfile.h"
void timer1_init(void)
{
T1CTL |= 0x0d; //0000 1101 128分频 自动运行模式
T1STAT |= 0x21; //0010 0001 开启通道0中断。
}
对应的更新timer1.h文件就好了。
#ifndef __TIMER1_H__
#define __TIMER1_H__
#include "headfile.h"
void timer1_init(void);
#endif
记得在headfile.h文件内包含timer1.h文件。
前面我们讲到开启定时器1中断,而如何判断是否进入中断就需要查看IRCON寄存器对应位。

也就是说,当我们检测到IRCON寄存器的第1位为1时,说明我们设置的定时器1进入中断。
需要注意到是,每次进入中断后要清除中断标志位,以便下一次进入中断。
这里直接把main.c内的程序写在下面:
#include "iocc2530.h" //头文件
#include "headfile.h"
void main(void)
{
led_init();
timer1_init();
while(1)
{
if(IRCON & 0x02) //判断是否进入中断
{
IRCON = 0; //清除中断标志位
LED1 = !LED1; //实现led1亮灭交替
}
}
}
有疑问可以加入QQ群交流:324611467
3660

被折叠的 条评论
为什么被折叠?



