根据文档说明可以发现CC254x有四个振荡器
1、32MHz外部晶振 - 为内部时钟提供时钟源和用于RF收发器
2、16MHz内部RC振荡器 - 为内部时钟提供时钟源,功耗低,精度差,不可以用于RF收发器
3、32kHz外部晶振 - 精度高,低功耗设计必须接,主要用在Sleep Timer 和Watchdog Timer上
4、32kHz内部RC振荡器 - 精度低,功耗低,主要用在Sleep Timer 和Watchdog Timer上
一般的项目中cc254x的硬件上面会接两个晶振,一个是系统运行需要的32Mhz的晶振,这个不用多说,关于32.768khz的外部晶振,需要特别说明一下,这个晶振根据自己的需求是可有可无的,阅读文档会发现,这颗32k的晶振是给低功耗使用的,也就是如果系统需要设计低功耗,则必须接上32.768khz的外部晶振,否则使用32kHz内部RC振荡器,这就会导致计时不准确,该醒的时候醒不过来,所以就会出现连接不上,易断开的情况。如果不需要低功耗设计,在不接外部32.768khz晶振的情况下,可以屏蔽POWER_SAVING的宏,也可以修改协议栈初始化设置,使用32kHz内部RC振荡器,修改方法如下(参考http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/70831.aspx):
没有外部32KHz晶振也可以进入PM2的,需要修改main里的HAL_BOARD_INIT()这个宏。把切换到外部32KHz晶振的代码删掉即可,相关引脚也要做处理。
/* Board Initialization */
#define HAL_BOARD_INIT() \
{ \
/* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \
START_HSOSC_XOSC(); \
/*SET_OSC_TO_HSOSC(); 使用内部32K时钟*/ \
/*SET_32KHZ_OSC();*/ \
SET_OSC_TO_XOSC(); \
STOP_HSOSC(); \
\
/* Enable cache prefetch mode. */ \
PREFETCH_ENABLE(); \
}