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参考代码
#include
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
void Delayms(uint xms);
void InitLed(void);
void InitT1(void);
uint count=0;
void main(void)
{
InitLed();
InitT1();
while(1)
{
}
}
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
IRCON = 0x00;
if((++count)==1)
{
count = 0;
LED1=~LED1;
}
}
void Delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
void InitLed(void)
{
P1DIR |= 0x01;
LED1 = 1;
}
void InitT1(void)
{
T1CTL|=0X0d;
T1IE = 1;
EA = 1;
}
2.6实验现象
通过定时器中断方式使得LED1定时闪烁。
本章参考代码
点击进入