在这里插入图片描述

1 F407_CubeMX时钟树配置(传送门)

在这里插入图片描述
在这里插入图片描述

  1. 宏定义 HSE_VALUE;
  2. 调用HAL_RCC_OscConfig()函数,配置输入时钟源;
  3. 调用HAL_RCC_ClockConfig()函数,配置系统时钟源以及 SYSCLK、AHB、APB1 和 APB2 相关参数;
  4. 在main函数中调用sys_stm32_clock_init()函数并设置形参;

注意:第2点和第3点中的函数均在sys_stm32_clock_init()函数中调用,main函数中只调用sys_stm32_clock_init()函数,且sys_stm32_clock_init()函数的描述在sys.c中,main.c中只配置该函数的四个形参。

为便于查找,在后续新项目的时钟系统配置时可以直接按照下图参数进行配置。具体详解见后文。

2 STM32F407时钟树

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

由于时序电路的重要性,因此在MCU设计时就设计了专门用于控制时序的电路,在芯片设计中称为时钟树设计。由此设计出来的时钟,可以精确控制我们的单片机系统,这也是我们这节要展开分析的时钟分析。为什么是时钟树而不是时钟呢?一个MCU越复杂,时钟系统也会相应地变得复杂,如STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。

对于STM32F4系列的芯片,正常工作的主频可以达到168Mhz,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十Khz的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。

2.1 STM32F407时钟系统图

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

如下图为一个简化的STM32F4时钟系统。图中已经把我们主要关注几处标注出来。

在这里插入图片描述

A部分表示输入时钟源,可分为外部时钟源和内部时钟源;
B为锁相环“PLL”;
C为我们重点需要关注的系统时钟源选择器,此项决定了MCU的系统主时钟“SYSCLK”的大小;AHB预分频器将SYSCLK分频或不分频后分发给其它外设进行处理,包括到D部分的Cortex-M内核系统的时钟和使能单元。
E为定时器以及其它外设的时钟源APB1/APB2。F是STM32的MCO时钟输出功能。

2.2 STM32F103时钟树简图

2.2.1 高速部分

在这里插入图片描述
HSE 4~26 MHz,HIS 16 MHz,F407的SYSCLK最大168MHz,无法达到,所以要/M分频之后,通过PLL锁相环,F1系列的锁相环只有一个2-16倍频器,F4的PLL中首先会经过一个*N的倍频器,再经过一个/P分频,作为系统时钟SYSCLK,经过/Q分频可以作为其他外设的时钟。
SYSCLK系统时钟,经过一个“/”分频器(分频系数一般为1,不分频),来到AHB系统总线时钟(HCLK)。
AHB1经过“/”分频之后,经过桥接到达APB1 / APB2,APB1中,最大频率为42MHz。

2.2.2 低速部分

在这里插入图片描述

2.3 时钟源

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

在这里插入图片描述
H: high 高
L: low
S: speed 速
I:internal
E: external 外部

2.3.1 外部时钟源

① 高速外部振荡器HSE (High Speed External Clock signal),外接石英/陶瓷谐振器,频率为4MHz~26MHz。本开发板使用的是8MHz。
② 低速外部振荡器LSE (Low Speed External Clock signal),外接32.768kHz石英晶体,主要作用于RTC的时钟源。
外部时钟源都是芯片外部晶振产生的时钟频率,故而都有精度高的优点。

2.3.2 内部时钟源:

① 高速内部振荡器HSI(High Speed Internal Clock signal),由内部RC 振荡器产生,频率为16MHz。
② 低速内部振荡器LSI(Low Speed Internal Clock signal),由内部RC振荡器产生,频率为32kHz,可作为独立看门狗的时钟源。
芯片上电时默认由内部的HSI时钟启动,如果用户进行了硬件和软件的配置,芯片才会根据用户配置调试尝试切换到对应的外部时钟源,所以同时了解这几个时钟源信号还是很有必要的。如何设置时钟的方法我们会在后文提到。

2.4 PLL锁相环

锁相环是自动控制系统中常用的一个反馈电路,在STM32主控中,锁相环的作用主要有两个部分:输入时钟净化和倍频。前者是利用锁相环电路的反馈机制实现,后者我们用于使芯片在更高且频率稳定的时钟下工作。
在STM32中,锁相环的输出也可以作为芯片系统的时钟源。根据图F407的时钟结构,使用锁相环时只需要进行三个部分的配置。为了方便查看,截取了使用PLL作为系统时钟源的配置部分,如图所示。

在这里插入图片描述

2.4.1 PLL Source Mux:PLL时钟源选择器

图中标号①表示的是PLL时钟源的选择器,由寄存器RCC_PLLCFGR的bit22位进行控制,关于该寄存器的描述可参考《STM32F4xx参考手册_V4(中文版).pdf》第116页,如下图所示:

在这里插入图片描述
它有两种可选择的输入源:一个是内部时钟HSI信号,另一个是外部时钟HSE信号。

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

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

在这里插入图片描述
从F407参考手册可得到它的值范围是:0~63。

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

图中③所表示的配置锁相环倍频系数,同样地可以查到在STM32F4系列中,ST设置它的有效倍频范围为2~16倍。
要实现168MHz的主频率,我们通过选择HSE分频作为PLL输入的时钟信号,输入8Mhz,8分频,即1MHz,通过标号③选择倍频因子,我们选择336倍频,这样可以得到时钟信号为1*336=336MHz,然后经过2分频,得到168MHz。

2.5 系统时钟SYSCLK

STM32的系统时钟SYSCLK为整个芯片提供了时序信号。我们已经大致知道STM32主控是时序电路链接起来的。对于相同的稳定运行的电路,时钟频率越高,指令的执行速度越快,单位时间能处理的功能越多。STM32的系统时钟是可配置的,在STM32F4系列中,它可以为HSI、PLLCLK、HSE中的一个,通过CFGR的位SW[1:0]设置。

讲解PLL作为系统时钟时,根据我们开发板的资源,可以把主频通过PLL设置为168MHz。从上面的时钟树图可知,AHB、APB1、APB2、内核时钟等时钟通过系统时钟分频得到。根据得到的这个系统时钟,下面我们结合外设来看一看各个外设时钟源。

在这里插入图片描述

2.6 函数配置

在这里插入图片描述
时钟源、PLL:

HAL_RCC_OscConfig()

系统时钟、总线

HAL_RCC_ClockConfig()

使能外设时钟

_HAL_RCC_PPP_CLK_ENABLE()

扩展外设时钟(PLLI2S/I2S/LTDC/RTC等)

HAL_RCCEx_PeriphCLKConfig()

2.7 STM32CubeMX时钟树配置(F407)

在这里插入图片描述
标号①表示的是 PLL 时钟源的选择器,可选HSI 信号,或HSE信号;
标号②表示主PLL输入时钟的分频系数,可选0~63;
标号③表示配置锁相环倍频系数,即选择倍频因子,有三个参数PPL_N、PPL_N、PPL_Q;
在这里插入图片描述
标号④为系统时钟输入源选择,可选HSI、PLLCLK、HSE中的一个;

标号⑤为AHB预分频器,可选择分频系数:1,2,4,8,16,32,64,128,256,512;

AHB总线时钟直接作为 GPIO(A\B\C\D\E\F\G\H\I)、以太网、DCMI、FSMC、AHB总线、Cortex内核、存储器和 DMA 的 HCLK时钟,并作为 Cortex 内核自由运行时钟FCLK。
标号⑥为APB1预分频器,分频因子可以选择 1, 2,4,8,16,

#注意:与APB1低速总线连接的外设有:看门狗定时器、定时器2/3/4/5/6/7、RTC 时钟、USART2/3/4/5、SPI2(I2S2)、SPI3(I2S3)、I2C1~3、CAN 、2个DAC。

标号⑦为APB2预分频器,分频因子可以选择 1, 2,4,8,16,

#注意:与 APB2高速总线连接的外设有:定时器1/8/9/10/11、SPI1、USART1和USART6、3个ADC和SDIO接口。

标号⑧决定了定时器时钟频率,该位由硬件自动设置,分为两种情况:

1、如果APB预分频器为 1,则定时器时钟频率等于APB域的频率;

2、否则,等于APB域的频率的两倍(×2)。

标号⑨是RTC时钟,其时钟源有三个途径:HSE/x(x = 2~31)、LSE 或 LSI。

2.8 F407 的时钟配置的意义

  1. 确保系统正常运行:时钟为 STM32F407 工作提供稳定的机器周期,是系统运行的基础。就像人的心脏为身体各器官提供动力一样,时钟为 CPU 及各种外设提供基本的时序信号,使其能按照预定节奏执行指令和操作。若时钟配置不正确,CPU 无法正常执行指令,整个系统将无法工作,例如时钟频率设置异常可能导致系统性能下降或不稳定,甚至无法满足实时性要求。

  2. 优化系统性能:通过合理配置时钟,可以优化系统性能。一方面,可根据应用需求调整时钟频率来提高处理速度,在对性能要求高的场景(如实时图像处理、高速数据采集等),适当提高时钟频率能加快数据处理速度,但需注意提高频率可能会带来功耗增加和散热问题,要在性能和功耗间权衡;另一方面,在一些低功耗应用中,可通过降低时钟频率、关闭不必要的时钟源或使用时钟门控技术来降低功耗,例如在电池供电的设备中,降低功耗可延长电池寿命。

  3. 满足外设同步要求:嵌入式系统中,数据传输与通信(如串口通信、SPI、I2C 总线等)以及多处理器系统协作都需要时钟同步。不同的通信接口和多处理器之间通常需要特定的时钟频率和相位关系来确保数据准确传输和协调工作,正确配置时钟系统能使这些设备和处理器之间的时钟同步,避免数据传输错误和通信故障。

  4. 适应不同应用场景:在实时性要求严格的控制系统中,时钟配置要确保系统能满足对时间准确性和响应速度的高要求,以及时处理各种事件和中断;而对于低功耗的便携式设备或物联网设备,需通过合理的时钟配置在满足系统功能的前提下降低功耗,延长设备续航时间。

2.9 F407 相较于 F103

  1. STM32F407:有四个时钟源,即高速内部时钟(HSI)频率为 16MHz、高速外部时钟(HSE)频率范围为 4 - 26MHz、低速内部时钟(LSI)频率约为 32kHz、低速外部时钟(LSE)频率为 32.768kHz。HSE 可作为系统时钟和 PLL 锁相环输入,还能分频后输入给 RTC;LSI 可作为独立看门狗和 RTC 的时钟源;HSI 可作为系统时钟或 PLL 锁相环的输入。此外,STM32F407 有两个 PLL(锁相环),主 PLL 用于生成高速的系统时钟(最高 168MHz)等,另一个 PLL 用于生成特定的时钟信号。

  2. STM32F103:也有四个时钟源,高速外部时钟(HSE)一般采用 8MHz 晶振,高速内部时钟(HSI)为 8MHz,低速外部时钟(LSE)主要用于实时时钟模块,一般为 32.768kHz,低速内部时钟(LSI)约为 40kHz。STM32F103 只有一个 PLL,用于倍频输出,其输出频率最高为 72MHz,可为 USB 提供时钟,系统时钟(SYSCLK)可由内部或外部高速时钟直接提供,也可由内、外部高速时钟经 PLL 倍频后提供。

  3. 总线架构与性能不同:STM32F407:GPIO 挂载在 AHB1 总线上。AHB 是高速总线,性能相对更好,数据传输速度快,能够满足更高的数据吞吐量和更快的外设响应需求,这对于需要处理大量数据或对实时性要求较高的应用非常有利STM32F103:GPIO 挂载在 APB2 总线时钟上。APB 总线相对 AHB 总线速度较低,适用于对性能要求不那么极致的常规外设控制。

  4. 时钟配置灵活度不同:STM32F407:时钟配置更加灵活复杂,有更多的时钟源选择和 PLL 配置选项,能满足更复杂的应用场景和多样化的性能需求。例如,通过配置主 PLL 的相关参数(如 PLL_M、PLL_N、PLL_P 等),可以得到不同频率的系统时钟,以适应各种对系统时钟频率有不同要求的任务。STM32F103:相对来说时钟配置选项较少,灵活性稍低,但对于一些简单的应用场景,其时钟配置相对更简洁明了,容易上手和掌握。

  5. 最高系统时钟频率不同:STM32F407:系统时钟频率更高,官方推荐使用的最高稳定时钟频率可达 168MHz,能够支持更高的运算处理能力和更快的系统响应速度,可胜任对性能要求苛刻的复杂应用。STM32F103:系统时钟频率一般最高为 72MHz,在一些对性能要求极高的应用中,可能无法满足需求,但对于许多常规的嵌入式应用来说,也能够提供足够的处理能力。

在这里插入图片描述

注:笔记内容来自正点原子官方HAL库开发教程,配合STM32F407探索者开发板

参考文章:
https://blog.csdn.net/weixin_47040031/article/details/138626580
https://blog.csdn.net/Williamair/article/details/124069175
https://blog.csdn.net/aElect/article/details/141719876
https://blog.csdn.net/fzf1996/article/details/88647016
https://m.eeworld.com.cn/ic_article/482/468265.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐