STM32---时钟树

写在前面:一个 MCU 越复杂,时钟系统也会相应地变得复杂,如 STM32F1 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就 可以解决一切。对于 STM32F1 系列的芯片,其有多个时钟源,构成了一个庞大的是时钟树。本节我们将学习时钟树的相关的内容。

目录

一、简述时钟

二、时钟树详解

2.1时钟源          

2.2 PLL锁相环

2.3系统时钟SYSCLK

2.4 APB1、APB2时钟

2.5 其他时钟        

三、配置系统时钟

 3.1系统时钟配置步骤

3.2利用 HAL 库配置 STM32F1 时钟系统

3.3外设时钟使能


一、简述时钟

        时钟树简图:

1、时钟源 

HSE(高速外部振荡器)4-16MHz晶体或陶瓷
LSE(低速外部振荡器)32.768KHz晶体或陶瓷
HSI(高速内部振荡器)8MHzRC电路
LSI(低速内部振荡器)40KHzRC电路

         对于 STM32F1,输入时钟源(Input Clock)主要包括 HSI,HSE,LSI,LSE。

        从时钟频率来分可以分为高速时钟源和低速时钟源,其中 HSI、HSE 高速时钟,LSI 和 LSE 是低速时钟。

        从时钟来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源;其他是内部时钟源,芯片上电即可产生,不需要 借助外部电路。

        晶体时钟的特点是:成本高、稳定、精确,如果可以首选外部时钟;

2、PLL锁相环

        此处锁相环的主要作用是倍频,对于相同的稳定运行的电路,时钟频率越高,指令的执行速度越快, 单位时间能处理的功能越多。对于STM32来说,其系统时钟不超过72MHz;而时钟源的时钟频率最多也就16MHz,无法达到芯片的要求,此时就需要倍频器将外部时钟频率进行倍频,再传给系统时钟;

3、系统时钟SYSCLK

        STM32 的系统时钟 SYSCLK 为整个芯片提供了时序信号。系统时钟的信号来源分别为:HSE、HSI以及经过分频器的输出信号;AHB、APB1、APB2、内核时钟等时钟通过系统时钟分 频得到。

4、HCLK(AHB总线)

        AHB总线将来自系统时钟的信号进行分频或不分频通过总线再分给其他外设、系统内核时钟或者APB1、APB2上的时钟;

5、LSI、LSE

      低速内部RC(LSI RC)振荡器,可以用于驱动独立看门狗,或通过程序选择驱动 RTC;

       LSE 振荡器时钟,也可以驱动 RTC;

二、时钟树详解

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

A 部分表示其他电路需要的输入源时钟信号;

B 为一个特殊的振荡电路“PLL”,由几个部分构成;

C 为我们重点需要关注的 MCU 内的注释中“SYSCLK”;AHB 预分频器将 SYSCLK 分频或不 分频后分发给其他外设进行处理;

D 和 E 部分分 别为定时器等外设的时钟源 APB1/APB2;

F 部分的 Cortex-M 内核系统的时钟;

G 是 STM32 的时钟输出功能。

2.1时钟源          

        A部分为四个时钟源,高速外部振荡器(8MHz)、低速外部振荡器(32.768kHz) 石英晶体,主要作用于 RTC 的时钟源。高速内部振荡器 由内部 RC 振荡器产生,频率为 8MHz。低速内部振荡器由内部 RC 振荡器产生,频率为 40kHz,可作为独立看门狗的时钟源。

        由高速振荡器输出两路信号,分别直接连接SYSLCK系统时钟,以及进入PLL锁相环;

2.2 PLL锁相环

PLL锁相环由三部分组成,分别为:PLLXTPRE、PLLSRC、PLLMUL;

PLLXTPRE:HSE分频器作为PLL输入,专门用于 HSE,0:HSE不分频;1:HSE2分频;

PLLSRC:PLL时钟源的选择器;0:HSI经2分频作为PLL时钟源;1:HSE作为PLL时钟源;

PLLMUL:用于配置锁相环倍频系数,ST 设置它的 有效倍频范围为 2~16 倍;

涉及寄存器为RCC_CFGR(第16-21位) 

2.3系统时钟SYSCLK

 SYSCLK 为整个芯片提供了时序信号。对于相同的稳定运行的电路,时钟频率越高,指令的执行速度越快, 单位时间能处理的功能越多。STM32 的系统时钟是可配置的,在STM32F1 系列中,它可以为 HSI、PLLCLK、HSE 中的一个。可选时钟信号有外部高速时钟 HSE(8M)、内部高速时钟 HSI(8M)和经过倍频的 PLL CLK(72M),选择 PLL CLK 作为系统时钟,此时系统时钟的频率为 72MHz。

涉及寄存器为RCC_CFGR 的位 SW[1:0]

2.4 APB1、APB2时钟

 AHB、APB1、APB2、内核时钟等时钟通过系统时钟分频得到。

         系统时钟信号来到的 AHB 预分频器,可以选择的分频系数为 1,2,4,8,16,32,64,128,256,也可以选择不分频;AHB 总线时 钟达到最大的 72MHz。

涉及的寄存器为RCC_CFGR 的位 HPRE[3:0]

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

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

涉及的寄存器为RCC_CFGR 的位 PPRE-PPRE2[2:0]

2.5 其他时钟        

         此外,AHB总线还与一些外设直接相连,作为外设的时钟,比如ADC,在传入ADC之前,还需要接入ADC预分频器;

涉及的寄存器为RCC_CFGR 的位ADCPRE[1:0]:

最后为时钟树的全速USB OTG预分频,以及为控制器时钟输出;

        USBCLK,是一个通用串行接口时钟,时钟来源于 PLLCLK。STM32F103 内置 全速功能的 USB 外设,其串行接口引擎需要一个频率为 48MHz 的时钟源。该时钟源只能从 PLL 输出端获取,可以选择为 1.5 分频或者 1 分频,也就是,当需要使用 USB 模块时,PLL 必须使能,并且时钟频率配置为 48MHz 或 72MHz。

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

涉及的寄存器为RCC_CFGR 的位OTGFSPRE、MCO:

             RTC 定时器,其时钟源为 HSE/128、LSE 或 LSI。时钟安全系统、自由运行时钟FCLK;

         这些寄存器只是对于使用时钟是一个整体的设置,具体到某个外设的时钟,还需要对应的寄存器设置。 

三、配置系统时钟

        在STM32库函数中,封装了部分寄存器的功能函数,其中有:

时钟源、锁相环:HAK_RCC_OssConfig()

系统时钟、总线:HAK_RCC_ClockConfig()

使能外设时钟:HAK_RCC_PPP_CLK_ENABLE()

扩展外设时钟(RTC/ADC/USB):HAL_RCCCEX_PeriphCLKConfig()

 3.1系统时钟配置步骤

1、配置HSE_VALVE;

2、调用System Init()函数;

3、选择时钟源,配置PLL;

4、选择系统时钟源,配置总线分频器;

5、配置扩展外设时钟;

其中,重要的是步骤345 ,其封装在时钟设置函数 sys_stm32_clock_init。

我们拿出一个例程中对于该函数的设置来进行判断:

/** * @brief 系统时钟初始化函数

* @param plln: PLL 倍频系数(PLL 倍频), 取值范围: 2~16

中断向量表位置在启动时已经在 SystemInit()中初始化

* @retval 无 */

void sys_stm32_clock_init(uint32_t plln)

{

HAL_StatusTypeDef ret = HAL_ERROR;

RCC_OscInitTypeDef rcc_osc_init = {0};

RCC_ClkInitTypeDef rcc_clk_init = {0};

rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE; /* 选择要配置 HSE */ rcc_osc_init.HSEState = RCC_HSE_ON; /* 打开 HSE */

rcc_osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1; /* HSE 预分频系数 */ rcc_osc_init.PLL.PLLState = RCC_PLL_ON; /* 打开 PLL */

rcc_osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE; /* PLL 时钟源选择 HSE */ rcc_osc_init.PLL.PLLMUL = plln; /* PLL 倍频系数 */

ret = HAL_RCC_OscConfig(&rcc_osc_init); /* 初始化 */

if (ret != HAL_OK)

{

while (1); /* 时钟初始化失败后,程序将可能无法正常执行,可以在这里加入自己的处理 */

}

/* 选中 PLL 作为系统时钟源并且配置 HCLK,PCLK1 和 PCLK2*/

rcc_clk_init.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);

rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;/* 设置系统时钟来自 PLL */

        函数 sys_stm32_clock_init 就是用户的时钟系统配置函数,除了配置 PLL 相关参数确定 SYSCLK 值之外,还配置了 AHB、APB1 和 APB2 的分频系数,也就是确定了 HCLK,PCLK1 和 PCLK2 的时钟值。至于为何要这样配置,我们在底下这节进行说明:

3.2利用 HAL 库配置 STM32F1 时钟系统

一般步骤:

1) 配置时钟源相关参数:调用函数 HAL_RCC_OscConfig()。

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);

RCC_OscInitTypeDef 的定义:

        在3.1系统时钟配置步骤中, sys_stm32_clock_init就是对上述结构体内容的配置;通过函数的该段程序,我们开启了 HSE 时钟源,同时选择 PLL 时钟源为 HSE,然后把 sys_stm32_clock_init 的形参直接设置作为 PLL 的参数 M 的值,这样就达到了设置 PLL 时钟源相关参数的目的。

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

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);

        该函数有两个形参,第一个形参 RCC_ClkInitStruct 是结构体 RCC_ClkInitTypeDef 类型指 针变量,用于设置 SYSCLK 时钟源以及 SYSCLK、AHB、APB1 和 APB2 的分频系数。第二个 形参 FLatency 用于设置 FLASH 延迟。

RCC_ClkInitTypeDef 结构体定义

        同样,在3.1系统时钟配置步骤中, sys_stm32_clock_init对上述结构体内容的配置; 

        第二个参数 FLatency 的含义,为了使 FLASH 读写正确(因为 72Mhz 的时钟比 Flash 的操作速度 24Mhz 要快得多,操作速度不匹配 容易导致 Flash 操作失败),所以需要设置延时时间。

3.3外设时钟使能

        在配置好时钟系统之后,如果我们要使用某些外设, 例如 GPIO,ADC 等,我们还要使能这些外设时钟。这里大家必须注意,如果在使用外设之前 没有使能外设时钟,这个外设是不可能正常运行的。

        在 STM32F1 的 HAL 库中,外设时钟使能操作都是在 RCC 相关固件库文件头文件 STM32F1xx_hal_rcc.h 定义的,首先,我们来看看 GPIOA 的外设时钟使能宏定义标识符:

#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \

__IO uint32_t tmpreg; \

SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\

tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\

UNUSED(tmpreg); \

} while(0U)

        这段代码主要是定义了一个宏定义标识符__HAL_RCC_GPIOA_CLK_ENABLE(),它的核心操作是通过下面这行代码实现的: SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);

        这行代码的作用是,设置寄存器 RCC->APB2ENR 的相关位为 1,至于是哪个位,是由宏定 义标识符 RCC_APB2ENR_IOPAEN 的值决定的。 RCC_APB2ENR_IOPAEN的值为2,位 2 的作用是用来使用 GPIOA 时钟,那么我们只需要在我们的用户程序中调用宏定义标识符就可以实现 GPIOA 时钟使能。使用方法为:

__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能 GPIOA 时钟 *

        对于其他外设,同样都是在 STM32F1xx_hal_rcc.h 头文件中定义,大家只需要找到相关宏定义标识符即可。

        我们使用外设的时候需要使能外设时钟,如果我们不需要使用某个外设,同样我们可以禁止某个外设时钟。禁止外设时钟使用方法和使能外设时钟非常类似,同样是头文件中定义的宏定义标识符。

例如:

#define __HAL_RCC_GPIOA_CLK_DISABLE();/*禁止 GPIOA 时钟 *

总结:本节我们学习了STM32的时钟树,从简图学习,再到整个时钟树的详解,包括其功能,涉及的相关寄存器,以及配置的系统时钟的方法步骤,再后面的学习中,我们将经常使用时钟树,因此在后面我们也会熟练的掌握!

创作不易,还请大家多多点赞支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose部署zabbix+grafana

1.引言 1.1目的 zabbixgrafana实现图形化监控 2.部署环境 服务器ip服务版本192.168.5.137zabbix-server6.0.21192.168.5.137grafana10.2.2192.168.5.152zabbix-client6.0.21 3.部署zabbix-server 3.1 创建zabbix目录 mkdir zabbix3.2 编写docker-compose文件 cd zabbix…

【Linux】快速上手自动化构建工具make/makefile

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.什么是make / makefile 2…

class-dump 混淆加固、保护与优化原理

​ 进行逆向时,经常需要dump可执行文件的头文件,用以确定类信息和方法信息,为hook相关方法提供更加详细的数据.class-dump的主要用于检查存储在Mach O文件的Objective-C中的运行时信息,为类,类别和协议生成声明信息&am…

leetcode-142-环形链表(C语言实现)

题目: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评…

2023年中外Top10快公司研究报告

引言 在市场竞争激烈的环境中,每年都有企业实现显著的高速增长,其利润增长率和销售增长率等关键财务指标在短期内急剧上升。本研究报告精选了一批在2015年至2022年间,其营业收入或营业利润年增长率超过10,000%的企业进行深入分析。这一现象反…

使用SLS日志服务采集Kong网关的日志

一、阿里云SLS 官方的接入文档已比较丰富了,本文不意重复说明此事。 站在使用的角度,以采集Kong的日志为示例,说明我们应该如何治理日志。 说白了,本文是想给你怎么省钱作一个建议,希望不会让你公司也“降本增笑”。…

ios-class-guard - iOS代码混淆与加固实践

​ 目录 ios-class-guard - iOS代码混淆与加固实践 摘要 引言 一、class-dump 二、ios-class-guard 混淆原理 三、ios-class-guard 混淆结果 四、ios-class-guar 的使用 ios-class-guard 不支持 Swift ios-class-guard 不支持 iPhoneOS SDK ios-class-guard --sdk-ro…

模型层——单表操作

单表操作 一 ORM简介 查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装 MVC或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库…

Java网络通信

什么是网络编程 网络结构三要素 IP地址 端口号 通信协议 UDP TCP

现货白银简单介绍

在贵金属投资领域,现货白银是当前国际上最为流行、交投最为活跃的白银投资方式,其交易市场遍布全球,包括伦敦、苏黎世、纽约、芝加哥及香港等主要市场,是一种以杠杆交易和做市商的形式进行的现货交易。 现货白银可以说是当下交易模…

FL Studio21.1.1.3750中文版是数字音频工作站 (DAW)

FL Studio水果音乐编曲软件中文版,一款强大的音乐制作软件,可以进行音乐编曲、剪辑、录音、混音。FL Studio21.1.1.3750中文版是数字音频工作站 (DAW) 之一,日新月异。它是一款录音机和编辑器,可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊…

工程化使用React

安装 首先全局安装 npm install create-react-app -g创建项目 create-react-app proName最基本的一个react工程化创建完成 项目目录

办公软件PDF转换工具 - Bruce的PDF工具pdftool

Bruce的PDF工具 - 办公软件PDF转换工具 - pdftool,支持: 1、图片转PDF,支持图片自动压缩,可预览图片 2、合并PDF,支持多个PDF合并成一个PDF 3、PDF转图片,PDF的每页转成一张图片 4、OFD转PDF,O…

ubuntu0.22.04.1安装mysql8.0及root密码注意

先看一下你的安装包是什么版本 apt list |grep mysql基本都是默认的8.0版本,然后安装: apt-get install mysql-server-8.0安装以后 ,mysql默认启动; 一般root 是没有密码的,在本地直接回车登录 我们看一下密码插件 …

5年经验之谈 —— 接口测试主要测哪些方面?

当今互联网时代,接口测试已经成为软件测试的一个重要组成部分。接口测试是指对系统各个接口进行验证,确保接口的正确性、稳定性和安全性。接口测试是软件开发过程中不可缺少的环节,它旨在确保接口能够正常工作,并且满足所需要的规…

mybatis项目中添加logback日志

1、pom.xml <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! --><dependency&g…

系统设计面试指南之分布式任务调度

1 简介 任务是需要资源(CPU 时间、内存、存储、网络带宽等)在指定时间内完成的一段计算工作。 通过智能地将资源分配给任务以满足任务级和系统级目标的系统称为任务调度程序。 任务调度程序&#xff1a; 及时决定和分配资源给任务的过程称为任务调度。 当我们在 Facebook 发…

虹科干货 | 适用于基于FPGA的网络设备的IEEE 1588透明时钟架构

导读&#xff1a;在基于FPGA的网络设备中&#xff0c;精确的时间同步至关重要。IEEE 1588标准定义的精确时间协议&#xff08;PTP&#xff09;为网络中的设备提供了纳秒级的时间同步。本文将介绍虹科提供的适用于基于FPGA的网络设备的IEEE 1588透明时钟&#xff08;TC&#xff…

#HarmonyOS:软件安装window和mac预览Hello World

Window软件地址 https://developer.harmonyos.com/cn/develop/deveco-studio#download 安装的建议 这个界面这样选&#xff0c;其他界面全部按照默认路径往下走&#xff01;&#xff01;&#xff01; 等待安装… 安装环境错误处理 一般就是本地node配置异常导致&#xff…

ubuntu22下使用nvidia 2080T显卡部署pytorch

1.直接到NVIDA官网下载相应的驱动&#xff0c;然后安装官方驱动 | NVIDIA 2.下载相应版本cuda&#xff0c;并安装&#xff0c;安装时不安装驱动 3.conda install pytorch2.1.0 torchvision0.16.0 torchaudio2.1.0 pytorch-cuda12.1 -c pytorch -c nvidia 安装pytorch。 安装…