当前位置:网站首页>单片机学习笔记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库函数,看看实际时钟是不是跟理论值一样。






可以看到,四个时钟的实际值和配置的理论值是一样的。
边栏推荐
- 硬件知識1--原理圖和接口類型(基於百問網硬件操作大全視頻教程)
- How to develop the liquid cooled GPU server in the data center under the "east to West calculation"?
- 数据挖掘场景-发票虚开
- Space shared by two stacks
- 智能指针shared_ptr和unique_ptr
- 绿色数据中心“东数西算”全面启动
- 2021 TOP10 development trend of information science. Deep learning? Convolutional neural network?
- ARM架构与编程1--LED闪烁(基于百问网ARM架构与编程教程视频)
- Double ended queue
- Vio --- boundary adjustment solution process
猜你喜欢

Check the sandbox file in the real app

In depth interpretation of Google or tools' complex scheduling program

以不太严谨但是有逻辑的数学理论---剖析VIO之预积分

VIO---Boundle Adjustment求解过程

Chaoslibrary · UE4 pit opening notes

All kinds of ice! Use paddegan of the propeller to realize makeup migration

知识图谱、图数据平台、图技术如何助力零售业飞速发展

Notes | Baidu flying plasma AI talent Creation Camp: detailed explanation of deep learning model training and key parameter tuning

ARM架构与编程1--LED闪烁(基于百问网ARM架构与编程教程视频)

ARM架构与编程5--gcc与Makefile(基于百问网ARM架构与编程教程视频)
随机推荐
常用数学知识汇总
利用google or-tools 求解数独难题
How can knowledge map, map data platform and map technology help the rapid development of retail industry
Find the sum of numbers between 1 and 100 that cannot be divided by 3
使用pycaret来进行数据挖掘:关联规则挖掘
matplotlib使用总结
“东数西算”数据中心下算力、AI智能芯片如何发展?
Rondom summary
Green data center: comprehensive analysis of air-cooled GPU server and water-cooled GPU server
Static linked list
opencv库安装路径(别打开这个了)
深度学习-神经网络
Notes | Baidu flying plasma AI talent Creation Camp: How did amazing ideas come into being?
ARM架构与编程1--LED闪烁(基于百问网ARM架构与编程教程视频)
Using Google or tools to solve logical problems: Zebra problem
论文解读:《利用注意力机制提高DNA的N6-甲基腺嘌呤位点的鉴定》
Lecturer solicitation order | Apache dolphin scheduler meetup sharing guests, looking forward to your topic and voice!
What technologies are used in pharmaceutical research and development in the field of life sciences? Cryoelectron microscope? Molecular simulation? IND?
利用or-tools来求解带容量限制的路径规划问题(CVRP)
液冷数据中心如何构建,蓝海大脑液冷技术保驾护航