STM32F103 关于 RCC 使用 HSE 和 HSI 配置系统时钟输出和 MCO 输出时钟信号(固件库详解)

您所在的位置:网站首页 rtos英语怎么读 STM32F103 关于 RCC 使用 HSE 和 HSI 配置系统时钟输出和 MCO 输出时钟信号(固件库详解)

STM32F103 关于 RCC 使用 HSE 和 HSI 配置系统时钟输出和 MCO 输出时钟信号(固件库详解)

2023-03-27 06:30| 来源: 网络整理| 查看: 265

STM32F103 关于 RCC 使用 HSE 和 HSI 配置系统时钟输出和 MCO 输出时钟信号(固件库详解) YVinci• 分类:硬件电路 发布时间 2022.04.27阅读数 1832 评论数 0 关于 RCC 配置系统时钟和外部输出 MCO 这张图 STM32F103 时钟树原理图,接下来我会在这张图里一小段一小段截取来分开讲解。

在这里插入图片描述

HSE 和 HSI 系统时钟输出

PLL 时钟源可以来源于两个,一个是 HSE ,另一个是 HSI 。HSE 是如何作为时钟源呢?

在这里插入图片描述

1、这个是 HSE 高速外部时钟1的输入, 可以很清楚的看到外部接了 OUT 和 IN 两个引脚,外部有源或者无源晶振通过这两个引脚提供时钟信号(当是有源晶振时,时钟从 IN 进入, OUT 悬空, 当是无源晶振时,时钟从 IN 和 OUT 进入,并且要配谐振电容。)。2、当确定 PLL 时钟来源时,可以选择不分频或者 2 分频,这个可以由 RCC 的 CFGR 寄存器的 PLLXTPRE 配置。在这里插入图片描述

在这里插入图片描述

HSI 又是怎么作为时钟源呢?

在这里插入图片描述

HSI 是内部高速时钟信号,只能 2 分频来作为 PLL 时钟源,但是根据温度和环境情况频率会有漂移,所以一般不作为 PLL 时钟源。

在这里插入图片描述

1、通过上面所讲的配置 HSE 和 HSI 两个时钟作为 PLL 时钟的来源,可以通过 CFGR (寄存器上面已经讲到)的 PLLSRC 来配置来源。

在这里插入图片描述

/2、一般来说常用 8 M 频率,所以接下来就用 HSE 和 HSI 为 8M 来作为例子,在这儿可以对时钟来源进行倍频,可以通过 CFGR 的 PLLMUL 来配置。

在这里插入图片描述

因为我们使用的是 8M 时钟,所以这儿经过倍频了之后最高可以达到 8M * 16 = 128M 的频率,但是官方推荐的是 72M 稳定时钟。

在这里插入图片描述

这儿我们可以看到,系统时钟的来源一共有 3 个,除了我们上述配置的 PLL 时钟,还可以直接使用 HSE 和 HSI 直接作为时钟来源,可以通过 CFGR 的 SW 来配置。

在这里插入图片描述

在这里插入图片描述

这儿可以看到,系统时钟会经过 AHB 预分频器,得到的叫做 APB 总线时钟(即 HCLK )。

在这里插入图片描述

我们可以通过设置 CFGR 的 HPRE 来设置分频器,大部分外设的时钟都是通过这个 HCLK 分频的得到,至于 AHB 总线上的时钟为多少,得等到我们使用该外设时才能用到,所以我们这儿只需要粗线条的配置 APB 的时钟就可以了。

在这里插入图片描述

这要注意,如果 AHB 的预分频器大于2,必须开启预缓冲器,我在闪存取读中并没有找到(不代表没有,只是博主没有看到,因为博主英文差,所以读英文版有些困难,如果有哪位大佬找到愿意分享,博主还望大佬不吝赐教,谢谢!(后面我会讲解用固件库开启这个。))

在这里插入图片描述

我们常用的 APB2 总线时钟(即 HCLK2 )经过高速到 APB2 预分频器获得,配置可以用 CFGR 的 PPRE2 。

在这里插入图片描述

HCLK2 是属于高速的总线时钟,高速的外设就挂载到这条总线上。

在这里插入图片描述

APB1 总线时钟(即 PCLK1 )经过低速到 APB 预分频器获得,配置可以用 CFGR 的 PPRE1 。

在这里插入图片描述

属于低速,最高只能达到 36M 低速外设就挂载在这个总线上。

以上就是关于 HSE 和 HSI 时钟的全部配置理论过程,接下来我会使用 STM32 的固件库来配置上面,配置原理与上面相同,理论是不是很枯燥,但是坚持一定很美丽,现在直接上代码讲解

1、以 HSE 作为时钟来源,经过PLL倍频来作为系统时钟。

//以HSE作为时钟来源,经过PLL倍频来作为系统时钟,这个是比较常用的。void HSE_SetSysClock(uint32_t pllmul)    //定义一个函数,来代表这一个过程。{    __IO uint32_t HSEStartUpStatus = 0;    //__IO指的是静态变量,原型为volatile,代表允许除了程序员之外(比如硬件)来修改它的内容。        RCC_DeInit();    //在stm32f10x_rcc.h里,是外设时钟初始化。    RCC_HSEConfig();    //使能HSE,开启外部晶振,我的开发板使用的是8M。    HSEStartUpStatus = RCC_WaitForHSEStartUp();    //等待HSE稳定,若是稳定了会返回SUCCES这个值。    if (HSEStartUpStatus = SUCCESS)    //判断是否成功启动并且稳定。    {        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //使能FLASH缓冲区。//SYSCLK周期与闪存访问时间的比例设置,设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了。// 0:0 < SYSCLK

分享

微信 微博 QQ 图片 上一篇:关于 STM32F103 系列的 EXTI 中断以及 SysTick 原理分析以及配置详解(固件库分析) 下一篇:STM32 固件库外设 GPIO 讲解(关于 GPIO 寄存器讲解)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3