在STM32中,所有的應用都是基於時鍾,所以時鍾的配置就尤為重要了,而不能僅僅只知道使用默認時鍾。
STM32F4的時鍾樹如上圖所示,HSE為外部接入的一個8M的時鍾,然后再給PLL提供輸入時鍾,經過分頻倍頻后產生PLLCLK時鍾,為SYSCLK提供基礎時鍾來源。
配置的步驟:
- 將RCC寄存器重新設置為默認值
- 打開外部高速時鍾晶振HSE
- 等待HSE時鍾晶振工作
- 設置AHB時鍾也就是HCLK時鍾
- 設置高速APB1時鍾也就是PCLK1
- 設置低速APB2時鍾也就是PCLK2
- 設置PLL
- 打開PLL
- 等待PLL工作
- 設置系統時鍾
- 判斷系統時鍾是否為PLL時鍾
重點設置為PLL的配置:
void RCC_PLLConfig( uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)
RCC_PLLSource為選擇的輸入時鍾源,在這里為HSE
PLLM:VCO輸入時鍾分頻因子,取值2-63 經分頻后輸入時鍾范圍要在1-2M內
PLLN:VCO輸出時鍾倍頻因子,取值192-432經倍頻后輸出時鍾范圍要在192-432
PLLP:SYSCLK時鍾分頻因子,取值2、4、6、8
PLLQ:OTG、FS、SDIO、RNG時鍾分頻因子,取值4-15,分頻后最高48M
PLL_VCO輸出時鍾 = (RCC_PLLSource/PLLM)*PLLN
SYSCLK = ((RCC_PLLSource/PLLM)*PLLN)/PLLP
OTG、FS、SDIO、RNG Clock = ((RCC_PLLSource/PLLM)*PLLN)/PLLN
所以要將系統時鍾配置成120M則應設置參數(RCC_PLLSource_HSE,8,240,2,2);
在這里RCC_PLLConfig (RCC_PLLSource_HSE,8,240,2,2);
SYSClock = 8/8*240/2 = 120M
void RCC_ClockConfig(void) { RCC_DeInit(); RCC_HSEConfig( RCC_HSE_ON ); if(SUCCESS == RCC_WaitForHSEStartUp()) { RCC_HCLKConfig (RCC_SYSCLK_Div1); RCC_PCLK1Config (RCC_HCLK_Div1); RCC_PCLK2Config (RCC_HCLK_Div1); RCC_PLLConfig (RCC_PLLSource_HSE,8,240,2,2); //SYSClock = 8/8*240/2 = 120M RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus ( RCC_FLAG_PLLRDY) == RESET ) { } RCC_SYSCLKConfig ( RCC_SYSCLKSource_PLLCLK ); while(RCC_GetSYSCLKSource() != 0x08) { } } }
時鍾信號可由PA8和PC9引腳輸出查看。