This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

用CC2530 定时器T1产生溢出中断如何实现?

网上大多是查询,或者是用T3中断,我想用T1实现中断,自己修改了一下网上的代码,编译无错,但是不能进中断函数,不知问题出在哪里?

#include <ioCC2530.h>

//定义数据类型
#define uchar unsigned char
#define uint unsigned int

//定义控制口
#define LED1 P1_0  //LED1的控制口
#define LED2 P1_1  //LED2的控制口

//声明函数区
void delayms(uint);  //延时函数
void InitLed();   //P1口初始化
void InitT1();
int count;
//函数定义区

/**************************
*函数名称:delayms(uint ms)
*函数功能:延时函数
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void delayms(uint ms)
{
  uint i = 0;
  uint j = 0;
 
  for(i = 0; i < ms; ++i)
    for(j = 0; j < 586; ++j);
}

/**************************
*函数名称:InitLed()
*函数功能:LED初始化
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void InitLed()
{
  P1SEL &= ~0x01;//定义P1_0为普通IO口
  P1DIR |= 0x01;//定义P1_0为输出
  LED1 = 0;//初始化LED1熄灭
  //LED2 = 0;//初始化LED2熄灭
}

/**************************
*函数名称:InitT1()
*函数功能:初始化T1函数
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void InitT1()
{
  T1CTL |= 0x01;       //bu分频,自动重装0x0000-0xffff
  TIMIF |= 0x40;       //T1 overflow interrupt mask
  IEN1  |= 0x02;       //T1IE使能
  EA = 1;  
}


#pragma vector = T1_VECTOR//T1输入中断向量
__interrupt void T1_ISR(void)
{
 
  if(IRCON > 0)//查询方式
    {
      IRCON = 0;
      
      if(++count >= 488)//count 为 自己定义
      {
        count = 0;
        LED1 = !LED1;
      }
    }
}


/**************************
*函数名称:main()
*函数功能:主函数
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void main()
{
  CLKCONCMD &= ~0x40;         //设置系统时钟源为32MHZ晶振
  while(CLKCONSTA & 0x40);    //等待晶振稳定为32M
  CLKCONCMD &= ~0x47;         //设置系统主时钟频率为32MHZ
 
  InitLed();
  InitT1();
  while(1)
  {
    
  }
}

  • 问题解决了,

    1 并不是进入不了中断,我单步调试了一下,是判断语句  if(IRCON > 0) 这一步不能实现,IRCON寄存器CPU会自动清零,不过在查询模式是可以作为条件的,在中断情况就不行了,有点疑惑。

    2 解决方法就是有TISTAT做判断条件,

    if(T1STAT > 0)//查询方式
        {
          IRCON = 0;
          T1STAT = 0;
          if(++count >= 488)//count 为 自己定义
          {
            count = 0;
            LED1 = !LED1;
          }
        }