先说重点:切换时钟源后,需要重新初始化时钟相关的外设。
项目需求,单片机在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错误提示
}
}
实际运行时发现,切换时钟后,和时钟相关的外设工作异常。
考虑到时钟源的影响,将所有工作异常的外设重新初始化后,代码即正常运行。