当前位置:网站首页>单片机学习笔记5--STM32时钟系统(基于百问网STM32F103系列教程)

单片机学习笔记5--STM32时钟系统(基于百问网STM32F103系列教程)

2022-07-23 05:43:00 山、

第五章 STM32时钟系统

第一节 STM32的时钟树

时钟对于单片机来说意义重大,没有时钟单片机就无法工作,STM32的任何外设在没有时钟的情况下,都不会工作,所以如果想要让某个外设工作,第一步就是开启他的时钟。

由于STM32本身十分复杂,外设非常多,但实际使用的时候只会用到有限的几个外设,并且不同的外设需要的时钟频率不同,有些高速,有些低速。所以为了降低功耗,提高抗干扰能力,较为复杂的MCU都是采用多种时钟源的方法来解决这些问题。

从STM32的时钟树来看,我将STM32的时钟大体分为三类:

一、晶振时钟,也就是红框中的系统时钟输入源时钟,用来配置系统时钟的,共有4个。

1、内部高速时钟(High Speed Internal clock signal)HSI:MCU内部提供的高速时钟信号,RC振荡器,8MHz频率。使用时无需额外成本,但是精度相对较差。

2、外部高速时钟(High Speed External clock signal)HSE:由外部晶振电路提供,输入频率范围要求在4-16MHz。使用精度较高,但是会在增加成本。

3、外部低速时钟(Low Speed External clock signal)LSE:由外部晶振电路提供,输入频率为32.768KHz。一般用于RTC实时时钟。

4、内部低速时钟(Low Speed Internal clock signal)LSI:内部低速RC振荡器提供,频率40KHz。看门狗的时钟只能是LSI,同时LSI 还可以作为 RTC 的时钟源。

注意:HSE的引脚是OSC_OUT和OSC_IN这两个引脚芯片是独立引出的,可以接外部的晶振电路;而LSE的引脚OSC32_IN和OSC32_OUT两个引脚不是独立的,而是在PC14和PC15上,OSC32_IN–>PC14 ; OSC32_OUT–>PC15

对于STM32F103系列的MCU,都需要一个高速时钟源和一个低速时钟源,内部时钟源节约成本,无需自己设计时钟电路;外部时钟源提高精度,需要自己设计时钟电路。

二、绿框中的系统时钟,是芯片的工作时钟。

三、蓝框中的所有外设的时钟

在这里插入图片描述

之前说过,任何外设要工作都要先开启他的时钟,那么如何开启他的时钟呢。

从上图分析可知,外设时钟是挂载到APB1和APB2上的,而APB1、APB2是AHB总线分频而来的,AHB总线的时钟与系统时钟直接相连,所以要开启系统时钟,外设时钟才会开启。那么系统时钟又是从何而来的呢。

第二节 系统时钟来源

在这里插入图片描述

上图可知,系统时钟来源总共三条路径:

1、直接来源于内部高速时钟,系统时钟为8MHz。若程序不对系统时钟进行配置,则系统上电后,默认的系统时钟来源是内部高速时钟,也就是8MHz。

2、通过锁相环输入。

通过上图可以看到,锁相环的时钟来源也有两部分,一个是来源于内部高速时钟2分频,另一个是来源于外部高速时钟。

来源于内部高速时钟2分频,锁相环输入时钟为4MHz,通过倍频,最大输出为4*16 = 64MHz。

来源于外部高速时钟,(STM32F103的外部高速时钟为8MHz)锁相环直接输入8MHz,通过倍频,最大输出为8*9 = 72MHz。因为系统时钟最大值为72MHz,所以这里锁相环最大9倍频。

3、直接来源于外部高速时钟,系统时钟为4-16MHz。

第三节 外设时钟来源

上面提到,所有外设都挂载到APB1和APB2总线上,APB1和APB2的时钟来源于AHB分频,而AHB时钟来源于系统时钟分频。

也就是说,得到系统时钟后,在配置AHB和APB1、APB2的预分频系数就可以确定外设时钟。

在这里插入图片描述

第四节 实时时钟和独立看门狗时钟来源

实时时钟的时钟来源有三条路径。

1、由外部高速时钟128分频而来。

2、外部低速时钟(通常情况下选择这个)。

3、内部低速时钟。

独立看门狗的时钟只来源于内部低速时钟。
在这里插入图片描述

第五节 配置STM32系统时钟

5.1配置系统时钟过程

经过上面的介绍,我们对STM32中的所有时钟的来源都有了清楚地认识,接下来我们就可以配置时钟了。

配置时钟大体分为以下几步:

1、确定系统时钟来源,是HSI还是HSE还是锁相环输入。

2、确定相关的分频、倍频系数——到这里系统时钟就确定了。

3、配置AHB、APB1、APB2的分频系数——到这里外设时钟确定了。

经过这三步,STM32的时钟就配置完成了,后面需要用到什么时钟,就调用对应函数开启对应时钟即可。

一般情况下,我们都希望系统在所允许的最大时钟频率下工作,所以一般将STM32F103时钟配置为72MHz。上面说过,系统时钟要想配置为72MHz,只能通过锁相环输出才能达到72MHz的工作频率。

此种模式下,单片机的系统时钟和外设时钟都能达到系统允许的最大值,所以通常都是使用这种方式配置系统时钟。

在这里插入图片描述

5.2使用HAL库配置时钟

HAL 库的 SystemInit 函数并没有像标准库的 SystemInit 函数一样进行时钟的初始化配置,所以使用 HAL 库我们必须编写自己的时钟配置函数

5.2.1相关结构体

在HAL库中,配置系统时钟需要用到两个结构体。

在这里插入图片描述

左边RCC_OscInitTypeDef结构体是描述晶振源的。里面的成员用来表示外部高速时钟的状态、分频、内部高速时钟状态以及振荡器类型和PLL锁相环的属性。这个结构体是设置时钟树的时钟源和锁相环的相关信息,下图红框中的部分。

在这里插入图片描述

右边的结构体RCC_ClkInitTypeDef描述的是开启时钟的类型,是系统时钟还是AHB时钟还是APB1、APB2的时钟;还有AHB、APB1、APB2的时钟预分频,在单片机时钟树中的部分是下图红框中的部分。

在这里插入图片描述

5.2.2相关函数

在HAL库中,关于时钟配置用到的函数大体如下。
在这里插入图片描述

没有标注的5个函数一般用到的比较少,这里不做介绍。

5.2.3配置系统时钟代码

这个是百问网提供的代码。

在这里插入图片描述

注意:HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)第二个参数是设置FLASH读写速度的, CPU频率越高,这个参数可以选择的越大。STM32的FLASH手册上,有关于FLASH_ACR寄存器的LATENCY位的说明:
0 wait state if 0MHz < SYSCLK <= 24MHz
1 wait state if 24MHz < SYSCLK <= 48MHz
2 wait state if 48MHz < SYSCLK <= 72MHz

下面是根据之前介绍的时钟配置流程,自己写的时钟配置代码。

关于RCC_OscInitTypeDef结构体中的成员,不需要全都赋值配置的,保持默认值即可。对于不需要的比如用HSE作为系统时钟输入源,那么HSI的配置就不需要在赋值为关闭了,保持默认值即可,他们都是默认关闭的。对于其他结构体也是一样的,当某些默认值就是我们需要设置的值,就不需要在给这个结构体成员赋值了。

所以我们只需要设置1、晶振源为HSE;2、HSE状态打开;3、HSE1分频(在STM32F103中,只有1分频所以不设置也行)4、PLL输入源为HSE;5、PLL打开;6、PLL为9倍频。顺序如下图所示。

在这里插入图片描述

根据上图配置,HSE1分频为8MHz作为PLL输入,PLL9倍频为72MHz作为系统时钟,AHB1时钟是系统时钟1分频得来,是72MHz,APB1时钟为AHB时钟3分频,为36MHz,APB2时钟是AHB时钟1分频而来是72MHz。

系统时钟 = 72MHz;

AHB时钟 = 72MHz;

APB1时钟 = 36MHz;

APB2时钟 = 72MHz;

调用HAL库函数,看看实际时钟是不是跟理论值一样。

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

在这里插入图片描述

可以看到,四个时钟的实际值和配置的理论值是一样的。

原网站

版权声明
本文为[山、]所创,转载请带上原文链接,感谢
https://blog.csdn.net/wdsclm937256/article/details/125847456