第二部分 基础篇-第4章 定时器 - CC2530查询方式使用定时器T1
1 理论分析
1.1 CC2530 的 Timer1 介绍
定时器 1 是一个独立的 16 位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和 PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个 I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现。
定时器 1 的功能如下:
五个捕获/比较通道
上升沿、下降沿或任何边沿的输入捕获
设置、清除或切换输出比较
*运行、模或正计数/倒计数操作
可被 1,8,32 或 128 整除的时钟分频器
在每个捕获/比较和最终计数上生成中断请求
DMA 触发功能
图1是 CC2530 的 Timer1 的所有功能图,在 CC2530 的 Timer1 的所有功能中,我们用得最多的就是:
定时器 1 操作(查询方式)
定时器 1 中断
其中,16 位计数器将会在红外解码(VS1838)里讲解;定时器 1 操作(查询方式) 就在本实验里讲解;定时器 1 中断将会下一讲里讲解。
最后说明一下,就是 CC2530 的 Timer1 的使用,都是要通过配置相应的寄存器来实现相应功能的,故在附录里我们给出操作 Timer1 的所有寄存器的类型及其具体内容。
2 实验详解
2.1实验目的
1)、通过实验掌握CC2530 芯片GPIO 的配置方法
2)、掌握Led 驱动电路及开关Led 的原理
3)、掌握定时器T1 的配置与使用
2.2实验设备
硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:2000/XP/win7 系统,IAR 8.10 集成开发环境
2.3实验相关电路图
2.4 实验相关寄存器
(1) 首先,CC2530 的 Timer1 用于查询方式时,需要配置的寄存器有:T1CTL;而溢出标志 IRCON 是我们用于查询的。
(2) 然后,由于 CC2530 在没有配置工作时钟时默认是 2 分频,即系统将工作时钟为 16MHz。所以我们希望 Timer1 配置为:128 分频;*运行,从 0x0000 到 0xFFFF反复计数;所以,根据 T1CTL、T1STAT 的定义,控制字应该为:
T1CTL = 0x0d; //128 分频;*运行,从 0x0000 到 0xFFFF 反复计数;
需要配置三个寄存器T1CTL、T1STAT、IRCON。如表1、2、3所示:
T1STAT(0xAF)-定时器1状态
按照表格寄存器的内容,对Led1 和T1 进行配置。
Led1 配置如下:
P1SEL &=~0x01; //配置P1.0 为通用IO 口
P1DIR |= 0x01; //配置P1.0 为输出
T1 配置如下:
T1CTL = 0x0d; //128 分频,自动重装0x0000-0xFFFF
T1STAT= 0x21; //通道0,中断有效
注意: 系统在不配置工作频率时默认为 2 分频,即 32M/2=16M,所以定时器每次溢出时间 T=1/(16M/128)*65536≈0.5s, 所以总时间 Ta=T*count=0.5*1=0.5S 切换 1 次状态。 所以看起来是 1S 闪烁 1 次。
2.5参考代码
/**Includes*********************************************************************/
#include <ioCC2530.h>
/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
#define uchar unsigned char
//定义控制LED灯的端口
#define LED1 P1_0 //定义LED1为P10口控制
/**函数声明*********************************************************************/
void InitLed(void); //初始化P1口
void InitT1(); //初始化定时器T1
/**
* @brief 主函数
* @param None
* @retval None
*/
void main(void)
{
uchar count=0;
InitLed(); //调用初始化函数
InitT1();
while(1)
{
if(T1IF>0)
{
T1IF=0;
if(++count==1) //约1s周期性闪烁
{
count=0;
LED1 = !LED1; //LED1闪烁
}
}
}
}
/**
* @brief 初始化IO
* @param None
* @retval None
*/
void InitLed(void)
{
P1DIR |= 0x03; //P1_0定义为输出
LED1 = 1; //LED1灯初始化熄灭
}
/**
* @brief 定时器函数
* @param None
* @retval None
*/
void InitT1() //系统不配置工作时钟时默认是2分频,即16MHz
{
T1CTL = 0x0d; //128分频,自动重装 0X0000-0XFFFF
T1STAT= 0x21; //通道0, 中断有效
}
注意:T1IF也可用IRCON替换。看看图3就明白了,TRCON为总中断标志位,而T1IF为分中断标志位。建议使用分中断标志位。
2.6实验现象
通过定时器T1查询方式使得LED1定时闪烁。
2.7实验总结
通过本实验,大家需要掌握以下 3 点:
CC2530 定时器的使用需要配置相关寄存器;
CC2530 定时器的寄存器类型以及每个类型如何配置。
定时器 1 的功能如下:
(1)五个捕获/比较通道
(2)上升沿、下降沿或任何边沿的输入捕获
(3)设置、清除或切换输出比较
(4)*运行、模或正计数/倒计数操作
(5)可被 1,8,32 或 128 整除的时钟分频器
(6)在每个捕获/比较和最终计数上生成中断请求
(7)DMA 触发功能
附:管理 Timer1 的寄存器类型
●T1CNTH –定时器 1 计数高位
●T1CNTL –定时器 1 计数低位
●T1CTL –定时器 1 控制
●T1STAT –定时器 1 状态
●T1CCTLn –定时器 1 通道 n 捕获/比较控制
●T1CCnH –定时器 1 通道 n 捕获/比较高位值
●T1CCnL –定时器 1 通道 n 捕获/比较低位值
本章参考代码
上一篇: 揭秘出售邮件群发软件背后的黑幕!