STM32时钟系统

认识时钟树

        STM32 内部是由多种多样的电路模块组合在一起实现的。当一个电路越复杂,在达到正确的输出结果前,它可能因为延时会有一些短暂的中间状态,而这些中间状态有时会导致输出结果会有一个短暂的错误,这叫做电路中的 “毛刺现象”,如果电路需要运行得足够快,那么这些错误状态会被其它电路作为输入采样,最终形成一系列的系统错误。为了解决这个问题,在单片机系统中,设计时以 时序电路 控制替代纯粹的组合电路,在每一级输出结果前对各个信号进行采样,从而使得电路中某些信号即使出现延时也可以保证各个信号的同步,可以避免电路中发生的 “毛刺现象”,达到精确控制输出的效果。

        由于时序电路的重要性,因此在 MCU 设计时就设计了专门用于控制时序的电路,在芯片
设计中称为时钟树设计。为什么是时钟树而不是时钟呢?一个 MCU 越复杂,时钟系统也会相应地变得复杂,如 STM32F4 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就可以解决一切。对于 STM32F4系列的芯片,正常工作的主频可以达到 180Mhz,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 kHZ 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。

        STM32 本身非常复杂,外设非常的多,为了保持低功耗工作,STM32 的主控默认不开启这些外设功能。用户可以根据自己的需要决定 STM32 芯片要使用的功能,这个功能开关在 STM32 主控中也就是各个外设的时钟。

我们将时钟系统分为:时钟源锁相环 PLL系统时钟 SYSCLK时钟信号输出 MCO 四个部分展开介绍。

时钟源

        对于 STM32F4,输入时钟源(Input Clock)主要包括 HSI、HSE、LSI、LSE。其中,从时钟频率来分可以分为高速时钟源和低速时钟源,其中 HSI、HSE 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他是内部时钟源,芯片上电即可产生,不需要借助外部电路。下面我们看看 STM32 的时钟源。

(1) 2个外部时钟源:

        ⚫ 高速外部振荡器 (HSE)
                支持 4 MHz 到 26 MHz 频率范围内的晶振。本开发板使用的是 25MHz

        ⚫ 低速外部振荡器 (LSE)
                一般是 32.768 kHz 晶振,可用于看门狗和 RTC 实时时钟。
                2 个外部时钟源都是芯片外部晶振产生的时钟频率,故而都有精度高的优点。

(2) 2个内部时钟源:

        ⚫ 高速内部振荡器 (HSI)
                频率 16MHz 的高速 RC 振荡器,可用于系统时钟。
        ⚫ 低速内部振荡器 (LSI)
                频率约 32 kHz 的低速 RC 振荡器,可用于 RTC 实时时钟、独立看门狗和自动唤醒。
       芯片上电时默认由内部的 HSI 时钟启动,如果用户进行了硬件和软件的配置,芯片才会根据用户配置调试尝试切换到对应的外部时钟源,所以同时了解这几个时钟源信号还是很有必要的。如何设置时钟的方法我们会在后文提到

锁相环 PLL

        锁相环是自动控制系统中常用的一个反馈电路,在 STM32 主控中,锁相环的作用主要有两点:输入时钟净化和倍频。

        在 STM32 中,锁相环的输出也可以作为芯片系统的时钟源。为了方便查看,截取了使用 PLL 作为系统时钟源的配置部分,如图 11.1.2.1 所示。

         图 11.1.2.1 借用了在 CubeMX 下用锁相环配置 180MHz 时钟的一个示例:

        ◆ PLL Source Mux: PLL 时钟源的选择器

        图中标号①表示的是 PLL 时钟源的选择器,同样的,参考 F429 参考手册:

        它有两种可选择的输入源:一个是内部时钟 HSI 信号,另一个是外部时钟 HSE 信号。

        ◆ PLLM:HSE 分频器作为 PLL 输入(HSE divider for PLL entry)

        即图 11.1.2.1 在标号②的地方,主 PLL 输入时钟的分频系数,并把它的控制功能放在
RCC_PLLCFGR 寄存器中,我们引用 11.1.2.2。

         从 F429 参考手册可知 PLL 时钟分频系数的值有 63 个:0~63。

        ◆ PLLMUL:PLL 倍频系数(PLL multiplication factor)

        图中③所表示的配置锁相环倍频系数,同样地可以查到在 STM32F4 系列中,ST 设置它的
有效倍频范围为 2~16 倍。

        结合图 11.1.2.1,要实现 180MHz 的主频率,我们通过选择 HSE 分配作为 PLL 输入的时钟信号,输入 25MHz,4 分频,通过标号③选择倍频因子,我们选择 180 倍频,这样就可以得到时钟信号为 2*180=360MHz,然后经过 2 分频,得到 180 MHz。

锁相环总结

        STM32 主控中,锁相环主要用于 时钟信号净化倍频。锁相环的输出同样也可作为芯片系统的时钟源

        STM32F4xx器件有两个PLL,主 PLL 由 HSI 或 HSE提供振荡器提供时钟信号,并具有两个不同的输出时钟:
        — 第一个输出用于生成高速系统时钟(最高达 168 MHz)
        — 第二个输出用于生成 USB OTG FS 的时钟 (48 MHz)、随机数发生器的时钟(<=48 MHz) 和 SDIO 时钟 (<= 48 MHz)。
        专用 PLL (PLLI2S) 用于生成精确时钟,从而在 I2S 接口实现高品质音频性能

        PLL 由RCC_PLLCFGR寄存器进行配置。PLLI2S由RCC_CFGR寄存器配置。

        使用锁相环时需要进行三个部分的配置:

        1) PLL 时钟源选择器 

                PLL 可选择 [内部高速时钟信号 HSI],

                              或 [外部高速时钟信号 HSE] 作为时钟源。

         2)PLL 输入分频系数 M

                PLL 的 

                PLL 的 主分频系数M 可选的值为 0~63。

        3) PLL 输出倍频系数 N

        4) PLL 输出分频系数 P、Q

系统时钟 SYSCLK

        STM32 的系统时钟 SYSCLK 为整个芯片提供了时序信号。时钟频率越高,指令的执行速度越快,单位时间能处理的功能越多。

        STM32 的系统时钟是可配置的,在 STM32F4 系列中,系统时钟的时钟源可以为 HSI、HSE、PLLCLK 中的一个,通过 CRC_CFGR 的位 SW[1:0]设置。

        系统时钟生成图,标号④为系统时钟输入选择,可选时钟信号有外部高速时钟 HSE(25M)、内部高速时钟 HSI(16M)和经过倍频的 PLL CLK(180M),选择PLL CLK 作为系统时钟,此时系统时钟的频率为 180MHz。系统时钟来到标号⑤的 AHB 预分频器,其中可选择的分频系数为 1,2,4,8,16,64,128,256,512,我们选择不分频,所以 AHB 总线时钟达到最大的 180MHz。

        下面介绍一下由 AHB 总线时钟得到的时钟:

        APB1总线时钟,由HCLK经过标号⑥的低速APB1预分频器得到,分频因子可以选择 1,
2,4,8,16,这里我们选择的是 4 分频,所以 APB1 总线时钟为 45M。由于 APB1 是低速总
线时钟,所以 APB1总线最高频率为 45MHz,片上低速的外设就挂载在该总线上,例如有看门
狗定时器、定时器 2/3/4/5/6/7、RTC 时钟、USART2/3/4/5、SPI2(I2S2)与 SPI3(I2S3)、I2C1 与
I2C2、CAN、USB 设备和 2 个 DAC。

        APB2总线时钟,由HCLK经过标号⑦的高速APB2预分频器得到,分频因子可以选择 1,2,4,8,16,这里我们选择的是 2即是 2 分频,所以 APB2 总线时钟频率为 90M。与 APB2 高速总线连接的外设有外部中断与唤醒控制、7 个通用目的输入/输出口(PA、PB、PC、PD、PE、PF 和 PG)、定时器 1、定时器 8、SPI1、USART1、3 个 ADC 和内部温度传感器。其中标号⑧是 ADC 的预分频器在后面 ADC 实验中详细说明。

        此外,AHB 总线时钟直接作为 SDIO、FMC、AHB 总线、Cortex 内核、存储器和 DMA 的HCLK 时钟,并作为 Cortex 内核自由运行时钟 FCLK。

标号⑨是 RTC 定时器,其时钟源为 HSE/2、LSE 或 LSI。

标号⑩是 MCO 输出内部时钟,STM32 的一个时钟输出 IO,它可以选择一个时
钟信号输出,可以选择为 PLL 输出不分频、HSI、HSE、或者系统时钟。这个时钟可以用来给
外部其他系统提供时钟源。

系统时钟总结

        STM32 系统时钟的时钟源 可以是 内部高速时钟 HSI、外部高速时钟HSE 和 锁相环PPL。系统时钟源通过CRC_SYSCFG寄存器配置。

        系统时钟包括来自 AHB总线的主系统时钟HCLK 和 经过预分频器得到的 APB1总线时钟 和 APB2总线时钟。

        时钟源选择器可以选择外部高速时钟内部高速时钟PLL时钟三者中的一个,如果选择PLL时钟作为系统时钟源,那么高速时钟会经过 主分频器M 作为PLL的输入,在PLL内部经过倍频N 和分频P分频Q,经过 分频Q 后通常 180MHz 作为系统时钟源输入 AHB总线,再分频到达 APB1总线 45MHz 和 APB2 总线 90MHz。经过 分频P 后一般作为USB等外设时钟源。

时钟信号输出MCO

        STM32 允许通过设置,通过 MCO 引脚输出一个稳定的时钟信号。在图 11.1.1 中标注为“F”的部分。以下四个时钟信号可被选作 MCO 时钟:

        ● SYSCLK
        ● HSI
        ● HSE
        ● 分频后的 PLL 时钟
        时钟的选择由时钟配置寄存器(RCC_CFGR)中的 MCO1[1:0]和 MCO2[1:0]位控制。可以通过 MCO 引脚来输出时钟信号,测试输出时钟的频率,或作为其它需要时钟信号的外部电路的时钟。

如何修改主频 

        STM32F429 默认的情况下,使用的是内部16M 的 HSI 作为时钟源,所以不需要外部晶振也可以下载和运行代码。

        下面我们来讲解如何让 STM32F429 芯片在 180MHZ 的频率下工作,这是官方推荐使用的最高的稳定时钟频率。正点原子的阿波罗 STM32F429 开发板的外部高速晶振的频率是 25MHZ,我们就是在这个晶振频率的基础上,通过各种倍频和分频得到 180MHZ 的系统工作频率。

STM32F4 时钟系统配置

1) 配置 HSE_VALUE

        讲解 stm32f4xx_hal_conf.h 文件的时候,我们知道需要宏定义 HSE_VALUE 匹配我们实际
硬件的高速晶振频率(这里是 25MHZ),代码如下:

#if !defined (HSE_VALUE) 
#define HSE_VALUE 25000000U /* 外部高速振荡器的值,单位 HZ */
#endif /* HSE_VALUE */

2) 在 main 函数里调用用户编写的时钟设置函数

        正点原子提供的 sys.c 文件中的时钟设置函数 sys_stm32_clock_init 声明如下

uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm,
                              uint32_t pllp, uint32_t pllq);

        除了配置 PLL 相关参数确定 SYSCLK 值之外,还配置了 AHB、APB1 和 APB2 的分频系数,也就是确定了 HCLK,PCLK1 和 PCLK2 的时钟值。时钟设置函数还会设置PWR模块匹配适当的电源能耗,并设置FLASH延迟,因为主频181MHz比FLASH操作速度快很多,操作速度不匹配容易写入失败。

        我们首先来看看使用 HAL 库配置 STM32F4 时钟系统的一般步骤:

        1) 配置时钟源相关参数:调用函数 HAL_RCC_OscConfig()。
        2) 配置系统时钟源以及 SYSCLK、AHB、APB1 和 APB2 的分频系数:调用函数
HAL_RCC_ClockConfig()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大象荒野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值