文章目录
- 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)
  {
    //空循环即可
  };
};



















