STM32F系列微處理器,或者說是Cortex-M3內(nèi)核的MCU內(nèi),,都集成了一個(gè)叫PLL的東西。PLL就是鎖相回路或鎖相環(huán)(Phase Locked Loop),,用來統(tǒng)一整合時(shí)脈訊號(hào),,使內(nèi)存能正確的存取資料。PLL用于振蕩器中的反饋技術(shù),,將外部的輸入信號(hào)與內(nèi)部的振蕩信號(hào)同步,鎖相環(huán)路的基本方框圖如下圖所示,。一句話,PLL用來控制STM32F的時(shí)鐘頻率的??偠灾?,STM32F系列MCU使用了這個(gè)東西,而我們?cè)?em>MCU上電之后,,也就要對(duì)其正確的初始化,,這樣,我們才能得到我們需要的時(shí)鐘配置,。 本文引用地址:http://www.eepw.com.cn/article/182408.htm在ST公司的外設(shè)固件庫的示例里,,對(duì)于工程項(xiàng)目文件,ST并沒有在啟動(dòng)函數(shù)main()里初始化PLL,,因?yàn)槠湟呀?jīng)在硬件初始化階段完成對(duì)系統(tǒng)時(shí)鐘的配置,。這樣也就帶了一個(gè)問題,ST庫里的均使用了外設(shè)8MHz的晶振,,而我們平時(shí)的項(xiàng)目就一定采用的是這個(gè)頻率,,實(shí)際配置的低于8MHz,,MCU不能全速運(yùn)行,高于8MHz,外設(shè)時(shí)鐘即配置失敗,,甚至無法運(yùn)行。那么如何重新配置時(shí)鐘就需要我們一線的工程師們重新設(shè)計(jì)了,。 ST庫里的硬件初始化階段的代碼是用寄存器方式編寫的,,不利于我們閱讀與參考。也正是出于這個(gè)原因,,小編使用庫函數(shù)重新編寫了STM32F系統(tǒng)時(shí)鐘PLL初始化過程,與大家分享,,期待共同提高與進(jìn)步,。 /********************************************************************************************************* ** Function name: static void SysClockInit(void) ** Descriptions: 配置SYSCLK, HCLK, PCLK2與PCLK1 ** Created by: Jobs Zheng ** Created Date: 2013-03-06 09:35 *********************************************************************************************************/ static void SysClockInit(void) { RCC_DeInit();/* RCC重置 */ RCC_HSEConfig(RCC_HSE_ON); /*(使能HSE)*/ HSEStartUpStatus = RCC_WaitForHSEStartUp();/*(等待HSE使能結(jié)束)*/ if (HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 配置HCLK = SYSCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 配置PCLK2 = HCLK */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 配置PCLK1 = HCLK/2 */ /* 超級(jí)重要的,、需要配置的地方在這里 */ /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* RCC_PLLSource_HSE_Div1為外置晶振的分頻系數(shù);RCC_PLLMul_9為倍頻數(shù) */ RCC_PLLCmd(ENABLE); while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 選定PLL為系統(tǒng)主時(shí)鐘 */ while(RCC_GetSYSCLKSource() != 0x08) { } } else { /* 配置失敗將程序停留在這里 */ while (1) { } } } 上述C語言的文件仍需要#include "stm32f10x.h"的頭文件來調(diào)用ST固件庫,。 就像ST官方說明文檔所說,STM32F系列MCU支持4M-16MHz的外置晶振,,因此,,大家在沒有官方默認(rèn)的8Mhz晶振下,,大可不必苦惱,,只需要添加上面的這個(gè)初始化函數(shù),,你就可以任意使用外置晶振了,。 祝大家工作順利,編程快樂 ^_^
|
|