cc2530定时器BUG

[复制链接]
 楼主| voidx 发表于 2010-4-9 11:47 | 显示全部楼层 |阅读模式
本帖最后由 voidx 于 2010-4-9 13:01 编辑

CC2530 定时器BUG:

datasheet:
When the timer operates in modulo mode, the 8-bit counter starts at 0x00 and increments at each active clock edge. When the counter reaches the terminal count value held in register TxCC0, the counter is reset to 0x00 and continues to increment. The flag TIMIF.TxOVFIF is set when on this event.

实际情况是,TIMIF.TxOVFIF根本没有置位。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| voidx 发表于 2010-4-9 12:49 | 显示全部楼层
本帖最后由 voidx 于 2010-4-9 12:52 编辑

模式0,1,2,3,其中模式2:Modulo Mode无法城城中断


测试代码:


void CLK_RC_TO_XOSC(void)
{
    SLEEPCMD &= ~SLEEPCMD_OSC_PD;       //打开双震荡
   
    while((SLEEPSTA & SLEEPSTA_XOSC_STB)==0);  //等待XOSC稳定
    asm("nop");
   
    CLKCONCMD = (CLKCONCMD & ~(CLKCONCMD_CLKSPD | CLKCONCMD_OSC)) | CLKCONCMD_CLKSPD_DIV_1;
   
    CC2530_WAIT_CLK_UPDATE();
    SLEEPCMD |= SLEEPCMD_OSC_PD;
}

#define LED P1_2
void LED_Init(void)
{
  P1    &= ~_BV(2);
  P1DIR |=  _BV(2);
}

#define T1234_BASE_CLK    (32000000UL/128UL)

void T1234_BaseClkSet(void)
{
   CLKCONCMD = (CLKCONCMD & ~CLKCONCMD_TICKSPD) | CLKCONCMD_TICKSPD_DIV_128;
   CC2530_WAIT_CLK_UPDATE();
}

#define T3_CLK          (T1234_BASE_CLK/1)             //T3_CLK=T1234_CLK/1=250K


void T3_Init(void)      
{
    T3CC0 = T3_CLK/2000;

    //T3CTL  =  T3CTL_DIV(0) | T3CTL_OVFIM |  T3CTL_CLR | T3CTL_MODE(0);   //Free-Running Mode
    //T3CTL  =  T3CTL_DIV(0) | T3CTL_OVFIM |  T3CTL_CLR | T3CTL_MODE(1);   //Down Mode
    //T3CTL  =  T3CTL_DIV(0) | T3CTL_OVFIM |  T3CTL_CLR | T3CTL_MODE(2);     //Modulo Mode
    T3CTL  =  T3CTL_DIV(0) | T3CTL_OVFIM |  T3CTL_CLR | T3CTL_MODE(3);   //Up/Down Mode
   
    T3CTL |=  T3CTL_START ;
      
    TIMIF &= ~TIMIF_T3OVFIF;
   
    IRCON &= ~IRCON_T3IF;
   
    IEN1 |=   IEN1_T3IE;
}

ISR(T3_VECTOR)    //T3中断
{
    TIMIF &= ~TIMIF_T3OVFIF;
    IRCON &= ~IRCON_T3IF;
   
    LED=!LED;
}


int main()
{
    CLK_RC_TO_XOSC()   ;  //主时钟由RC切换到32M晶振
    T1234_BaseClkSet() ;  //定时器基时钟设置,128分频,250K
   
    LED_Init();         //LED初始化
    T3_Init();          //T3初始化
   
    EA=1;               //开全局中断
  
    while(1);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
juventus9554 发表于 2010-4-9 18:53 | 显示全部楼层
真有这回事……
humaoxiao3 发表于 2014-7-24 22:49 | 显示全部楼层
你好,我也发现了这个问题,解决方法如下:
在你原有代码的基础上将T1CCTL0的MODE位置1,然后每次T1CNT寄存器的值达到T1CC0的值以后,就会在T1STAT寄存器的CH0IF位上产生中断,读取它就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:上官一出惊天地,   金虹一现震江湖。

35

主题

118

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部