stm32 HSE HSI
生活随笔
收集整理的這篇文章主要介紹了
stm32 HSE HSI
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
stm32 HSE HSI
- 時鐘樹
- main.c
- clkconfig.h
- clkconfig.c
時鐘樹
HSE_SetSysClock和HSI_SetSysClock這兩個函數就是根據上面這個時鐘樹編寫的。
main.c
這個實驗是通過HSE或者HSI配置系統時鐘,結果就是,用HSE比HSI燈閃的快點,因為代碼設置的是使用HSE時,SYSCLK=72,而使用HSI時,SYSCLK=64。那個RCC_MCOConfig控制的是MCO,MCO也就是微控制器時鐘輸出引腳,可以通過示波器查看MCO引腳時鐘輸出來驗證系統時鐘配置情況,MCO的時鐘來源可以是HSE,HSI,PLLCLK/2,SYSCLK。
/* * 配置MCO引腳:PA8 對外提供時鐘,最高頻率不能超過IO口的翻轉頻率50MHZ* MCO 時鐘來源可以是:PLLCLK/2 ,HSI,HSE,SYSCLK*/ #include "stm32f10x.h" #include "bsp_led.h" #include "bsp_clkconfig.h" #include "bsp_mcooutput.h"// 軟件延時函數,使用不同的系統時鐘,延時不一樣 void Delay(__IO u32 nCount); /*** @brief 主函數* @param 無 * @retval 無*/ int main(void) { // 程序來到main函數之前,啟動文件:statup_stm32f10x_hd.s已經調用// SystemInit()函數把系統時鐘初始化成72MHZ// SystemInit()在system_stm32f10x.c中定義// 如果用戶想修改系統時鐘,可自行編寫程序修改// 重新設置系統時鐘,這時候可以選擇使用HSE還是HSI// 使用HSE時,SYSCLK = 8M * RCC_PLLMul_x, x:[2,3,...16],最高是128M//HSE_SetSysClock(RCC_PLLMul_9);// 使用HSI時,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MHHSI_SetSysClock(RCC_PLLMul_16);// MCO 引腳初始化MCO_GPIO_Config();// 設置MCO引腳輸出時鐘,用示波器即可在PA8測量到輸出的時鐘信號,// 我們可以把PLLCLK/2作為MCO引腳的時鐘來檢測系統時鐘是否配置準確// MCO引腳輸出可以是HSE,HSI,PLLCLK/2,SYSCLK //RCC_MCOConfig(RCC_MCO_HSE); //RCC_MCOConfig(RCC_MCO_HSI); //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2); RCC_MCOConfig(RCC_MCO_SYSCLK); // LED 端口初始化LED_GPIO_Config();while (1){LED1( ON ); // 亮Delay(0x0FFFFF);LED1( OFF ); // 滅 Delay(0x0FFFFF); } }// 軟件延時函數,使用不同的系統時鐘,延時不一樣 void Delay(__IO uint32_t nCount) {for(; nCount != 0; nCount--); }/*********************************************END OF FILE**********************/clkconfig.h
#ifndef __CLKCONFIG_H #define __CLKCONFIG_H#include "stm32f10x.h"void HSE_SetSysClock(uint32_t pllmul); void HSI_SetSysClock(uint32_t pllmul);#endif /* __CLKCONFIG_H */clkconfig.c
#include "bsp_clkconfig.h" #include "stm32f10x_rcc.h"/** 使用HSE時,設置系統時鐘的步驟* 1、開啟HSE ,并等待 HSE 穩定* 2、設置 AHB、APB2、APB1的預分頻因子* 3、設置PLL的時鐘來源,和PLL的倍頻因子,設置各種頻率主要就是在這里設置* 4、開啟PLL,并等待PLL穩定* 5、把PLLCK切換為系統時鐘SYSCLK* 6、讀取時鐘切換狀態位,確保PLLCLK被選為系統時鐘*//* 設置 系統時鐘:SYSCLK, AHB總線時鐘:HCLK, APB2總線時鐘:PCLK2, APB1總線時鐘:PCLK1* PCLK2 = HCLK = SYSCLK* PCLK1 = HCLK/2,最高只能是36M* 參數說明:pllmul是PLL的倍頻因子,在調用的時候可以是:RCC_PLLMul_x , x:[2,3,...16]* 舉例:User_SetSysClock(RCC_PLLMul_9); 則設置系統時鐘為:8MHZ * 9 = 72MHZ* User_SetSysClock(RCC_PLLMul_16); 則設置系統時鐘為:8MHZ * 16 = 128MHZ,超頻慎用** HSE作為時鐘來源,經過PLL倍頻作為系統時鐘,這是通常的做法*/void HSE_SetSysClock(uint32_t pllmul) {__IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;// 把RCC外設初始化成復位狀態,這句是必須的RCC_DeInit();//使能HSE,開啟外部晶振,開發板用的是8MRCC_HSEConfig(RCC_HSE_ON);// 等待 HSE 啟動穩定HSEStartUpStatus = RCC_WaitForHSEStartUp();// 只有 HSE 穩定之后則繼續往下執行if (HSEStartUpStatus == SUCCESS){ //----------------------------------------------------------------------//// 使能FLASH 預存取緩沖區FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// SYSCLK周期與閃存訪問時間的比例設置,這里統一設置成2// 設置成2的時候,SYSCLK低于48M也可以工作,如果設置成0或者1的時候,// 如果配置的SYSCLK超出了范圍的話,則會進入硬件錯誤,程序就死了// 0:0 < SYSCLK <= 24M// 1:24< SYSCLK <= 48M// 2:48< SYSCLK <= 72MFLASH_SetLatency(FLASH_Latency_2); //----------------------------------------------------------------------//// AHB預分頻因子設置為1分頻,HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // APB2預分頻因子設置為1分頻,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1); // APB1預分頻因子設置為1分頻,PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------設置各種頻率主要就是在這里設置-------------------//// 設置PLL時鐘來源為HSE,設置PLL倍頻因子// PLLCLK = 8MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSE_Div1, pllmul); //------------------------------------------------------------------//// 開啟PLL RCC_PLLCmd(ENABLE);// 等待 PLL穩定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}// 當PLL穩定之后,把PLL時鐘切換為系統時鐘SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 讀取時鐘切換狀態位,確保PLLCLK被選為系統時鐘while (RCC_GetSYSCLKSource() != 0x08){}}else{ // 如果HSE開啟失敗,那么程序就會來到這里,用戶可在這里添加出錯的代碼處理// 當HSE開啟失敗或者故障的時候,單片機會自動把HSI設置為系統時鐘,// HSI是內部的高速時鐘,8MHZwhile (1){}} }/** 使用HSI時,設置系統時鐘的步驟* 1、開啟HSI ,并等待 HSI 穩定* 2、設置 AHB、APB2、APB1的預分頻因子* 3、設置PLL的時鐘來源,和PLL的倍頻因子,設置各種頻率主要就是在這里設置* 4、開啟PLL,并等待PLL穩定* 5、把PLLCK切換為系統時鐘SYSCLK* 6、讀取時鐘切換狀態位,確保PLLCLK被選為系統時鐘*//* 設置 系統時鐘:SYSCLK, AHB總線時鐘:HCLK, APB2總線時鐘:PCLK2, APB1總線時鐘:PCLK1* PCLK2 = HCLK = SYSCLK* PCLK1 = HCLK/2,最高只能是36M* 參數說明:pllmul是PLL的倍頻因子,在調用的時候可以是:RCC_PLLMul_x , x:[2,3,...16]* 舉例:HSI_SetSysClock(RCC_PLLMul_9); 則設置系統時鐘為:4MHZ * 9 = 36MHZ* HSI_SetSysClock(RCC_PLLMul_16); 則設置系統時鐘為:4MHZ * 16 = 64MHZ** HSI作為時鐘來源,經過PLL倍頻作為系統時鐘,這是在HSE故障的時候才使用的方法* HSI會因為溫度等原因會有漂移,不穩定,一般不會用HSI作為時鐘來源,除非是迫不得已的情況* 如果HSI要作為PLL時鐘的來源的話,必須二分頻之后才可以,即HSI/2,而PLL倍頻因子最大只能是16* 所以當使用HSI的時候,SYSCLK最大只能是4M*16=64M*/void HSI_SetSysClock(uint32_t pllmul) {__IO uint32_t HSIStartUpStatus = 0;// 把RCC外設初始化成復位狀態,這句是必須的RCC_DeInit();//使能HSIRCC_HSICmd(ENABLE);// 等待 HSI 就緒HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;// 只有 HSI就緒之后則繼續往下執行if (HSIStartUpStatus == RCC_CR_HSIRDY){ //----------------------------------------------------------------------//// 使能FLASH 預存取緩沖區FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// SYSCLK周期與閃存訪問時間的比例設置,這里統一設置成2// 設置成2的時候,SYSCLK低于48M也可以工作,如果設置成0或者1的時候,// 如果配置的SYSCLK超出了范圍的話,則會進入硬件錯誤,程序就死了// 0:0 < SYSCLK <= 24M// 1:24< SYSCLK <= 48M// 2:48< SYSCLK <= 72MFLASH_SetLatency(FLASH_Latency_2); //----------------------------------------------------------------------//// AHB預分頻因子設置為1分頻,HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // APB2預分頻因子設置為1分頻,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1); // APB1預分頻因子設置為1分頻,PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------設置各種頻率主要就是在這里設置-------------------//// 設置PLL時鐘來源為HSE,設置PLL倍頻因子// PLLCLK = 4MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul); //------------------------------------------------------------------//// 開啟PLL RCC_PLLCmd(ENABLE);// 等待 PLL穩定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}// 當PLL穩定之后,把PLL時鐘切換為系統時鐘SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 讀取時鐘切換狀態位,確保PLLCLK被選為系統時鐘while (RCC_GetSYSCLKSource() != 0x08){}}else{ // 如果HSI開啟失敗,那么程序就會來到這里,用戶可在這里添加出錯的代碼處理// 當HSE開啟失敗或者故障的時候,單片機會自動把HSI設置為系統時鐘,// HSI是內部的高速時鐘,8MHZwhile (1){}} }總結
以上是生活随笔為你收集整理的stm32 HSE HSI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opc服务器消息通知代码,OPCClie
- 下一篇: (set)计算集合的并