voidx 发表于 2010-4-9 11:27:16

CC2530定时器有BUG:定时器3,4,Modulo Mode无法产生中断。

CC2530定时器有BUG:定时器3,4,Modulo Mode无法产生中断。

http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_544758.JPG
(原文件名:Image0008.JPG)

http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_544759.JPG
(原文件名:Image0007.JPG)

voidx 发表于 2010-4-9 13:03:38

点击此处下载 ourdev_544760.rar(文件大小:18K) (原文件名:cc2530_test_t3.rar)


#include <iocc2530.h>


typedef unsigned charuint8;
typedef unsigned short uint16;
typedef unsigned longuint32;

#define _BV(A)                           (1U<<(A))
#define _BVF(A,B)                        ((unsigned int)((1UL<<(B))-1)<<(A))
#define _BVF_DATA(A,B,C)               (((A)<<(B)) & _BVF(B,C))

#define _PRAGMA_STR(A) _Pragma(#A)
#define PRAGMA_STR(A) _PRAGMA_STR(A)
#define __VECTOR__(A) vector=A

#define ISR(A)\
PRAGMA_STR(__VECTOR__(A))\
__near_func __interrupt void ISR##_##A(void)


#define CLKCONCMD_TICKSPD                _BVF(3,3)
#define CLKCONCMD_CLKSPD               _BVF(0,3)
#define CLKCONCMD_TICKSPD_DIV_128      (0x07 << 3)

//SLEEPCMD (0xBE) – Sleep-Mode Control Command
#define SLEEPCMD_OSC32K_CALDIS         _BV(7)
#define SLEEPCMD_OSC_PD                  _BV(2)      /*datasheet 无*/
#define SLEEPCMD_MODE(A)               _BVF_DATA(A,0,2)

//SLEEPSTA (0x9D) – Sleep-Mode Control Status
#define SLEEPSTA_OSC32K_CALDIS         _BV(7)
#define SLEEPSTA_XOSC_STB                _BV(6)       /*datasheet 无    */
#define SLEEPSTA_HFRC_STB                _BV(5)       /*datasheet 无    */
#define SLEEPSTA_RST(A)                  _BVF_DATA(A,3,2)
#define SLEEPSTA_CLK32K                  _BV(0)

//T3CTL (0xCB) – Timer 3 Control
#define T3CTL_DIV(A)                      _BVF_DATA(A,5,3)
#define T3CTL_START                     _BV(4)
#define T3CTL_OVFIM                     _BV(3)
#define T3CTL_CLR                         _BV(2)
#define T3CTL_MODE(A)                     _BVF_DATA(A,0,2)

//TIMIF (0xD8) – Timer 1/3/4 Interrupt Mask/Flag
#define TIMIF_OVFIM                     _BV(6)
#define TIMIF_T4CH1IF                     _BV(5)
#define TIMIF_T4CH0IF                     _BV(4)
#define TIMIF_T4OVFIF                     _BV(3)
#define TIMIF_T3CH1IF                     _BV(2)
#define TIMIF_T3CH0IF                     _BV(1)
#define TIMIF_T3OVFIF                     _BV(0)

//IRCON (0xC0) – Interrupt Flags 4
#define IRCON_STIF                        _BV(7)
#define IRCON_P0IF                        _BV(5)
#define IRCON_T4IF                        _BV(4)
#define IRCON_T3IF                        _BV(3)
#define IRCON_T2IF                        _BV(2)
#define IRCON_T1IF                        _BV(1)
#define IRCON_DMAIF                     _BV(0)

//IEN1 (0xB8) – Interrupt Enable 1
#define IEN1_P0IE                         _BV(5)
#define IEN1_T4IE                         _BV(4)
#define IEN1_T3IE                         _BV(3)
#define IEN1_T2IE                         _BV(2)
#define IEN1_T1IE                         _BV(1)
#define IEN1_DMAIE                        _BV(0)

//CLKCONCMD (0xC6) – Clock Control Command
#define CLKCONCMD_OSC32K               _BV(7)
#define CLKCONCMD_OSC                  _BV(6)

#define CLKCONCMD_TICKSPD_DIV_1          (0x00 << 3)
#define CLKCONCMD_TICKSPD_DIV_2          (0x01 << 3)
#define CLKCONCMD_TICKSPD_DIV_4          (0x02 << 3)
#define CLKCONCMD_TICKSPD_DIV_8          (0x03 << 3)
#define CLKCONCMD_TICKSPD_DIV_16         (0x04 << 3)
#define CLKCONCMD_TICKSPD_DIV_32         (0x05 << 3)
#define CLKCONCMD_TICKSPD_DIV_64         (0x06 << 3)
#define CLKCONCMD_TICKSPD_DIV_128      (0x07 << 3)

#define CLKCONCMD_CLKSPD_DIV_1         (0x00 << 0)
#define CLKCONCMD_CLKSPD_DIV_2         (0x01 << 0)
#define CLKCONCMD_CLKSPD_DIV_4         (0x02 << 0)
#define CLKCONCMD_CLKSPD_DIV_8         (0x03 << 0)
#define CLKCONCMD_CLKSPD_DIV_16          (0x04 << 0)
#define CLKCONCMD_CLKSPD_DIV_32          (0x05 << 0)
#define CLKCONCMD_CLKSPD_DIV_64          (0x06 << 0)
#define CLKCONCMD_CLKSPD_DIV_128         (0x07 << 0)


#define CC2530_WAIT_CLK_UPDATE()   \
do{ uint8 ____clkcon; \
    uint8 ____clkconsta; \
    ____clkcon = CLKCONCMD; \
    do { \
    ____clkconsta = CLKCONSTA; \
   } while (____clkconsta != ____clkcon); \
}while(0)


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

laoma 发表于 2010-4-9 13:13:08

请问上官,CC2530比CC2430发射功率提高了2倍多,通讯距离提高了多少?
可否说说你的感觉,让我们也参考参考

eliucheng 发表于 2010-5-10 15:00:59

没有两倍多空旷距离大概200米   左右

eliucheng 发表于 2010-5-10 15:02:04

上官兄你的DMA用起来没有? 我卡在这里了~

voidx 发表于 2010-5-10 20:09:38

楼上拿DMA做什么?

yingying521 发表于 2010-9-2 09:01:12

回复【楼主位】voidx
-----------------------------------------------------------------------

楼主是自己做的板子还是买的实验板测的?

hpdell 发表于 2012-8-27 15:45:33

不错,可以作为入门的开始

ghostyu 发表于 2013-2-1 23:18:25

代码写错了尽然说芯片有bug。。。
页: [1]
查看完整版本: CC2530定时器有BUG:定时器3,4,Modulo Mode无法产生中断。