CC2541 外部中断唤醒后广播问题
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有误差导致的?
谢谢!