先說重點:切換時鐘源後,需要重新初始化時鐘相關的外設。
項目需求,單片機在A狀態下使用外部12MHz的晶振作爲時鐘信號,B狀態下使用內部時鐘HSI。
代碼如下:
//初始化時鐘信號
//形參:UINT8 Clk_Flg:時鐘源,可以選爲HSE或HSI
void InitClock(UINT8 Clk_Flg) {
UINT16 Clk_Cnt = 0;
if(HSE == Clk_Flg){ //時鐘源選爲HSE
CLK_DeInit();
CLK_HSEConfig(CLK_HSE_ON);
while(!CLK_GetFlagStatus(CLK_FLAG_HSERDY)){
if ((++Clk_Cnt) > 50000){
InitClock(HSI); //HSE啓動失敗,切回HSI
return;
}
}
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
CLK_SYSCLKSourceSwitchCmd(ENABLE);
CLK_ClockSecuritySystemEnable();
// System_ERROR_UserCallback(ERROR_REMOVE_HSE);//自定義函數,清除HSE錯誤提示
return;
}
else{ //時鐘源選爲HSI
CLK_HSICmd(ENABLE);
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_2); //內部時鐘爲16MHz,2分頻 = 8Mhz,
// System_ERROR_UserCallback(ERROR_HSE); //自定義函數,HSE錯誤提示
}
}
實際運行時發現,切換時鐘後,和時鐘相關的外設工作異常。
考慮到時鐘源的影響,將所有工作異常的外設重新初始化後,代碼即正常運行。