RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)

时间:2024-03-23 16:29:37
时间:2017/06/01 14:15 RCC—使用 HSE HSI 配置时钟梳理
G15电装.王维鋆

解剖RCC框图——时钟树(参考了火哥的使用手册和网上的一些资料,加上自己的理解)
下面是STM32F429的时钟树:
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
理解STM32的时钟是我们应用定时器等等的基础,首先 ,从系统时钟说起。
1.首先注意图中打蓝色圈的两个地方,HSE和HSI分别是外部时钟和内部时钟,其中HSE是高速的外部时钟信号,可接石英/陶瓷谐振器,或者接外部时钟源,HSE也可以直接做为系统时钟或者 PLL 输入(从蓝圈9处可以看出),频率范围为 4MHz~26MHz。HSE 我们使用的25M 的无源晶振所以移植时一定要格外注意。

2.注意看图中蓝圈7的部分,这里是主锁相环倍频输出,用于产生系统需要的高速时钟信号,如图绿色箭头所示(STM32还有一个副锁相环,如蓝圈8图中②锁相环 PLL 的主要作用是对时钟进行倍频.
一般而言,我们都是使用HSE经过PLL 倍频之后作为系统时钟F429系统时钟最高为 180M,这个是官方推荐的最高的稳定时钟,如果你想铤而走险,也可以超频,超频最高能到 216M。至于怎么算出来的,下面请看分析.
主 PLL 时钟的时钟源要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器出来之后的时候还需要经过一个分频系数为 P(第一个输出 PLLP)或者 Q(第二个输出 PLLQ)的分频器分频之后,最后才生成最终的主 PLL 时钟。例如我们的外部晶振选择 8MHz。同时我们设置相应的分频器 M=8,倍频器倍频系数 N=360,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:PLL=8MHz * N/ (M*P)=8MHz* 360/(8*2) = 180MHz,第一个输出时钟 PLLCLK 用于系统时钟, 故F429 里面最稳定的时钟最高是180M.
3.注意图中③系统时钟 SYSCLK,它的来源可以是HSI、 PLLCLK、 HSE,我们一般选择是设置系统时钟: SYSCLK = PLLCLK = 180M。上面也有提到。而我们下面需要用到AHB 总线时钟 HCLK,即图④位置。这里设置为 1 分频,即 HCLK=SYSCLK=180M
4.注意图中⑤⑥的位置,STM32F4 很多外设的时钟来源,即两个总线桥: APB1 和 APB2,其中 APB1是低速总线(最高 45Mhz,设置为 4 分频,即 PCLK1 = HCLK/4 = 45M),APB2 是高速总线(最高 90Mhz,设置为 2 分频,即 PCLK2 =HCLK /2= 90M
另外定时器部分,如果所在总线( APB1/APB2)的分频系数为 1,那么就不倍频,如果不为 1(比如 2/4/8/16),那么就会 2 倍频( Fabpx*2)后,作为定时器时钟输入。
   简单点说,举个APB1的例子,系统时钟是180Mhz,APB1分频系数为4(system_stm32f4xx.c配置),则APB1速度为45Mhz,但是挂靠在在该总线上的定时器,由于分频系数4而不是1,因此定时器输入频率为45Mhz x 2 =90 Mhz

这里,我们可以在STM32F4的自带库文件时钟的设置为方向分析
1.启动代码:
文件:startup_stm32f429_439xx.s
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
可以看出,在进入main函数之前,系统就调用了SystemInit函数.
那么,我们找到SystemInit函数,位于system_stm32f4xx.c
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
可以看出,对于我们的F429来说,PLL_N默认为360.其他几个宏定义也一目了然。
如果我们使用的是官方库提供的配置,且外部无源晶振25MHz,系统时钟配置为180MHz
我们找到晶振频率在文件stm32f4xx.h中进行设置的
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)

RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
综上,如果使用外部晶振25MHz,则可以得出默认配置中: 
锁相环压腔振荡器时钟PLL_VCO =(HSE_VALUE/PLL_M)* PLL_N=25/ 25* 360 =360MHz 
系统时钟SYSCLK = PLL_VCO / PLL_P=360 / 2 = 180MHz .
而对于USB时钟 = PLL_VCO / PLLQ=360 / 7 = 51.7MHz.

在SetSysClock函数中,配置了系统时钟,PLL倍频以及分频系数:
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)
如果外部时钟启动失败,系统会使用默认的内部系统时钟 
默认配置: 
HCLK = SYSCLK / 1 = 180MHz ,AHB总线时钟
PCLK2 = HCLK / 2 =90MHz
PCLK1 = HCLK / 4 = 45MHz