第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟

2023-05-16

目录

  • 基本知识框架
  • 课堂笔记
    • 时钟
      • 什么是时钟?时钟有什么作用
    • 时钟源
      • HSE 外部高速时钟
      • HSI 内部高速时钟
      • LSE 外部低速时钟
      • LSI 内部低速时钟
      • PLL锁相环
    • 主要时钟和其他时钟
      • 主要时钟
      • 其他时钟
    • 配置系统时钟实验
  • 基本知识框架Xmind文件下载

基本知识框架

在这里插入图片描述

课堂笔记

时钟

什么是时钟?时钟有什么作用

时钟是STM32内部最核心的器件,它可以提供时钟信号。依赖于这个信号,STM32中的器件才可以有条不紊地将工作进行下去。正如人的脉搏一般

时钟的作用
同步状态:时序逻辑电路,是讲求顺序的,通过统一一致的时钟信号,元器件才能知道自己处于什么状态,是该工作还是待机,互相协同将任务完成
降低功耗:时钟频率越高的设备,往往功率都越高。一个设备所有的外设不可能都用同一个时钟信号,对于不同的外设,配置不同的时钟信号可以有效地降低功耗,有的外设甚至可以关闭时钟信号

时钟源

STM32中能够主动发出时钟信号的元器件,可以用作时钟源。STM32中有四个时钟源,还有一个辅助时钟源生成倍频时钟信号的器件锁相环

HSE 外部高速时钟

时钟信号由外部晶振提供,时钟频率一般在4-16MHz,是经常会用到的时钟源

这里的外部晶振可以是有源晶振,也可以是无源晶振,它们的区别在于与STM32的 连接方式,以及需不需要谐振电容

HSI 内部高速时钟

时钟信号由内部RC震荡电路提供,时钟频率为8MHz,但是这个时钟频率会随着温度产生漂移,很不稳定,所以一般不使用此时钟信号

LSE 外部低速时钟

时钟信号由外部晶振提供,时钟频率一般为32.768KHz,这个信号一般用于RTC实时时钟

LSI 内部低速时钟

时钟信号由内部RC振荡电路提供,时钟频率一般为40KHz,这个信号一般用于独立看门狗时钟

PLL锁相环

PLL锁相环是辅助产生时钟信号的器件。将时钟信号输入锁相环,锁相环可以将这个时钟信号的频率按照指定倍率提高(倍频)之后,再输出

与锁相环具有相反作用的是分频器,分频器可以将输入时钟信号分率按照指定倍率降低之后,再输出

主要时钟和其他时钟

光知道时钟,是不行的。还需要理解时钟内部之间的联系,如何通过时钟源得到其他外设的时钟信号,时钟信号是如何转换传递的,通过对基础时钟树的分析,这些问题统统会有答案

以下是RCC的框图(RCC:Reset Clock Control 复位时钟控制),里面包含了主要时钟(1-7)和其他时钟(A-E)
在这里插入图片描述

主要时钟

单独分析和了解时钟的过程,是很枯燥的。结合某条特定时钟树去讲解时钟会更易于理解,也使得这个认知的过程更有趣
时钟树是一个用于时钟信号传递的网状结构,通过时钟树,可以将时钟源的时钟信号传递到所需要的外设处。现在通过最基础的时钟树(路径如上图中1-6)去验证之前的解析,基础时钟树的最终目标是配置好系统时钟SYSCLK(72MHz)以及外设时钟PCLK1(32MHz),PCLK2(72MHz)

  • 1.HSE 与 PLLXTPRE

HSE是外部高速时钟,时钟信号由外部晶振提供。HSE时钟信号将会传递给PLLXTPRE,这个过程可以选择将HSE时钟信号进行1分频(不分频)或者2分频处理,之后PLLXTPRE会将选择的时钟信号再传递给PLLSRC。基础时钟树中,HSE提供最常用的8MHz时钟信号,传递到PLLXTPRE的时钟信号选择1分频,依旧是8MHz

  • 2.PLLSRC

PLLSRC的输入时钟信号可以选择PLLXTPRE(其实也就是HSE)或者是进行2分频后的HSI时钟信号。由于HSI的时钟信号容易漂移,基础时钟树中,输入时钟信号选择HSE,输出时钟信号直接传递给PLLMUL

  • 3.PLLMUL / PLLCLK

PLLMUL其实就是PLL锁相环,可以对时钟信号进行倍频处理,倍频后得到的信号就是PLL时钟信号PLLCLK,基础时钟树中选择8倍频输出,也就是倍频到8MHz*9=72MHz后,输出PLLCLK时钟信号传递给系统时钟SYSCLK

  • 4.SYSCLK

可以从图中看到,系统时钟SYSCLK可以有很多的输入时钟信号(通过Switcher进行选择),包括HSI,HSE或是PLLMULL。基础时钟树中,选择PLLCLK作为输入时钟信号,到这里,系统时钟SYSCLK就被配置为72MHz(最高频率),基础时钟树的任务完成了1/3,之后SYSCLK时钟信号会被传递给AHB预分频器

  • 5.AHB / HCLK

系统时钟SYSCLK经过AHB分频器进行分频操作,得到总线时钟HCLK。基础时钟树中,经过AHB分频器1分频后,得到总线时钟HCLK,时钟频率依旧为72MHz,HCLK时钟信号会传递给APB1,APB2预分频器

  • 6.APB1 / PCLK1

因为APB1总线上挂载的都是低速外设,HCLK时钟信号经过APB1预分频器要进行2分频,得到低速外设时钟信号PCLK1,时钟频率为36MHz。此时,基础时钟树的任务完成了2/3

  • 7.APB2 / PCLK2

HCLK时钟信号还会提供给APB2预分频器,因为APB1总线上挂载的都是高速外设,经过APB2预分频器进行1分频后,得到高速外设时钟信号PCLK2,时钟频率为72MHz。至此,基础时钟树的任务圆满完成,STM32内核开始正常运行,同时外设总线上的外设也开始工作

其他时钟

通过时钟树已经能对主要时钟以及主要时钟之间的联系有了一定的理解。主要时钟以外的其他时钟,较为重要的,可以一一列举出来讲解:

  • A.USB时钟

USB时钟信号是通过PLLCLK时钟信号经过USB预分频器得到,分频因数可以是1或者1.5,USB时钟信号的频率为48MHz,这就意味着PLLCLK时钟信号的频率只能48MHz或者72MHz。由于USB时钟信号对频率的要求较高,所以只能由HSE经过PLL倍频后时钟信号提供,不能由HSI提供

  • B.Cortex系统时钟

Cortex系统时钟信号由HCLK时钟信号经过8分频处理后得到,也就是72MHz / 8 = 9MHz,这个时钟信号提供给系统内核SysTick定时器,SysTick定时器一般用于操作系统的时钟节拍,也可以用于普通定时器

  • C. ADC时钟

ADC时钟信号是由PCLK2时钟信号经过ADC预分频器处理后的得到,分频因数可以是2,4,6,8。ADC时钟信号频率最高为14MHz,反推PCLK2时钟信号的频率只能是28MHz,56MHz,因为PCLK2时钟信号的频率最高为72MHz

  • D.RTC时钟 / 独立看门狗时钟

RTC时钟信号可以由HSE或者HSI提供(HSE提供RTC时钟信号的话需要经过128分频处理),也可以由LSE时钟信号提供,时钟频率为32.768KHz。而独立看门狗时钟信号只能由LSI提供,LSI时钟信号是内部低速时钟信号,频率在30~60KHz之间不等,一般取40KHz

  • E.MCO时钟输出

MCO(MicroController Clock Output微控制器时钟输出)时钟输出,可以在STM32 F1的PA8引脚,通过复用,对外输出时钟信号,作为一个有源晶振来使用,对外输出的时钟信号可以来自PLLCLK/2、HSI、HSE或者SYSCLK。此外通过输出的时钟信号,来观察与判断内部时钟是否配置正确

配置系统时钟实验

在介绍时钟信号传递流程时,硬件上通过时钟树进行描述;软件上通过启动文件中的SystemInit()函数进行配置,SystemInit函数的定义在system_stm32f10x.c中。通过修改此文件相关内容,可以修改系统时钟,但为了保持库文件的完整性,一般不去做这样的修改,而是另外通过自定义函数来实现

自定义的RCC系统时钟配置函数流程大致为

  1. 定义晶振结构体,时钟结构体
  2. 初始化晶振结构体,选择HSE,并设置分频因子
  3. 设置PLL
  4. 等待晶振初始化
  5. 初始化时钟结构体,设置SYSCLK,HCLK,PCLK1,PCLK2
  6. 等待时钟初始化完成

时钟驱动文件共有两个,bsp_clkconfig.h和bsp_clkconfig.c
bsp_clkconfig.c代码主体部分实现

/*
 * bsp_clkconfig.c
 *
 *  Created on: 2021年10月17日
 *      Author: 67566
 */

#ifndef BSP_CLKCONFIG_C_
#define BSP_CLKCONFIG_C_

#include "bsp_clkconfig.h"

extern void Error_Handler(void);

void HSE_SetSysClock(void)
{
	// Define RCC OscInitTypeDef & ClkInitTypeDef Structure
	RCC_OscInitTypeDef RCC_OscInitStruct = {0};
	RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

	// Enabled HSE & PLL
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	RCC_OscInitStruct.HSEState       = RCC_HSE_ON;
	RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
	RCC_OscInitStruct.PLL.PLLState   = RCC_PLL_ON;

	// Ensure HSE Work Properly
	if (HAL_OK != HAL_RCC_OscConfig(&RCC_OscInitStruct))
	{
		// Enable Clock
		RCC_ClkInitStruct.ClockType      = RCC_CLOCKTYPE_SYSCLK |
									  	   RCC_CLOCKTYPE_HCLK |
										   RCC_CLOCKTYPE_PCLK1 |
										   RCC_CLOCKTYPE_PCLK2;
		RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_HSE;
		RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;
		RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
		RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV16;
	}
	// // Ensure Clock Work Properly
	if (HAL_OK != HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0))
	{
		Error_Handler();
	}
}

void Delay(long long count)
{
	for (; count<0; count--)
	{}
}

#endif /* BSP_CLKCONFIG_C_ */

基本知识框架Xmind文件下载

链接:资源下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟 的相关文章

  • 测试工程师进阶测试开发工程师

    黑盒测试 xff1a 没有开发基础的测试工程师通常由黑盒测试做起 xff0c 不过根据个人经验 xff0c 这部分工作依然会给我们带来很多经验性的东西 xff0c 比如熟悉浏览器特性 xff0c 熟悉公司业务流程 xff0c 业务知识 xf
  • 轻量级接口自动化测试工具

    相信所有公司在起步自动化的时候做的都是接口自动化 xff0c 为什么呢 xff1f 理由很简单 xff0c 接口自动化复用性强 xff0c 易维护 xff0c 他的产出效率要远远高于UI自动化 xff0c 想想如果你的公司有成百上千的接口
  • JAVA实现HTTPS协议POST请求JSON报文

    HTTPS和HTTP的区别 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息 HTTP协议以明文方式发送内容 xff0c 不提供任何方式的数据加密 xff0c 如果攻击者截取了Web浏览器和网站服务器之间的传输报文 x
  • Jmeter之JAVA Request的应用

    当我们使用Jmeter进行接口测试的时候 xff0c 我们一定会遇到一个问题 xff0c 那就是如果这些接口不是http协议的 xff0c 是经过封装以后的接口 xff0c 用Jmeter该怎么解决呢 xff1f 当你想到这个问题 xff0
  • FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用

    FreeRTOS例程3 串口中断接收不定长的数据与二值信号量的使用 知乎 zhihu com
  • 使用airtest实现UI自动化之环境搭建

    1 xff0c 安装python python版本为3 7 1 2 xff0c 安装airtest xff0c pocoui模块 在安装时碰到的问题 xff1a 1 xff09 使用pip命令报错 xff0c 报SSL证书无法识别错误 解决
  • HTTP Digest Authentication在实际应用中的问题

    作者 xff1a 老王 Basic认证实际上是明文传递密码 xff0c 所以 RFC2617里定义了Digest认证以取代它 xff0c 其计算方法如下 xff1a 其中HA1计算方法为 xff1a 如果qop选项的值为auth xff0c
  • 1天精通Apipost--全网最全gRPC调试和智能Mock讲解!

    gRPC 接口调试 grpc 作为一个老程序员 xff0c 最近公司技术架构用到了gPRC xff0c 但国内很少有支持这个的工具 xff0c 大部分都只是支持http 由于我同时也是Apipost骨灰级用户 xff0c 于是就在他们官网的
  • CAN总线波特率的设定——以STM32为例

    波特率的设定 首先是几个名词的含义 xff0c CAN里面1个位的构成如下 注意采样点的位置在PBS1和PBS2的中间 根据这个位时序就可以计算波特率了 最小时间单位 xff08 Tq xff0c Time Quantum xff09 同步
  • 2021电赛备赛心路历程(含代码例程)

    作为一个电子学院学生 xff0c 大二暑假才开始自学单片机知识 xff08 还是因为报名了电赛而不得不去学 xff09 xff0c 深感愧疚 从今年7月至8 4的将近四周时间内哩哩啦啦学了一些基础模块 xff08 其中光是练习点灯和其他基础
  • 20201114-三轴云台storm32 BGC HAKRC调试+

    storm32 BGC HAKRC 2轴云台支持俯仰 xff08 抬头低头 xff09 以及横滚 xff1b 三轴多了一个航向 支持锁头模式 xff0c 拍摄更方便 可以控制俯仰通过接收机或者其他单独PWM通道 可以设置跟随模式或者锁定模式
  • KEIL5中头文件路劲包含问题

    方式1 xff1a 1 Keil中添加头文件相对路劲的方法 在c c 43 43 配置中添加路劲 xff0c 最终是将添加的绝对路径转化为相对路径 xff1b 注意 xff1a 相对路径的当前位置指 uvproj文件所在位置 在C C 43
  • php curl函数应用方法之模拟浏览器

    curl 是使用URL语法的传送文件工具 xff0c 支持FTP FTPS HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP curl 支持SSL证书 HTTP POST HTTP PUT FTP
  • WireShark基本抓包数据分析

    WireShark抓包数据分析 xff1a 1 TCP报文格式 源端口 目的端口 xff1a 16位长 标识出远端和本地的端口号 顺序号 xff1a 32位长 表明了发送的数据报的顺序 确认号 xff1a 32位长 希望收到的下一个数据报的
  • VScode下运行调试C++文件

    1 下载vscode 这个可以直接去官网下载 2 下载mingw64 下载mingw64就是下载C 43 43 的编译器g 43 43 和调试器gdb 这个也可以去官网下载 xff0c 下载安装完成后去配置环境变量 我将mingw64安装在
  • c++模板的优点和缺点

    作为C 43 43 语言的新组成部分 xff0c 模板引入了基于通用编程的概念 通用编程是一种无须考虑特定对象的描述和发展算法的方法 xff0c 因此它与具体数据结构无关 但在决定使用C 43 43 模板之前 xff0c 让我们分析一下使用
  • 基于导航网格的A星寻路(Navigation mesh)

    最近花了几个月的时间实现了导航网格寻路和导航网格自动生成 导航网格数据结构定义 由于数据之间有着层级关系 xff0c 所以采用XML进行定义 navmesh基本元素 xff1a 顶点 Verts 43 可走边 Edges 43 凸多边形 P
  • cmake 引入 动态库、静态库

    动态库 xff1a link directories PROJECT SOURCE DIR lib 添加动态连接库的路径 target link libraries project name lMNN 添加libMNN so 静态库 xff
  • 利用JSP内置对象Request和Application实现用户名密码登录注册进入首页显示

    学习目标 xff1a 实验名称 xff1a JSP内置对象目的 xff1a 掌握JSP页面的全部语法 能够编写基本的JSP网页 学习内容 xff1a 1 实验 地点 周三2单元 xff0c 10617综合一实验室 自带电脑 目的 掌握各种内
  • 【如何写CMake】一个解决方案,多个工程

    文章目录 代码参考 一个解决方案 xff0c 多个工程 xff0c 即多个exe dll lib等 代码 多加几个ADD EXECUTABLE即可 1 cmake verson xff0c 指定cmake版本 cmake minimum r

随机推荐

  • 指针、寄存器、位操作

    定义寄存器的绝对地址 xff0c 并转换为指针进行位操作 1 位操作示例一 define PERIPH BASE unsigned int 0x40000000 define APB2PERIPH BASE PERIPH BASE 43 0
  • 详解TCP连接的建立

    TCP首部格式 TCP报文段首部的前20个字节是固定的 xff0c 后面有4N字节是根据需要而增加的选项 xff0c 因此TCP报文段的最小长度为20字节 首部固定部分的各字段的意义如下 xff1a 1 源端口和目的端口 xff1a 加上I
  • printf打印函数的原理浅析

    printf的底层原理浅析 目录 printf的底层原理浅析前言函数变参格式解析一个简单的printf示例结语 补充 前言 最近在学习linux内核的时候用到了自定义实现的printf xff0c 学习了一下 xff0c 在此记录 xff0
  • 基于公开网站挖掘敏感信息的研究与分析- Fofa 搜索

    基于公开公开网站挖掘敏感信息的研究与分析 Fofa 搜索 一 引言 1 1项目概述 基于公开网站的敏感信息挖掘研究与分析 xff1a 针对目前网络安全整体的趋势我们从google等搜索引擎 Github等代码库 FOFA等空间搜索这三个方面
  • HTTP报文

    一 HTTP报文的结构 用于HTTP协议交互的信息 xff0c 称为HTTP报文 客户端的HTTP报文称为请求报文 xff0c 服务端的称为响应报文 HTTP报文结构如下图 xff1a 下面是请求报文的一个实例 xff1a 请求行 xff1
  • 用C++写一个UDP发送和接收程序

    发送程序Sender cpp include lt stdio h gt include lt string gt include lt iostream gt include lt winsock h gt using namespace
  • STM32自学笔记(五)串口通信

    xff08 想要深入理解就把前面的看下 xff0c 否则直接看使用总结即可 xff09 usart文件夹 usart 文件夹内包含了 usart c和usart h两个文件 这两个文件用于串口的初始化和中断接收 代码只针对了串口1 xff0
  • sockaddr_in详解

    struct sockaddr in short sin family Address family一般来说AF INET xff08 地址族 xff09 PF INET xff08 协议族 xff09 unsigned short sin
  • ubuntu下好用的TCP/UDP调试工具

    github官方链接 GitHub s kyo mNetAssist mNetAssist A UDP TCP Assistant 编译好的安装包 ubuntu下好用的TCP UDP调试工具 网络设备文档类资源 CSDN下载 1 解压dpk
  • Linux网络编程之connect函数分析

    在一个 CLIENT SERVER模型的网络应用中 xff0c 客户端的调用序列大致如下 xff1a socket gt connect gt recv send gt close 其中socket没有什么可疑问的 xff0c 主要是创建一
  • linux route 命令

    显示现在所有路由 route n root 64 Ubuntu route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10
  • 大量LAST_ACK 分析过程

    记录一下自己的思想过程 现象 在netstat的时候发现大量处于LAST ACK状态的TCP连接 xff0c 达到在ESTABLISHED状态的90 以上 root 64 ccsafe netstat ant fgrep 34 34 cut
  • const 与重载

    const到底是不是一个重载的参考对象 xff0c 请看下面的例子 class A public void f int i std cout lt lt 34 1 34 函数1 void f int i const std cout lt
  • 指向成员函数的指针

    指向成员函数的指针 取一个非静态成员函数的地址 xff0c 如果该函数是nonvirtual xff0c 则得到的结果是它在内存中真正的地址 然而这个值也不是完全的 xff0c 它也需要被绑定于某个class object的地址上 xff0
  • rviz 远程显示及控制移动机器人的导航

    环境 xff1a xff08 1 xff09 虚拟机本地端IP 192 168 10 30 xff08 虚拟机需要通过桥接的形式与PC本地机连接 xff0c PC 机IP 192 168 10 21 xff09 xff08 2 xff09
  • iptables - administration tools for packet filtering and NAT

    2 iptables administration tools for packet filtering and NAT Linux Iptables Manual Incoming Traffic V 43 43 PREROUTING 4
  • C++ 内部类、嵌套类

    1 嵌套类 nested class 一个类可以定义在另一个类的内部 xff0c 前者称为嵌套类 xff0c 嵌套类时一个独立的类 xff0c 和外层类基本没什么关系 它通过提供新的类型类作用域来避免名称混乱 嵌套类必须声明在类的内部 xf
  • SONY VAIO P VPCP118KJ索尼酷袋本 鸡肋上网本初体验

    随着消费者市场需求的不断多样化和个性化 xff0c 个人电脑厂家开始不断突破创新 xff0c 在产品线拼装出各种各样的个人电脑 xff0c 主打性能的游戏本 xff0c 主打便携轻薄本 xff0c 2009年的CES上索大法推出了一款与众不
  • 第2课【CMSIS和标准库开发】标准库 CMSIS 分层

    目录 基本知识框架课堂笔记CMSISCMSIS的分层关系和作用CMSIS层文件结构内核函数层文件外设函数访问层文件 标准库开发标准库开发 LED GPIO标准库开发 KEY GPIO标准库开发 位带操作位带位带位带别名区位带区和位带别名区的
  • 第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟

    目录 基本知识框架课堂笔记时钟什么是时钟 xff1f 时钟有什么作用 时钟源HSE 外部高速时钟HSI 内部高速时钟LSE 外部低速时钟LSI 内部低速时钟PLL锁相环 主要时钟和其他时钟主要时钟其他时钟 配置系统时钟实验 基本知识框架Xm