cc1310 driverlib-时钟切换问题
时间:12-23
整理:3721RD
点击:
因为多方衡量,我们小组选择了使用SDK里面提供的driverlib驱动库来使用CC1310开发产品。
在系统时钟切换上遇到了问题,如下:
1. 这里说CPU时钟能够在48MHz~750KHz切换,但实在没有找到对应的函数。
这个函数居然固定返回 48000000Hz,这是为啥?
//***************************************************************************** // //! \brief Get the CPU core clock frequency. //! //! Use this function to get the current clock frequency for the CPU. //! //! The CPU can run from 48 MHz and down to 750kHz. The frequency is defined //! by the combined division factor of the SYSBUS and the CPU clock divider. //! //! \return Returns the current CPU core clock frequency. // //***************************************************************************** __STATIC_INLINE uint32_t SysCtrlClockGet( void ) { // Return fixed clock speed return( GET_MCU_CLOCK ); }
2. 貌似无法切换到外部24MHz晶体,代码如下:
if (OSCClockSourceGet(OSC_SRC_CLK_HF)!=OSC_XOSC_HF) { uint32_t tmp; OSCHF_TurnOnXosc(); while (!OSCHfSourceReady()); OSCHfSourceSwitch(); do {//check tmp = OSCClockSourceGet(OSC_SRC_CLK_HF); } while (tmp != OSC_XOSC_HF); }
3. SCLK_LF貌似也没有切换到外部32.768KHz,ccfg.c中clock设置如下:
//##################################### // Clock settings //##################################### #ifndef SET_CCFG_MODE_CONF_SCLK_LF_OPTION // #define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x0 // LF clock derived from High Frequency XOSC // #define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x1 // External LF clock #define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x2 // LF XOSC // #define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x3 // LF RCOSC #endif
按照你上面截取的代码,ccfg.c中的设置即为使用外部32.768KHz晶振。
在使用RTC时候,明显发现LaunchPad上时间和电脑时间有差异。大约246s,相差21ms左右。
你使用的外部晶振还是内部振荡器,使能校准了吗?
这个差异是如何测到的?具体测试方法是什么?
振荡器的设置代码如下:
AUXWUCPowerCtrl(AUX_WUC_POWER_ACTIVE); while (!(AONWUC_AUX_POWER_ON&AONWUCPowerStatusGet())); AUXWUCClockEnable(AUX_WUC_OSCCTRL_CLOCK); if (OSCClockSourceGet(OSC_SRC_CLK_LF)!=OSC_XOSC_LF) { OSCClockSourceSet(OSC_SRC_CLK_LF, OSC_XOSC_LF); }
使用方式是使用RTC CH2产生2s的中断,在中断中打印一小段信息。经过很长时间,比如1小时吧,会明显发现偏差
代码如下:
AONRTCCombinedEventConfig(AON_RTC_CH2); AONRTCCompareValueSet(AON_RTC_CH2, 0x10000); AONRTCModeCh2Set(AON_RTC_MODE_CH2_CONTINUOUS); AONRTCIncValueCh2Set(0x20000);//2s AONRTCEnable(); AONRTCChannelEnable(AON_RTC_CH2); IntEnable(INT_AON_RTC_COMB);//AON-RTC
使用的串口工具大致如下(3S的一个周期性打印任务),接收数据时间能精确到ms。
[17-07-25 10:49:12:436][Rx]uart_p run 115 timers [17-07-25 10:49:15:439][Rx]uart_p run 116 timers [17-07-25 10:49:18:437][Rx]uart_p run 117 timers [17-07-25 10:49:21:436][Rx]uart_p run 118 timers
另外,我测试的硬件平台是CC1350的LaunchPad Rev:1.1
问题汇总:
1. 目前MCU工作频率固定为48MHz。
2. ccfg.c和启动文件做了很多关于时钟初始化的工作。使用用driverlib切换时钟没有问题。
3. RTC时钟的问题,以上代码操作是正确的,误差是正常的,由32.768KHz晶振产生。修改增量寄存器即可实现校准,因为没有仪器测量从IO口引出的低速时钟信号的频率,带来误判。
- 您好,可不可以把你RTC唤醒的例程发给我一份,我参考一下