打印

cc2530定时器BUG

[复制链接]
3099|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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根本没有置位。

Image0007.JPG (47.46 KB )

Image0007.JPG

相关帖子

沙发
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);
}

cc2530_test_t3.rar

17.65 KB

使用特权

评论回复
板凳
juventus9554| | 2010-4-9 18:53 | 只看该作者
真有这回事……

使用特权

评论回复
地板
humaoxiao3| | 2014-7-24 22:49 | 只看该作者
你好,我也发现了这个问题,解决方法如下:
在你原有代码的基础上将T1CCTL0的MODE位置1,然后每次T1CNT寄存器的值达到T1CC0的值以后,就会在T1STAT寄存器的CH0IF位上产生中断,读取它就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

35

主题

118

帖子

2

粉丝