10. RCC—使用 HSE/HSI 配置时钟

本章参考资料:《dm00327659-stm32mp157-advanced-armbased-32bit-mpus-stmicroelectronics》RCC章节。 《stm32mp157a.pdf》

学习本章时,配合《dm00327659-stm32mp157-advanced-armbased-32bit-mpus-stmicroelectronics》 10 Reset and clock control (RCC)章节一起阅读,效果会更佳,特别是涉及到整体框图部分。

10.1. RCC简介

RCC :reset clock control  复位和时钟控制器。用于STM32MP1处理器系统和外设的时钟产生与控制, 在时钟源选择上具备很高的灵活性,RCC时钟输入部分包含2个外部振荡器(HSE、LSE)、3个内部振荡器(HSI、CSI、LSI), 可通过设置不同的时钟源,改进功耗。

STM32MP157的M4内核的系统时钟频率最大可到209Mhz,而无论是内部还是外部的振荡器的频率都没有这么高。 想要得到更高的工作频率,可以通过PLL(Phase Locked Loop锁相环倍频分频输出)倍频得到。

10.2. RCC框图剖析

在RCC结构框图中,本章节的重点放在时钟源以及PLL锁相环、MCU时钟上,如下图所示,接下来将讲解这三部分的内容。

图 9‑1 RCC结构框图

10.2.1. 时钟源

从框图中我们可以看到rcc总的有5个时钟源,他们分别来自2个外部振荡器、3个内部振荡器。

外部时钟源

  • HSE (High Speed External高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源)。 HSE是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从 8-48 MHz不等。 当使用有源晶振时,时钟从OSC_IN引脚进入,OSC_OUT引脚悬空为高阻态,当选用无源晶振时, 时钟从OSC_IN 进入,OSC_OUT输出,并且要配谐振电容。HSE我们使用24MHz的无源晶振。

  • LSE (Low Speed External低速外部时钟,接频率为32.768kHz的石英晶体)。 通常的做法是由LSE给RTC提供时钟,大小为32.768KHZ。LSE由外接的晶体谐振器产生, 所配的谐振电容精度要求高,不然很容易不起震。

内部时钟源

  • HSI (High Speed Internal高速内部时钟,精准度1%,频率64Mhz)。 由内部提供的高速RC振荡器。精准度较低,但可以节省成本。

  • CSI (Low-power internal oscillator内部的低速振荡器,频率4MHz)。 主要用于低功耗,当设备对于功耗要求较低时,可代替64MHz的HSI。

  • LSI (Low Speed Internal低速内部时钟)。 使用场景一般用于看门狗、DAC、RTC实时时钟等。

10.2.2. PPL锁相环

PLL的主要作用是对时钟进行倍频,然后把时钟输出到各个功能部件。STM32MP157的PLL有4个, 分别是PLL1、PLL2、PLL3、PLL4,他们可以选择由HSE或者HSI、CSI提供时钟输入信号。

  • PLL1 是专用于A7时钟。

  • PLL2 主要用于AXI-SS(Sub-System)总线时钟(包含APB4,APB5 and APB6总线时钟),DDR时钟以及GPU时钟。

  • PLL3 主要用于M4以及M4的总线时钟,总线时钟上的外围设备的内核时钟。这条时钟线也是我们本章的重点。

  • PLL4 主要用于各种外围设备的内核时钟

系统在HSI时钟启动后,用户可通过配置程序选择不同的时钟源。

10.2.3. M4内核的时钟总线

不同的外设挂载在不同的时钟总线上,在下图中我们可了解到各个外设所挂载的总线情况。

图 9‑2时钟总线框图

图中主要分为三种类型的总线

  • AHB (Advanced High-performance Bus)高级高性能总线

  • APB (Advanced Peripheral Bus)高级外围总线

  • AXI (Advanced eXtensible Interface)高级可拓展接口

AXI主要是给A7外设使用的, 其中M4的时钟总线分为APB1, APB2, APB3, AHB1, AHB2, AHB3和AHB4时钟总线, 不同的外设挂载在不同的总线上,如之前我们使用的GPIO时钟就是挂载在AHB4总线上。 而APB总线相对的时钟频率(最大的时钟频率为104.5Mhz)较低,连接有I2C、SPI、USART等相对低速的外设。

10.3. STM32CubeIDE时钟树框图剖析

STM32MP157的时钟树十分庞杂,如下图所示

图 9‑3时钟总线框图

我们选取了PLL3作为主线进行讲解,掌握了这条主线之后,想要弄清楚 整个时钟树并不难。 让我们从左到右看这个条线的配置过程。

图 9‑4 PLL3总线

在下图中可以看到PPL3有三个时钟源可以选择,分别是HSI、CSI、HSE,而其中的HSE为灰色状态,为不可选中。 我们需要在RCC中配置使能HSE。

图 9‑5

配置完下面内容之后,再次回到时钟树配置,可看到HSE可以选择了

图 9‑6 图 9‑7

同时最左边可选择实际上的晶振频率大小。我们的实验板上的晶振大小为24Mhz,这里默认也是24Mhz便不用修改。 在图片的右边可以选择对HSE进行分频还是倍频,在STM32CubeIDE中我们并不需要手动对这些参数进行配置。

接下来是选择MCU(M4)的时钟源,MCU的时钟源有以下四种选择,分别是HSI、CSI、HSE以及PLL3P。

图 9‑8

我们知道HSI的时钟频率为64Mhz、CSI为4Mhz、HSE为24Mhz,而我们想要将M4内核设置成最大的209Mhz的工作频率, 只能选择PPL3锁相环倍频之后的时钟。选择PLL3P之后,将方框修改为209Mhz的时钟频率,按下回车软件即可算出合适的 PLL3分频倍频系数,将MCU的时钟频率修改为209Mhz。

图 9‑9

在完成M4时钟的选择之后,在时钟树的右边APB1、APB2以及APB3显示为红色标记,将鼠标移至上面可发现 他们最大的工作频率为104.5,而现在选框中的数值为209已经超出了最大可设置频率。

图 9‑10

因此我们需要手动修改这三条时钟总线的频率。我们只选中其中一个红色区域修改为104.5之后按回车, 其他两条时钟总线也会跟着修改,如下图所示

图 9‑11

10.3.1. 其他时钟

通过上面的学习相信读者对如何设置系统时钟有了一定的认识,剩下部分我们以几个外设时钟为例。 讲解该如何配置外设时钟,并不是所有的外设都需要额外配置时钟,一般只有对于时序有要求的外设才 需要配置时钟。

10.3.1.1. RTC时钟及独立看门狗时钟

图 9‑12

RTC时钟配置为于整个系统时钟树的左上角, RTC时钟源可以是 HSE 1MHz(HSE由一个可编程的预分频器分频)、 LSE或者LSI时钟。 我们通常的做法是由LSE给RTC提供时钟,大小为32.768KHZ。 LSE由外接的晶体谐振器产生,所配的谐振电容精度要求高,不然很容易不起振。

独立看门狗时钟由内部的低速时钟LSI提供,大小为32KHZ。

10.3.1.2. 串口时钟

图 9‑13

在工程中我们并没有使用到串口,这里的图形显示为灰色, 但从图上我们可以看出串口USART1有6个可选的时钟源。

10.4. 配置系统时钟实验

配置系统时钟的实验会比较简单,HAL库使用了全局变量 SystemCoreClock 来保存系统的工作频率, 板子在刚上电时使用的是内部64M的HSI时钟,我们将选择外部HSE时钟倍频得到的209Mhz作为 时钟源,我们只需要在程序调试中查看配置时钟前以及配置时钟后的 SystemCoreClock 变量即可知道系统时钟是否被正确配置。

我们将直接使用之前的工程进行实验,任意工程均可。这里我们使用的是之前按键的工程

打开02KEY.ioc文件,随后选择System Core中的RCC,使能HSE,选择Crystal/Ceramic Resonator,即陶瓷晶振。

图 9‑14

选择HSE为PLL3的时钟源,并选择PLL3P为MCU的时钟源。

图 9‑15

手动输入MCU的时钟频率为209Mhz,修改后面红色部分时钟频率为104.5Mhz。

图 9‑16

最终MCU时钟树的配置如下所示

图 9‑17

10.4.1. 下载验证

生成代码后重新编译并进入debug模式。

图 9‑18 图 9‑18 图 9‑18