《ZigBee开发笔记》第二部分 基础篇-第4章 定时器-CC2530 中断方式使用定时器T1

2019-04-13 21:49发布

1 理论分析

为定时器分配了一个中断向量。当下列定时器事件之一发生时,将产生一个中断请求:
 计数器达到最终计数值(溢出或回到零)
 输入捕获事件
 输出比较事件
寄存器状态寄存器 T1STAT 包括最终计数值事件和五个通道比较/捕获事件的中断标志。仅当设置了相应的中断屏蔽位和 IEN1.T1EN 时,才能产生一个中断请求。中断屏蔽位是 n 个通道的 T1CCTLn.IM 和溢出事件 TIMIF.OVFIM。如果有其它未决中断,必须在一个新的中断请求产生之前,通过软件清除相应的中断标志。而且,如果设置了相应的中断标志,使能一个中断屏蔽位将产生一个新的中断请求。

2 实验详解

2.1实验目的

1)、进一步了解 CC2530 定时器 1;
2)、掌握定时器 1 中断方式的应用;
3)、掌握定时器1 的配置与使用

2.2实验设备

硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

2.3实验相关电路图

这里写图片描述
图1 LED电路图

2.4 实验相关寄存器

本实验本实验配置的是 Timer1 的控制寄存器。具体如何配置看图。
所以,控制字为:T1CTL|=0X0d。
表1 定时器1的控制与状态
这里写图片描述
表2 定时器1的状态
T1STAT(0xAF)-定时器1状态 这里写图片描述
表3 中断标志
这里写图片描述 按照表格寄存器的内容,对Led1 和T1 进行配置。
Led1 配置如下:
P1SEL &=~0x01; //配置P1.0 为通用IO 口
P1DIR |= 0x01; //配置P1.0 为输出 T1 配置如下:
T1CTL = 0x0d; //128 分频,自动重装0x0000-0xFFFF
当然,由于用到的是中断方式,所以,要打开定时器 1 中断和总中断,即:
T1IE = 1;( 开 Timer1 中断)
EA = 1;( 开总中断) 注意:由于是 128 分频,则计一次数需要时间 t=128/16000000, 如果我们希望得到一个 0.5s 的延时,那么 128/16000000*N=0.5S,就得计 N=65200 次数。而我们又将 Timer1设置为自动重装 0x0000—0xFFFF,即产生一次溢出中断计数 0.9948 次,约等于 1 次,所以,我们要累加 1 次溢出中断才让 LED1 取反。

2.5参考代码

/**Includes*********************************************************************/ #include /**宏定义***********************************************************************/ //定义数据类型 #define uint unsigned int #define uchar unsigned char //定义控制LED灯的端口 #define LED1 P1_0 //定义LED1为P1_0口控制 /**函数声明*********************************************************************/ void Delayms(uint xms); //延时函数 void InitLed(void); //LED_IO初始化函数 void InitT1(void); //Timer1中断方式初始化函数 /**全局变量*********************************************************************/ //由于是中断函数用到,一定要定义为全局变量 uint count=0;//用于计算溢出中断的次数 /** * @brief 主函数 * @param None * @retval None */ void main(void) { InitLed(); //调用初始化函数 InitT1(); while(1) { } } /** * @brief 中断服务函数 * @param None * @retval None */ #pragma vector = T1_VECTOR //Timer1中断向量 __interrupt void T1_ISR(void) { IRCON = 0x00; //清中断标志, 也可由硬件自动完成 if((++count)==1) //1次中断后LED取反,闪烁一轮(0.5 秒时间) { count = 0; //计数清零 LED1=~LED1; } } /** * @brief 普通延时函数 * @param xms 延时长度 * @retval None */ void Delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); } /** * @brief LED初始化函数 * @param None * @retval None */ void InitLed(void) { P1DIR |= 0x01; //P1_0义为输出 LED1 = 1; //LED1灯熄灭 } /** * @brief Timer1中断方式初始化函数 * @param None * @retval None */ void InitT1(void) { T1CTL|=0X0d; //128分频,自由运行模式 T1IE = 1; //开Timer1中断 EA = 1; //开总中断 }

2.6实验现象

通过定时器中断方式使得LED1定时闪烁。

本章参考代码

点击进入