STM32F系列微处理器,或许说是Cortex-M3内核的MCU内,都集成了一个叫PLL的东西。PLL便是锁相回路或锁相环(Phase Locked Loop),用来一致整合时脉信号,使内存能正确的存取材料。PLL用于振动器中的反应技能,将外部的输入信号与内部的振动信号同步,锁相环路的根本方框图如下图所示。一句话,PLL用来操控STM32F的时钟频率的。总而言之,STM32F系列MCU运用了这个东西,而咱们在MCU上电之后,也就要对其正确的初始化,这样,咱们才干得到咱们需求的时钟装备。
在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晶振下,大可不必苦恼,只需求增加上面的这个初始化函数,你就可以恣意运用外置晶振了。
祝我们工作顺利,编程高兴 ^_^