把應用程序從sdk15.0遷移到15.3的過程中,出現一個問題。代碼全部移植完之後,編譯通過。在運行的時候每次都卡死在使能協議棧的函數裏面。
ret_code_t nrf_sdh_enable_request(void)
{
......
nrf_clock_lf_cfg_t const clock_lf_cfg =
{
.source = NRF_SDH_CLOCK_LF_SRC,
.rc_ctiv = NRF_SDH_CLOCK_LF_RC_CTIV,
.rc_temp_ctiv = NRF_SDH_CLOCK_LF_RC_TEMP_CTIV,
.accuracy = NRF_SDH_CLOCK_LF_ACCURACY
};
CRITICAL_REGION_ENTER();
#ifdef ANT_LICENSE_KEY
ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler, ANT_LICENSE_KEY);
#else
//經調試發現每次都卡死在這個函數
ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler);
#endif
......
}
後面查資料得知,協議棧使用內部的低速時鐘,而15.3版本的sdk默認配置的是外部高速時鐘,這就導致藍牙協議棧無法工作。
修改的方案爲:
將如下代碼
// <0=> NRF_CLOCK_LF_SRC_RC 內部時鐘
// <1=> NRF_CLOCK_LF_SRC_XTAL 外部晶振時鐘
// <2=> NRF_CLOCK_LF_SRC_SYNTH 從高速時鐘合成的低速時鐘
#ifndef NRF_SDH_CLOCK_LF_SRC
#define NRF_SDH_CLOCK_LF_SRC 1
#endif
// <o> NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval.
#ifndef NRF_SDH_CLOCK_LF_RC_CTIV
#define NRF_SDH_CLOCK_LF_RC_CTIV 0
#endif
修改爲
// <0=> NRF_CLOCK_LF_SRC_RC 內部時鐘
// <1=> NRF_CLOCK_LF_SRC_XTAL 外部晶振時鐘
// <2=> NRF_CLOCK_LF_SRC_SYNTH 從高速時鐘合成的低速時鐘
#ifndef NRF_SDH_CLOCK_LF_SRC
#define NRF_SDH_CLOCK_LF_SRC 0
#endif
// <o> NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval.
#ifndef NRF_SDH_CLOCK_LF_RC_CTIV
#define NRF_SDH_CLOCK_LF_RC_CTIV 16
#endif