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时钟上,如下图所示,接下来将讲解这三部分的内容。
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内核的时钟总线¶
不同的外设挂载在不同的时钟总线上,在下图中我们可了解到各个外设所挂载的总线情况。
图中主要分为三种类型的总线
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的时钟树十分庞杂,如下图所示
我们选取了PLL3作为主线进行讲解,掌握了这条主线之后,想要弄清楚 整个时钟树并不难。 让我们从左到右看这个条线的配置过程。
在下图中可以看到PPL3有三个时钟源可以选择,分别是HSI、CSI、HSE,而其中的HSE为灰色状态,为不可选中。 我们需要在RCC中配置使能HSE。
配置完下面内容之后,再次回到时钟树配置,可看到HSE可以选择了
同时最左边可选择实际上的晶振频率大小。我们的实验板上的晶振大小为24Mhz,这里默认也是24Mhz便不用修改。 在图片的右边可以选择对HSE进行分频还是倍频,在STM32CubeIDE中我们并不需要手动对这些参数进行配置。
接下来是选择MCU(M4)的时钟源,MCU的时钟源有以下四种选择,分别是HSI、CSI、HSE以及PLL3P。
我们知道HSI的时钟频率为64Mhz、CSI为4Mhz、HSE为24Mhz,而我们想要将M4内核设置成最大的209Mhz的工作频率, 只能选择PPL3锁相环倍频之后的时钟。选择PLL3P之后,将方框修改为209Mhz的时钟频率,按下回车软件即可算出合适的 PLL3分频倍频系数,将MCU的时钟频率修改为209Mhz。
在完成M4时钟的选择之后,在时钟树的右边APB1、APB2以及APB3显示为红色标记,将鼠标移至上面可发现 他们最大的工作频率为104.5,而现在选框中的数值为209已经超出了最大可设置频率。
因此我们需要手动修改这三条时钟总线的频率。我们只选中其中一个红色区域修改为104.5之后按回车, 其他两条时钟总线也会跟着修改,如下图所示
10.3.1. 其他时钟¶
通过上面的学习相信读者对如何设置系统时钟有了一定的认识,剩下部分我们以几个外设时钟为例。 讲解该如何配置外设时钟,并不是所有的外设都需要额外配置时钟,一般只有对于时序有要求的外设才 需要配置时钟。
10.3.1.1. RTC时钟及独立看门狗时钟¶
RTC时钟配置为于整个系统时钟树的左上角, RTC时钟源可以是 HSE 1MHz(HSE由一个可编程的预分频器分频)、 LSE或者LSI时钟。 我们通常的做法是由LSE给RTC提供时钟,大小为32.768KHZ。 LSE由外接的晶体谐振器产生,所配的谐振电容精度要求高,不然很容易不起振。
独立看门狗时钟由内部的低速时钟LSI提供,大小为32KHZ。
10.3.1.2. 串口时钟¶
在工程中我们并没有使用到串口,这里的图形显示为灰色, 但从图上我们可以看出串口USART1有6个可选的时钟源。
10.4. 配置系统时钟实验¶
配置系统时钟的实验会比较简单,HAL库使用了全局变量 SystemCoreClock 来保存系统的工作频率, 板子在刚上电时使用的是内部64M的HSI时钟,我们将选择外部HSE时钟倍频得到的209Mhz作为 时钟源,我们只需要在程序调试中查看配置时钟前以及配置时钟后的 SystemCoreClock 变量即可知道系统时钟是否被正确配置。
我们将直接使用之前的工程进行实验,任意工程均可。这里我们使用的是之前按键的工程
打开02KEY.ioc文件,随后选择System Core中的RCC,使能HSE,选择Crystal/Ceramic Resonator,即陶瓷晶振。
选择HSE为PLL3的时钟源,并选择PLL3P为MCU的时钟源。
手动输入MCU的时钟频率为209Mhz,修改后面红色部分时钟频率为104.5Mhz。
最终MCU时钟树的配置如下所示
10.4.1. 下载验证¶
生成代码后重新编译并进入debug模式。