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.

CC2541 外部中断唤醒后广播问题

Other Parts Discussed in Thread: CC2541, CC2540

CC2541用内部32K,除连接有时会断线外((这个就是用了外部32K导致的),其它一切正常;当改为外部32K后,中断唤醒后有时无法广播,查资料说进入PM3后,32K停振,当唤醒时32K启动需要0。5S时间,是不是因为这个引起的。因为在外部中断唤醒后没有做延时处理,由于振荡不稳定所致;

  • 贴上你的32K初始化代码

  • #define EXTERNAL_CRYSTAL_OSC          0x00  // external 32kHz XOSC

     #define INTERNAL_RC_OSC               0x80  // internal 32kHz RCOSC

    #define OSC_32KHZ                     EXTERNAL_CRYSTAL_OSC

    // switch to the 16MHz HSOSC and wait until it is stable #define SET_OSC_TO_HSOSC()                                                     \ {                                                                              \   CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ;                            \   while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ );                            \ }

    // switch to the 32MHz XOSC and wait until it is stable #define SET_OSC_TO_XOSC()                                                      \ {                                                                              \   CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ;                            \   while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ );                            \ }

    // set 32kHz OSC and wait until it is stable #define SET_32KHZ_OSC()                                                        \ {                                                                              \   CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ;                                 \   while ( (CLKCONSTA & 0x80) != OSC_32KHZ );                                   \ }

    #define START_HSOSC_XOSC()                                                     \ {                                                                              \   SLEEPCMD &= ~OSC_PD;            /* start 16MHz RCOSC & 32MHz XOSC */         \   while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */             \ } #define STOP_HSOSC()                                                           \ {                                                                              \   SLEEPCMD |= OSC_PD;             /* stop 16MHz RCOSC */                       \ } /* Board Initialization */

    #if defined ( CC2540_MINIDK )

    #define HAL_BOARD_INIT()                                                       \ {                                                                              \   /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */                      \   START_HSOSC_XOSC();                                                          \   SET_OSC_TO_HSOSC();                                                          \   SET_32KHZ_OSC();                                                             \   SET_OSC_TO_XOSC();                                                           \   STOP_HSOSC();                                                                \                                                             \                                                                                \   /* Enable cache prefetch mode. */                                            \   PREFETCH_ENABLE();                                                           \   /* Set LED GPIOs to outputs. */                                              \   LED1_DDR |= LED1_BV;                                                         \   LED2_DDR |= LED2_BV;                                                         \ }

     

    就是在这个宏定义中的,只是把32K定为外部晶振而己,其它没变,把P2SEL设为外设功能也还是一样的

  • 用内部的RC 32K的校准时间大概2ms,用外部的32K,就最多需要500ms

    你先测试下,唤醒后校准需要的时间,然后稳定后,延迟100ms再广播

  • 你好!

    1.意思是中断唤醒后先关闭广播(之前是中断唤醒后就开始广播了),然后再测量看32K稳定的时间,等到稳定后再延时100ms,再启动广播,对吗?如果是这样子,那就是手机连接的时间还是会比较长,要超过1S钟对吗?(之前用内部32KRC是很快的)

     

    2.看了其它的贴子,是说32KRC做低功耗会出现连接后有时会断线,是不是就是因为32KRC有误差导致的?

     

    谢谢!