STM32系统时钟
参考资料
阿波罗STM32F429开发板:
《STM32F429开发指南-库函数版本》-4.3小节 STM32F4时钟系统
STM32F4xx官方资料:
《STM32F4xx中文参考手册》-第6章 复位和时钟控制
笔记基于正点原子官方视频
视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.1007.top_right_bar_window_history.content.click
如有侵权,联系删除
1.系统时钟框图
放大图:
在STM32F429中,有5个最重要的时钟源,为 HSI、HSE、LSI、LSE、PLL。其中 PLL实际是分为三个时钟源,分别为主 PLL 和 I2S 部分专用 PLLI2S 和 SAI 部分专用 PLLSAI。从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HSI,HSE 以及 PLL 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他的是内部时钟源。
2.STM32F4系列的5个时钟源:HSI、HSE、LSI、LSE、PLL
① LSI 是低速内部时钟,RC 振荡器,频率为 32kHz 左右。供独立看门狗和自动唤醒单元使用。
② LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。
③ HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。我们的开发板接的是 25M 的晶振。HSE 也可以直接做为系统时钟或者 PLL 输入。
④ HSI 是高速内部时钟,RC 振荡器,频率为 16MHz。可以直接作为系统时钟或者用作 PLL输入。
⑤ PLL 为锁相环倍频输出。STM32F4 有三个 PLL:
1)主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。第一个输出 PLLP 用于生成高速的系统时钟(最高 180MHz);第二个输出 PLLQ 为 48M 时钟,用于 USB OTG FS 时钟,随机数发生器的时钟和 SDIO时钟。
2)第一个专用 PLL(PLLI2S)用于生成精确时钟,在 I2S 和 SAI1 上实现高品质音频性能。其中,N 是用于 PLLI2S vco 的倍频系数,其取值范围是:192~432;R 是 I2S 时钟的分频系数,其取值范围是:2~7;Q 是 SAI 时钟分频系数,其取值范围是:2~15;P 没用到。
3 )第二个专用 PLL(PLLSAI)同样用于生成精确时钟,用于 SAI1 输入时钟,同时还为 LCD_TFT接口提供精确时钟。其中,N 是用于 PLLSAI vco 的倍频系数,其取值范围是:192~432;Q 是 SAI 时钟分频系数,其取值范围是:2~15;R 是 LTDC 时钟的分频系数,其取值范围是:2~7;P 没用到。
这里我们着重看看主 PLL 时钟第一个高速时钟输出 PLLP 的计算方法。
可以看出。主 PLL 时钟的时钟源要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器出来之后还需要经过一个分频系数为 P(第一个输出 PLLP)或者 Q(第二个输出 PLLQ)的分频器分频之后,最后才生成最终的主 PLL 时钟。
例如我们的外部晶振选择 25MHz。同时我们设置相应的分频器 M=25,倍频器倍频系数 N=360,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:
PLL=25MHz * N/ (M*P)=25MHz* 360 /(25*2) = 180MHz
如果我们选择HSE为PLL时钟源,同时SYSCLK时钟源为PLL,那么SYSCLK时钟为 180MHz。
3.时钟源给各个外设以及系统提供时钟的方式
用图中 A~O 标示要讲解的地方
A.这里是看门狗时钟输入。从图中可以看出,看门狗时钟源只能是低速的 LSI 时钟。
B. 这里是 RTC 时钟源,从图上可以看出,RTC 的时钟源可以选择 LSI,LSE,以及HSE 分频后的时钟,HSE 分频系数为 2~31。
C. 这里是 STM32F429 输出时钟 MCO1 和 MCO2。MCO1 是向芯片的 PA8 引脚输出时钟。它有四个时钟来源分别为:HSI,LSE,HSE 和 PLL 时钟。MCO2 是向芯片的PC9 输出时钟,它同样有四个时钟来源分别为:HSE,PLL,SYSCLK 以及 PLLI2S时钟。MCO 输出时钟频率最大不超过 100MHz。
D. 这里是系统时钟。从图 4.3.1 可以看出,SYSCLK 系统时钟来源有三个方面:HSI,HSE 和 PLL。在我们实际应用中,因为对时钟速度要求都比较高我们才会选用 STM32F429 这种级别的处理器,所以一般情况下,都是采用 PLL 作为 SYSCLK时钟源。根据前面的计算公式,大家就可以算出你的系统的 SYSCLK 是多少。
E. 这里我们指的是以太网 PTP 时钟,AHB 时钟,APB2 高速时钟,APB1 低速时钟。这些时钟都是来源于 SYSCLK 系统时钟。其中以太网 PTP 时钟是使用系统时钟。AHB,APB2 和 APB1 时钟是经过 SYSCLK 时钟分频得来。这里大家记住,AHB最大时钟为168MHz, APB2高速时钟最大频率为84MHz,而APB1低速时钟最大频率为 42MHz。
F. 这里是指 PLLI2S_R 时钟,可以作为 I2S 时钟源。
G. 这里是指 PLLI2S_Q 时钟,可以作为 SAI1_A 和 SAI1_B 时钟来源。
H. 这里是指 PLLSAI_Q 时钟,可以作为 SAI1_A 和 SAI1_B 时钟来源。
I. 这里是指 PLLSAI_R 时钟,是 LCD-TFT(LTDC)接口时钟唯一来源。
J. 这里是 I2S 的时钟,通过寄存器 I2SSRC 选择内部 PLLI2SCLK 还是外部 I2SCKIN作为时钟。阿波罗 STM32 没用到 I2S 音频接口(用 SAI),所以这里不用设置。
K. 这里是 SAI1_A 的时钟,通过寄存器 SAI1ASRC 选择内部 PLLSAI_Q、PLLI2S_Q还是外部 I2SCKIN 作为时钟。阿波罗 STM32 使用 SAI1_A 驱动 WM8978,时钟源来自 PLLSAI_Q。
L. 这里是 SAI1_B 接口的时钟,通过寄存器 SAI1BSRC 选择内部 PLLSAI_Q、PLLI2S_Q 还是外部 I2SCKIN 作为时钟。阿波罗没用到 SAI1_B 输出,所以这里不用设置。
M. 这里是 LTDC 接口的时钟,LTDC 的时钟,固定为 PLLSAI_R,不可更改。
N. 这是 STM32F4 内部以太网 MAC 时钟的来源。对于 MII 接口来说,必须向外部PHY 芯片提供 25Mhz 的时钟,这个时钟,可以由 PHY 芯片外接晶振,或者使用STM32F4 的 MCO 输出来提供。然后, PHY 芯片再给 STM32F4 提 供ETH_MII_TX_CLK 和 ETH_MII_RX_CLK 时钟。对于 RMII 接口来说,外部必须提供 50Mhz 的时钟驱动 PHY 和 STM32F4 的 ETH_RMII_REF_CLK,这个 50Mhz时钟可以来自 PHY、有源晶振或者 STM32F4 的 MCO。我们的开发板使用的是RMII 接口,使用 PHY 芯片提供 50Mhz 时钟驱动 STM32F4 的ETH_RMII_REF_CLK。
O. 这里是指外部 PHY 提供的 USB OTG HS(60MHZ)时钟。
4.系统时钟SYSCLK可来源于三个时钟源
- HSI振荡器时钟
- HSE振荡器时钟
- PLL时钟
5.STM32F4时钟信号输出MCO1(PA8)和MCO2(PC9)
- MCO1:用户可以配置预分频器(1~5)向MCO1引脚PA8输出4个不同的时钟源:
✓ HIS
✓ LSE
✓ HSE
✓ PLL - MCO2:用户可以配置预分频器(1~5)向MCO2引脚PC9输出4个不同的时钟源:
✓ HSE
✓ PLL
✓ SYSCLK
✓ PLLI2S
MCO最大输出时钟不超过100MHz
6.任何一个外设在使用之前,必须首先使能其相应的时钟。
RCC时钟控制相关寄存器定义在stm32f429xx.h中。
结构体: RCC_TypeDef;
RCC时钟相关定义和函数在文件:
stm32f4xx_hal_rcc.h
stm32f4xx_hal_rcc.