文章目录
- 11 定时器计数器开发之中断方法
- 定时器中断处理函数:
- 完整测试代码:
11 定时器计数器开发之中断方法
LED控制电路同前节:
CC2530的T3定时器(8位)需要了解T3GJL,T3CCTLO,T3CCO,T3CCTL1,T3CC寄存器。如下表所示:
按照表格寄存器的内容,对T3进行配置,由于定时器T3为8位所以配置稍有不同。
T3CTL = 0x08 ;
开溢出中断
T3IE= 1;
开总中断和T3中断
TRCTL = OxE0;
//128分频,128/16000000*N=0.5S,N=62500
T3CTL &=~Ox03;
自动重装00一>Oxff 62500/255=245(次)
T3CTL = Ox10;
!启动
EA= 1;
再开启一开总中断
注意:
(1)T3CTL &= ~0X03; 这条语句理解为:0X03=0000 0011,则 ~0X03=1111 1100;所以当执行 T3CTL &= ~0X03 后,T3CTL 其它位保持不变,D0、D1 变为 0。
(2)由于是 128 分频,则计一次数需要时间 t=128/16000000, 如果我们希望得到一个 0.5s的延时,那么 128/16000000*N=0.5S,就得计 N=65200 次数。而我们又将 Timer3 设置为自动重装 0x00—0xFF,即产生一次溢出中断计数 256 次,而我们现在是想它计算65200 次,所以,我们要累加 254 次溢出中断才让 LED1 取反。
|是按位操作,操作对象为1;&也是按位操作,但操作对象是0,~取反操作。
实现代码:
void T3init(void)
{
T3CTL |= 0x08; //0x08=1000 或操作1,仅操作第3位,不影响其他位使溢出中断可以,不操作其他位
T3IE= 1; //开总中断
T3CTL |= 0xE0; //0xE0=1110 0000 或操作1,仅操作7:5位,128分频 128/16000000*N=0.5s,N=62500
T3CTL &= ~0x03; //0x03=0000 0011,取反1111 1100,Free running, repeatedly count from Ox00 to OxFF
//自动从0x00到0xff(255)重装,62500/255=245次,&操作0,1:0位置0,其他位不变
T3CTL != 0x10; //启动 0x10=0001 0000 或操作1,仅改变第4位,启动
EA= 1; //再开启一开总中断
}
定时器中断处理函数:
模板:
#pragma vector = T3_VECTOR //格式:#pragma vector = 中断向量,紧接着是中断处理程序
__interrupt void T3_ISR(void)
{
}
本案例:
#pragma vector = T3_VECTOR //格式:#pragma vector = 中断向量,紧接着是中断处理程序
__interrupt void T3_ISR(void)
{
IRCON = 0x00;//来中断就清0,防止误操作,方便下一次判断
if(count ++ > 245) //0.5s时间
{
count = 0; //每次进入就计数清零
LED1 = ~LED1;
}
/*Delay(10); //去除抖动
LED1=~LED1; //改变LED1状态
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
*/
}
主程序体:
/*************************
*程序入口函数
*************************/
void main(void)
{
ledinit();
T3init();
while(1)
{
//空循环即可
};
};
完整测试代码:
#include <ioCC2540.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED1 P1_0 //
uint count; //定时器计数
void ledinit(void)
{
P1DIR |= 0x01;//输出模式
LED1 =0;//上电默认输出0,即关灯
}
void T3init(void)
{
T3CTL |= 0x08; //0x08=1000 或操作1,仅操作第3位,不影响其他位使溢出中断可以,不操作其他位
T3IE= 1; //开总中断
T3CTL |= 0xE0; //0xE0=1110 0000 或操作1,仅操作7:5位,128分频 128/16000000*N=0.5s,N=62500
T3CTL &= ~0x03; //0x03=0000 0011,取反1111 1100,Free running, repeatedly count from Ox00 to OxFF
//自动从0x00到0xff(255)重装,62500/255=245次,&操作0,1:0位置0,其他位不变
T3CTL != 0x10; //启动 0x10=0001 0000 或操作1,仅改变第4位,启动
EA= 1; //再开启一开总中断
}
/****************************
定时器中断处理函数
*****************************/
#pragma vector = T3_VECTOR //格式:#pragma vector = 中断向量,紧接着是中断处理程序
__interrupt void T3_ISR(void)
{
IRCON = 0x00;//来中断就清0,防止误操作,方便下一次判断
if(count ++ > 245) //0.5s时间
{
count = 0; //每次进入就计数清零
LED1 = ~LED1;
}
/*Delay(10); //去除抖动
LED1=~LED1; //改变LED1状态
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
*/
}
/*************************
*程序入口函数
*************************/
void main(void)
{
ledinit();
T3init();
while(1)
{
//空循环即可
};
};