STM32---时钟树

news2024/11/15 23:20:55

写在前面:一个 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.coloradmin.cn/o/1272280.html

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

相关文章

Linux下的文件IO之系统IO

1. 知识点 读入写出,切记以我们程序为中心向文件或者别的什么东西读入写出(输入流输出流) 人话就是 文件向我们程序就是读入 程序向文件或者别的什么就是写出 2. open打开文件 open.c /****************************************************…

算法:Java计算二叉树从根节点到叶子结点的最大路径和

要求从根节点到叶子结点的最大路径和,可以通过递归遍历二叉树来实现。对于二叉树中的每个节点,我们都可以考虑包含该节点的最大路径和。在递归的过程中,我们需要不断更新全局最大路径和。 具体的思路 递归函数设计: 设计一个递归函…

“降本增效”才是选择低代码开发的主旋律

长期以来,常规软件开发是一项艰苦而详尽的工作。开发人员编写代表指令和数据的单行代码。他们将代码组织为功能例程和模块,这些例程和模块提供了软件的功能。这种方法需要在应用程序开发范围内对各个方面的技术都有详细的知识:开发语言&#…

Python 2 和 Python 3 的区别

Python 2 和 Python 3 之间有很多重要的区别,特别是在处理编码、字符串和类方面的区别。Python 2和Python 3的主要区别包括以下几点: Unicode处理:Python 2有专门的Unicode字符串类型(例如,u"string"&#…

Verilog 入门(四)(门电平模型化)

文章目录 内置基本门多输入门简单示例 内置基本门 Verilog HDL 中提供下列内置基本门: 多输入门 and,nand,or,nor,xor,xnor 多输出门 buf,not 三态门上拉、下拉电阻MOS 开关双向开关 门级逻辑…

Youtube如何做SEO关键词挖掘

做好Youtube的SEO优化,可以使我们的视频得到更多的展示,更多的点击和观看,就能获得更多的粉丝和流量。一方面通过视频做引流到目标网站进行转化赚钱,另一方面可以通过涨粉接youtube广告赚钱。要做seo最关键的一步在于关键词的挖掘…

蓝桥杯算法心得——仙界诅咒(dfs)

大家好,我是晴天学长,搜索型的dfs,差点开二维矩阵了,仔细一想,没那么夸张啊,哈哈哈,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1…

vscode集成git

1、首先电脑要安装git 打开git官网地址:Git进行下载,如下图界面: 如图片中描述:一般进入官网后会识别电脑对应系统(识别出了我的电脑是Windows系统 。如果未识别到电脑系统,可在左侧选择自己电脑对应的系统…

NFTScan 正式上线 Starknet NFTScan 浏览器和 NFT API 数据服务

2023 年 11 月 30 号,NFTScan 团队正式对外发布了 Starknet NFTScan 浏览器,将为 Starknet 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商,Starknet 是继 Bitcoin、Ethereum、…

pandas-profiling / ydata-profiling介绍与使用教程

文章目录 pandas-profilingydata-profilingydata-profiling实际应用iris鸢尾花数据集分析 pandas-profiling pandas_profiling 官网(https://pypi.org/project/pandas-profiling/)大概在23年4月前发出如下公告: Deprecated pandas-profilin…

QT 项目中添加文件夹(分类文件)

为了更方便的整理项目的文件,添加文件夹把文件进行分类。 1.首先在项目文件中创建新的文件夹 2.把需要归类的文件放入新建的文件中 3.右键然后选择add..... 4.运行此程序,会报错因为文件路径改变了,需要在.pro中修改路径 注意事项 文件夹内部…

OFDM通信连路仿真学习

文章目录 前言一、前置知识1、块状导频与梳状导频①、相似点②、区别③、其他 2、其他知识 二、仿真任务及方案1、仿真任务2、仿真方案 三、MATLAB仿真1、MATLAB 源码2、程序流程3、仿真结果①、打印信息③、8PSK 星座图②、脉冲成型图③、ETU300登加AWGN信道下误比特率曲线 四…

【人工智能Ⅰ】实验4:贝叶斯分类

实验4 贝叶斯分类 一、实验目的 1. 了解并学习机器学习相关库的使用。 2. 熟悉贝叶斯分类原理和方法,并对MNIST数据集进行分类。 二、实验内容 1. 使用贝叶斯方法对mnist或mnist variation数据集进行分类,并计算准确率。数据集从网上下载&#xff0…

【C++】异常处理 ② ( 异常捕获类型 | 异常捕获机制 - 严格匹配异常类型 | 未知异常捕获 - 不知道异常类型 )

文章目录 一、异常捕获机制 - 严格匹配异常类型1、异常捕获机制 - 严格匹配异常类型2、代码示例 - 异常捕获严格匹配异常类型 二、异常捕获机制 - 未知异常捕获1、未知异常捕获 - 不知道异常类型2、代码示例 - 未知异常捕获 一、异常捕获机制 - 严格匹配异常类型 1、异常捕获机…

嵌入式Linux:配置Ubuntu系统环境和安装开发工具

目录 1、配置Ubuntu系统环境 1.1、APT下载工具 1.2、更新语言 1.3、更新本地数据库 1.4、安装VIM编辑器 1.5、Ubuntu 和 Windows 文件互传 1.6、开启NFS服务 1.7、开启SSH服务 2、安装开发工具 2.1、Ubuntu安装VSCode 2.2、Windows安装MobaXterm 安装好Ubuntu系统环…

需求不明确的情况下,测试该如何处理?

当需求不明确的情况下,测试团队可以采取以下措施来处理: 1. 与项目团队进行沟通:测试团队应与项目团队密切合作,与业务分析师、产品经理等相关人员进行沟通,以获取更多的需求细节和背景信息。通过与相关方的交流&…

No matching version found for @babel/compat-data@^7.23.5 处理

npm ERR! notarget No matching version found for babel/compat-data^7.23.5 处理 报错信息 npm WARN ERESOLVE overriding peer dependency npm ERR! code ETARGET npm ERR! notarget No matching version found for babel/compat-data^7.23.5. npm ERR! notarget In most …

Shopee引流妙招!Shopee产品标签重要吗?教你有效打标签引爆流量!

对Shopee平台的卖家来说,在新产品上架时除了要注重产品title、介绍以及图文的优化,还有一件事情很重要,那就是——产品打标签。 对于每个跨境电商卖家来讲,对产品打标签都是必不可少的一个运营环节 下面小宇就来告诉大家&#xf…

字符串的旋转

字符串的旋转 左旋(逆时针) 示例:abcd------>bcda 右旋(顺时针) 示例:abcd------>dabc 例: 输入若干个字符串(1≤长度≤1000)右旋转串后的n(-长度…

芒格传奇落幕!生前最后一次谈论比特币,说了什么?

当地时间11月28日,知名投资公司伯克希尔哈撒韦发布声明,公司董事会副主席查理芒格(Charlie Munger)于当天早上在美国加利福尼亚州的一家医院去世,终年99岁,距离其百岁生日仅剩1个月。 巴菲特在一份声明中表示:“没有查…