天天看點

STM32再學習——時鐘初始化

轉載自:http://www.edw.com.cn/407

      STM32F系列微處理器,或者說是Cortex-M3核心的MCU内,都內建了一個叫PLL的東西。PLL就是鎖相回路或鎖相環(Phase Locked Loop),用來統一整合時脈訊号,使記憶體能正确的存取資料。PLL用于振蕩器中的回報技術,将外部的輸入信号與内部的振蕩信号同步,鎖相環路的基本方框圖如下圖所示。一句話,PLL用來控制STM32F的時鐘頻率的。總而言之,STM32F系列MCU使用了這個東西,而我們在MCU上電之後,也就要對其正确的初始化,這樣,我們才能得到我們需要的時鐘配置。

STM32再學習——時鐘初始化

      在ST公司的外設固件庫的示例裡,對于工程項目檔案,ST并沒有在啟動函數main()裡初始化PLL,因為其已經在硬體初始化階段完成對系統時鐘的配置。這樣也就帶了一個問題,ST庫裡的均使用了外設8MHz的晶振,而我們平時的項目就一定采用的是這個頻率,實際配置的低于8MHz,MCU不能全速運作,高于8MHz,外設時鐘即配置失敗,甚至無法運作。那麼如何重新配置時鐘就需要我們一線的工程師們重新設計了。

      ST庫裡的硬體初始化階段的代碼是用寄存器方式編寫的,不利于我們閱讀與參考。也正是出于這個原因,小編使用庫函數重新編寫了STM32F系統時鐘PLL初始化過程,與大家分享,期待共同提高與進步。

/*********************************************************************************************************
** 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使能結束)*/
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 */
/* 超級重要的、需要配置的地方在這裡 */
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* RCC_PLLSource_HSE_Div1為外置晶振的分頻系數;RCC_PLLMul_9為倍頻數 */
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 標明PLL為系統主時鐘 */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
else
{ /* 配置失敗将程式停留在這裡 */
while (1)
{
}
}
}
           

    上述C語言的檔案仍需要#include "stm32f10x.h"的頭檔案來調用ST固件庫。

    就像ST官方說明文檔所說,STM32F系列MCU支援4M-16MHz的外置晶振,是以,大家在沒有官方預設的8Mhz晶振下,大可不必苦惱,隻需要添加上面的這個初始化函數,你就可以任意使用外置晶振了。

    祝大家工作順利,程式設計快樂 ^_^