前言:
一般情況下單片機的時鍾配置是單片機程序中的第一步,也是很重要的一步。這時候我們需要考慮以下幾個問題。
1. 系統時鍾的時鍾源用哪個。
2. 系統時鍾頻率要多少。
3. 每個模塊的時鍾頻率要多少。
4. 如果外部時鍾出了問題,這個時候時鍾是怎么運行的。
下面就針對性的講一講STM32F103的時鍾配置。
知識點:
1.
系統復位后,HSI振盪器被選為系統時鍾。當時鍾源被直接或通過PLL間接作為系統時鍾時,它將不能被停止。
2. STM32F103的三個可以作為系統時鍾的時鍾源,分別是HSI、HSE、PLL。而PLL的時鍾源是HSI/2(內部RC振盪器二分頻)、HSE。
3.
如果使用HSI,
系統時鍾我們能達到的最大頻率是64MHz,
如果使用HSE
,系統時鍾最大頻率是72MHz
。
4.APB
時鍾有低速PCLK1
和高速PCLK2
;PCLK1
是從HCLK
二分頻得到的,最大36MHZ
,根據上一條知識點如果是使用HSI,
則最快是32MHz
。
5. PLL
的設定需要在使能之前,一旦PLL
使能后參數不可更改。
6.
附錄是一些縮寫的英文全稱,也有一些補充的知識點。
步驟:
第一步
初始化時鍾
不管現在SYSCLK
的時鍾源是哪個,我們要更換時鍾源。先RCC_DeInit();
第二步
打開時鍾
內部高速時鍾HSI RCC_HSICmd(ENABLE);
外部高速時鍾HSE RCC_HSEConfig(RCC_HSE_ON);
第三步
等待時鍾晶振工作
HSI While(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);
HSE While(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET);
第四步
設置AHB
時鍾HCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
分頻系數自己設定,一般都是RCC_SYSCLK_Div1即不分頻。
第五步
設置低速APB
時鍾
RCC_PCLK1Config(RCC_HCLK_Div2);
第六步
設置高速APB
時鍾
RCC_PCLK2Config(RCC_HCLK_Div1);
第七步
設置Flash
預緩沖
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 使能flash預緩沖
Flash
的操作也沒有總線時鍾快,所以需要總線在操作flash
時稍作等待。推薦根據HCLK
設置。
0-24MHz時,取FLASH_Latency_0;24-48MHz,取FLASH_Latency_1;48-72MHz時,取FLASH_Latency_2。
第八步
設置PLL
如果不使用PLL,請略過此步驟
HSI RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16 );
HSE RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9 );
第九步
打開PLL
如果不使用PLL,請略過此步驟
RCC_PLLCmd(ENABLE);
第十步
等待PLL
工作
如果不使用PLL,請略過此步驟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET);
第十一步
設置系統時鍾
HSI RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
HSE RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
PLL RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
第十二步
判斷是否是設置的時鍾
HSI while(RCC_GetSYSCLKSource()!= 0x00);
HSE while(RCC_GetSYSCLKSource()!= 0x04);
PLL while(RCC_GetSYSCLKSource()!= 0x08);