STM8L151C8T6切換時鐘信號

先說重點:切換時鐘源後,需要重新初始化時鐘相關的外設

項目需求,單片機在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錯誤提示
	}
}

 實際運行時發現,切換時鐘後,和時鐘相關的外設工作異常。

考慮到時鐘源的影響,將所有工作異常的外設重新初始化後,代碼即正常運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章