STM32F4XX系统时钟配置

stm32f4系统时钟配置
1.时钟树的介绍:
数据手册第六章时钟的介绍里有stm32f4的时钟树的图:
tu16
Stm32有5个时钟源,分别是: LSI(内部的低速时钟),LSE(外部的低速时钟),
HSI(内部的高速时钟),HSE(外部的高速时钟),PLL(分为PLL和PLLI2S)。

LSI给独立看门狗和内部的RTC提供时钟;
LSE对应两个管脚,用来再外部连接两个晶振。它可以指向RTC(一般使用这个时钟来向RTC提供时钟),
还可以指向MCO1;
HSI通过RC振荡器产生,大小为16M,可以给系统时钟提供来源,还可以指向MCO1这个管脚,
还可以流向PLL锁相环。
HSE一般我们设置为8M,可以流向系统时钟,我们的系统时钟就是为系统时钟提供来源(一般不使用HSI内部时钟,当外部时钟HSE损坏时,系统会自动把HSI作为系统时钟来源),
还可以流向PLL,经过分频器。
PLL锁相环,作用是倍频输出,系统时钟就是由HSE提供的8M频率,通过PLL来倍频输出达到168M。

2.系统时钟的来源
tu17
图上画出了HSE作为系统时钟的时钟源,从8M为系统时钟提供168M的过程。
8M经过M分频,取M=8,此时为1M
然后经过N倍频,取N=336,此时为336M
然后经过P分频,取P=2,此时为168M提供给系统时钟。
这是系统时钟的默认配置方法。

3.系统时钟的设置
实验要做的时将系统时钟为84MHZ,来使延时函数的延时时长变为之前的2倍。
我们要再main.c中添加一个void RCC_HSE_Config(u32 pllm,u32 plln,u32 pllp,u32 pllq)
这个函数的功能就是设置M,N,P的值来改变系统时钟。代码如下:
void RCC_HSE_Config(u32 pllm,u32 plln,u32 pllp,u32 pllq)
{
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟,因为AHB的时钟等于系统时钟,所以将系统时钟一分频就是AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速APB2时钟,设置为84M
RCC_PCLK2Config(RCC_HCLK_Div4);//设置低速APB1时钟,设置为42M
RCC_PLLConfig(RCC_PLLSource_HSE,pllm,plln,pllp,pllq);
RCC_PLLCmd(ENABLE);//控制PLL使能或者失能
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
//检查PLLRDY的RCC标志位是否设置,PLL就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟为PLLCLK
while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源
}

}
然后再main函数中调用函数,更改参数就能达到目的,RCC_HSE_Config(8,336,4,7);
这时就能观察到,延时的时长是之前的两倍。
tu18