当前位置: 首页 > news >正文

Stm32的时钟系统以及使用SysTick滴答定时器实现延时

前言

  • STM32的时钟系统由多个时钟源和时钟树组成
  • 时钟源包括主时钟源(HSE)、内部高速时钟源(HSI)、内部低速时钟源(LSI)和外部低速时钟源(LSE)。
  • 时钟树由多个时钟分频器和时钟门控器组成,可以将输入时钟源分频得到多个时钟信号,并且根据需要打开或关闭时钟门控器来控制时钟信号的输出。

下面这个是我从AI中查询的,我觉得还是很有参考意义的

STM32的主时钟源为HSE,可以通过外部晶振或者外部时钟信号输入。内部高速时钟源HSI为8MHz,可以通过RCC_CR寄存器控制开关。内部低速时钟源LSI为40kHz,主要用于RTC模块。外部低速时钟源LSE为32.768kHz,同样用于RTC模块。

时钟树主要由以下几个部分组成:

1.系统时钟分频器(SYSCLK):用于分频主时钟源或者内部高速时钟源,得到系统时钟(SYSCLK)。

2.AHB总线时钟分频器(HCLK):用于分频系统时钟,得到AHB总线时钟(HCLK)。

3.APB1总线时钟分频器(PCLK1):用于分频AHB总线时钟,得到APB1总线时钟(PCLK1)。

4.APB2总线时钟分频器(PCLK2):用于分频AHB总线时钟,得到APB2总线时钟(PCLK2)。

5.时钟门控器:用于控制各个外设的时钟开关,从而节省功耗。

下面对Stm32的时钟系统做一个系统性的复习和总结

Stm32时钟系统

时钟系统,理解时钟,看那个CubeMX时钟配置较为方便,虽然还是比较喜欢使用标准库哈哈

在Stm32中,有五个时钟源,分别为

HSI、HSE、LSI、LSE、PLL

  • 从时钟频率来看可以分为高速时钟源和内部时钟源

    HSI、HSE、PLL是高速时钟,LSI和LSE是低速时钟

  • 从来源来看分为外部时钟源和内部时钟源

    HSE和LSE是外部时钟源,其他的是内部时钟源


HSI 高速内部时钟

HSI是高速内部时钟,RC振荡器,频率为8MHZ

由内部的8MHZ的RC震荡器所产生

可以直接作为系统时钟,或者二分频作为PLL输入

看下图就清楚了


HSE 高速外部时钟

HSE是高速外部时钟,他的时钟信号由以下两种时钟源产生

  • HSE外部晶体/陶瓷谐振器,说的简单一些就是晶振
  • HSE用户外部时钟

这个频率的范围为4MHZ-16MHZ

一般接8MHZ的晶振

image-20230825105654801


PLL 锁相环倍频输出

PLL是锁相环倍频输出,PLL的输入可选

  • HSI二分频后输入
  • HSE输入
  • HSE二分频后输入

倍频可以选择2-16倍频,但是最大的输出频率不能超过72MHZ

时钟的选择和选择倍频因子必须在其被激活前完成

如果要使用USB口,PLL必须被设置为48或72MHZ的时钟,用于提供48MHZ的USBCLK时钟

image-20230825110312707


LSE 低速外部时钟

LSE是低速外部时钟,接外部晶振,频率为32.768KHZ

它为实时时钟RTC,或者其他定时功能提供一个低功耗且精确的时钟源

image-20230825120605594


LSI 低速内部时钟

LSI是低速内部时钟,RC震荡器,频率为40KHZ,独立看门狗的时钟源只能是LSI,同时LSI是一个低耗的时钟源

它可以在停机和待机模式下保持运行,为独立看门狗自动唤醒单元提供时钟


SYSCLK 系统时钟的选择

系统时钟SYSCLK的时钟来源可以是以下几种

  • HSI 高速内部时钟 8MHZ
  • HSE 高速外部时钟 8MHZ
  • PLL 锁相环输出 8MHZ-72MHZ(最大不能超过72MHZ)

image-20230825124223906

系统中所有外设的时钟来源都是来源于SYSCLK,SYSCLK通过AHB时钟分频后,送给各模块使用

其中

  • AHB总线、内核、内存和DMA使用的是HCLK时钟
  • 8分频至系统时钟,就是systick,滴答时钟
  • 至Cortex自由运行时钟FCLK
  • APB1外设时钟和定时器2-7
  • APB2外设时钟和定时器1和定时器8
  • ADC,可分频2、4、6、8分频,ADCCLK最大14MHZ

image-20230825135248047


RTC 实时时钟

RTC实时时钟,有以下三个来源

  • HSE 128分频
  • LSE 作为RTC时钟的输入
  • LSI 作为RTC时钟的输入

image-20230825124054621


CSS 时钟安全系统

一般来说,MCU的时钟基本上来源于外部晶振8MHZ,经过PLL锁相环倍频后,传递给系统时钟

但是如果晶振电路出现了错误,产生不了精确的时钟,那么CSS将会起作用

他会把系统时钟自动切换成HSI内部高速晶振,频率为8MHZ


MCO 内部时钟输出引脚

MCU允许输出时钟信号到外部MCO引脚,这个引脚是PA8

这个MCO时钟输出引脚可以输出

  • PLL锁相环2分频
  • HSI 内部高速时钟
  • HSE 外部高速时钟
  • SYSCLK 系统时钟

image-20230825124429338


STM32时钟框图

image-20230825124722666

image-20230825124800113


STM32启动文件的作用以及CL、VL、XL、LD、MD、HD的含义

启动文件的作用,在Stm32f10x_hd.s中,文件注释中已经详细介绍,经过翻译如下

  • 设置初始栈顶指针SP
  • 设置初始PC,让其初始值为Reset Handler
  • 设置除ISR地址外的向量表项
  • 配置时钟系统,同时配置外部时钟系统
  • 安装在STM3210E-EVAL板上的SRAM作为数据内存使用(可选,由用户决定)
  • 在C库中调用main()函数
  • 复位后,CortexM3处理器处于线程模式,优先级为Privileged,并且栈Stack设置为Main

image-20230825175753621

总的来说就是

  • 初始化栈指针和必要的程序
  • 从Systeminit()函数进入到main()函数(对于stm32,定义系统时钟首先在system_stm3210x.c文件中修改宏即可)
  • 建立中断服务入口地址(将中断向量和中断服务函数链接起来)

CL、VL、XL、LD、MD、HD 文件的含义

Stm32根据不同的使用场景和FLASH的大小,分为了不同的产品,不同的产品的缩写不同

  • CL : 互联型产品,Stm32F105/107 系列
  • VL :超值型产品,Stm32F100系列
  • XL : 超高精度产品,Stm32F101/103系列
  • LD : 低密度产品,FLASH小于64k
  • MD : 中密度产品,FLASH等于64K或者128K
  • HD : 高密度产品, FLASH大于128K

SysTick 滴答定时器

SysTick主要用来延时,或者是实时系统的心跳时钟,这样可以节省MCU的资源,不用浪费一个定时器

  • SysTick是一个24位的到倒计数定时器,当计数到0时,将从RELOAD寄存器中自动重装载定时初值,开始新一轮计数。只要不把SysTick控制及状态寄存器中的使能位清除,就永不停息

  • 即使在睡眠状态下也能工作运行

使用SysTick来实现延时,极大的节省了系统资源

  • SysTick定时器被捆绑在NVIC中断,用于产生SYSTICK中断(中断号为15)

SysTick的中断优先级也可以设置

Stm32F10xxx参考手册中 ,系统滴答校准值为9000,当系统滴答时钟设定为9MHZ,为HCLK/8的最大值时,产生1ms的基准

image-20230825184034817

CM3为SysTick提供两个时钟源

  • 内核的自由运行时钟FCLK(这个就是HCLK时钟)
    • 自由表现在不来自于系统时钟HCLK
    • 在系统时钟停止时,FCLK也继续运行
  • 外部参考时钟STCLK (这个一般是HCLK,AHB总线的1/8,9MHZ)

SysTick滴答定时器,在FreeRTOS中,就是使用SysTick滴答定时器来推动任务的切换和时间的管理

固件库中SysTick的配置在misc.ccore_cm3.h文件中

  • 其中SysTick的时钟源选择在misc.c文件中
  • 初始化SysTick在在core_cm3.h文件中

SysTick的时钟源选择
image-20230825191026965

SysTick的初始化

开启SysTick中断,并且使能SysTick中断,以及SysTick中断的时间间隔

简单的说ticks的值就是relaod的值,中断会在val==0的时候产生,两次中断就是val的值从reload到0的时间

从初始值开始,向下计数,计数到0,产生中断,如此反复
image-20230825193054148


使用SysTick实现延时

选择外部时钟HCLK,八分频,此时时钟为9MHZ

image-20230825193505904

我们在上面已经说过,当系统滴答时钟设定为9MHZ,为HCLK/8的最大值时,产生1ms的基准

初始化完成后,即可实现延时

将延时加载到LOAD寄存器中,并且清空计数器,等待时间到达,关闭计数器,清空计数器

间间隔

简单的说ticks的值就是relaod的值,中断会在val==0的时候产生,两次中断就是val的值从reload到0的时间

从初始值开始,向下计数,计数到0,产生中断,如此反复

image-20230825193054148

使用SysTick实现延时

选择外部时钟HCLK,八分频,此时时钟为9MHZ

image-20230825193505904

初始化完成后,即可实现延时

将延时加载到LOAD寄存器中,并且清空计数器,等待时间到达,关闭计数器,清空计数器

image-20230825193912698

相关文章:

Stm32的时钟系统以及使用SysTick滴答定时器实现延时

前言 STM32的时钟系统由多个时钟源和时钟树组成时钟源包括主时钟源(HSE)、内部高速时钟源(HSI)、内部低速时钟源(LSI)和外部低速时钟源(LSE)。时钟树由多个时钟分频器和时钟门控器组…...

重生c++系列之类与对象(中篇)

好的继上期,我们今天带来c类与对象系列的继续学习。 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。 …...

Java中synchronized基本介绍和细节讨论。使用Synchronized来解决售票超卖问题

基本介绍 线程同步机制:在多线程编程下,一些敏感数据不允许被多个现在在同一时刻访问,此时就使用同步访问机制,保证数据在任何同一时刻最多只有一个进程访问,以保证数据的完整性。(即:当有一个线程在对内存…...

java内存分区

按照垃圾收集,将 Java 堆划分为**新生代 (Young Generation)和老年代(Old Generation)**两个区域, 新生代存放存活时间短的对象,而每次回收后存活的少量对象,将会逐步晋升到老年代中…...

【JavaScript】V8 引擎解析 JavaScript 的过程

V8 是由 Google 开发的 JavaScript 引擎,用于执行 JavaScript 代码。它被广泛应用于 Chrome 浏览器和 Node.js 等环境。V8 的解析和执行过程是一个复杂的流程,以下是其大致步骤: 词法分析(Lexical Analysis)&#xff1…...

Qt:界面实时响应鼠标拖动绘制

采用双缓冲实现界面实时响应鼠标的拖动绘制。 思想如下:首先需要两张画布pix和tempPix,他们都是QPixmap实例;pix用来保存初始界面或上一阶段以完成的绘制;tempPix用来作为鼠标拖动时的实时界面绘制;当鼠标左键按下后拖…...

Docker拉取RocketMQ及可视化界面

本文介绍Docker拉取RocketMQ及可视化界面操作步骤 Linux下安装Docker请参考:Linux安装Docker 文章目录 安装namesrv创建挂载目录授权相关权限拉取镜像运行容器查看运行情况 安装Broker创建挂载目录及配置文件目录授权相关权限创建配置文件运行容器查看运行情况 安装…...

花5分钟判断,你的Jmeter技能是大佬还是小白!

jmeter 这个工具既可以做接口的功能测试,也可以做自动化测试,还可以做性能测试,其主要用途就是用于性能测试。但是,有些公司和个人,就想用 jmeter 来做接口自动化测试。 你有没有想过呢? 下面我就给大家讲…...

macOS - 安装 Python 及地址

文章目录 Python 官方安装包Pip3Applications - PythonMiniconda多个python环境有多种方式安装 python,比如 Python 官方包、anaconda、miniconda、brew 等 这里记录使用 Python 官方包进行安装,和 miniconda 安装方式,以及安装后 各执行文件、安装包的地址。 明确这些地址后…...

前端组件库造轮子——Tree组件开发教程

前端组件库造轮子——Tree组件开发教程 前言 本系列旨在记录前端组件库开发经验,我们的组件库项目目前已在Github开源,下面是项目的部分组件。文章会详细介绍一些造组件库轮子的技巧并且最后会给出完整的演示demo。 文章旨在总结经验,开源分…...

java打war包、jar包方式,java运行war包、jar包方式

Java spring boot部署到生产环境有两种常见方式 1打jar包&#xff0c;使用了内置的tomcat服务器&#xff0c;流程简单 2打war包&#xff0c;可以放标准tomcat服务器中 jar包 1pom.xml新增 <build><plugins><plugin><groupId>org.springframework.b…...

“超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据,ChatGLM-v2、中文Bloom、Dolly_v2_3b助您实现更智能的应用!”

“超级AI助手&#xff1a;全新提升&#xff01;中文NLP训练框架&#xff0c;快速上手&#xff0c;海量训练数据&#xff0c;ChatGLM-v2、中文Bloom、Dolly_v2_3b助您实现更智能的应用&#xff01;” 1.简介 目标&#xff1a;基于pytorch、transformers做中文领域的nlp开箱即用…...

空时自适应处理用于机载雷达——机载阵列雷达信号环境(Matla代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

lib61850 学习笔记一 (概念)

IEC61850 定义60多种服务满足变电站通信需求。支持在线获取数据模型&#xff0c;也支持IED水平通信&#xff08;GOOSE报文&#xff09; 术语定义 间隔 bay: 变电站由据应公共功能紧密连接的子部分组成。 例如 介于进线或者 出线 和母线之间的断路器&#xff1b;二条母线之间…...

【深度学习】半监督学习 Efficient Teacher: Semi-Supervised Object Detection for YOLOv5

https://arxiv.org/abs/2302.07577 https://github.com/AlibabaResearch/efficientteacher 文章目录 AbstractIntroductionRelated WorkEfficient TeacherDense Detector Abstract 半监督目标检测&#xff08;SSOD&#xff09;在改善R-CNN系列和无锚点检测器的性能方面取得了成…...

vue3鼠标拖拽滑动效果

第一步 在utils下面新建一个directives.js文件&#xff0c;然后引入如下代码 const dragscroll (el) > {el.onmousedown ev > {const disX ev.clientX;const disY ev.clientY; // 需要上下移动可以加const originalScrollLeft el.scrollLeft;const originalScroll…...

08 通过从 库1 复制 *.ibd 到 库2 导致 mysql 启动报错

前言 呵呵 最近同事有这样的一个需求 需要将 库1 的一张表 复制到 库2 然后 我想到了 之前一直使用的通过复制这个库的 data 文件来进行数据迁移的思路, 是需要复制这个 库对应的 data 目录下的数据文件, 以及 ibdata1 文件 然后 我又在想 这里的场景能否也使用这里的额方式…...

一生一芯9——ubuntu22.04安装valgrind

这里安装的valgrind版本是3.19.0 下载安装包 在选定的目录下打开终端&#xff0c;输入以下指令 wget https://sourceware.org/pub/valgrind/valgrind-3.19.0.tar.bz2直至下载完成 解压安装包 输入下面指令解压安装包 tar -xvf valgrind-3.19.0.tar.bz2.tar.bz2注&#xf…...

STM32中BOOT的作用 (芯片死锁解决方法)

BOOT stm32中具有BOOT1和BOOT0 作用 BOOT是stm32单片机的启动模式&#xff0c; 通过不同组合模式&#xff0c;共有三种启动方式。 一般来说就是指我们下好程序后&#xff0c;重启芯片时&#xff0c;SYSCLK的第4个上升沿&#xff0c;BOOT引脚的值将被锁存。用户可以通过设置B…...

基于YOLOv8模型和DarkFace数据集的黑夜人脸检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型和DarkFace数据集的黑夜人脸检测系统可用于日常生活中检测与定位黑夜下的人脸&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目…...

Promises/A+性能优化指南:让你的异步代码运行得更快

Promises/A性能优化指南&#xff1a;让你的异步代码运行得更快 【免费下载链接】promises-spec An open standard for sound, interoperable JavaScript promises—by implementers, for implementers. 项目地址: https://gitcode.com/gh_mirrors/pr/promises-spec 在Ja…...

仅限本周开放|DeepSeek Chat V3.2功能测试黄金 checklist(含17个边界Case+响应时延基线数据)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek Chat V3.2功能测试黄金 checklist 发布说明 DeepSeek Chat V3.2 已正式面向开发者开放灰度测试&#xff0c;本次版本聚焦多模态理解增强、长上下文稳定性优化及企业级安全策略集成。为保障测试…...

ReID跨镜需人工复核,镜像视界无感定位实现全自动全链路闭环

ReID跨镜需人工复核&#xff0c;镜像视界无感定位实现全自动全链路闭环在全域视频感知与人员动态管控行业应用落地进程中&#xff0c;传统依托ReID行人重识别搭建的跨镜追踪体系&#xff0c;长期深陷算法识别偏差大、数据容错率低、最终必须依赖人工二次复核的运营困局&#xf…...

使用git filter-repo删除已提交到git中的敏感信息,api key,配置文件等

使用git filter-repo删除已提交到git中的敏感信息&#xff0c;api key&#xff0c;配置文件等 前提条件 Python 3.5 git > 2.22.0通过 pip 安装&#xff1a;pip install git-filter-repo 注意事项 官方推荐在fresh clone上修改&#xff0c;即clone一份远程的再做修改 操作后…...

当比你资历浅的人成了你的上级,技术人的心态调整指南

阶段一&#xff1a;缺陷定位——从审视“测试用例”开始当问题出现时&#xff0c;优秀的测试工程师不会立刻指责开发&#xff0c;而是先检查自己的测试环境、数据和步骤。面对年轻领导的晋升&#xff0c;我们同样需要运用这套严谨的思维&#xff0c;进行一次彻底的“根因分析”…...

基于RAG与智能分块构建LLM本地知识库:llm-books开源工具实战

1. 项目概述&#xff1a;一个为LLM“喂书”的开源工具最近在折腾大语言模型本地应用的朋友&#xff0c;可能都遇到过同一个头疼的问题&#xff1a;怎么让模型“读懂”我手头那几百页的PDF报告、电子书或者研究论文&#xff1f;直接复制粘贴&#xff1f;上下文长度不够。手动分段…...

FPGA上LUT-DNN稀疏连接优化技术SparseLUT详解

1. 项目概述在边缘计算场景中&#xff0c;FPGA因其可重构性和低功耗特性成为部署深度神经网络(DNN)的理想平台。然而传统DNN在FPGA上的实现面临资源占用高、延迟大等挑战。基于查找表(LUT)的DNN通过将神经元计算映射到FPGA原生LUT资源&#xff0c;显著提升了硬件效率。但现有LU…...

MongoDB避坑指南:电脑名含中文导致 Invalid UTF-8 string 报错的完美解决

前言最近在配置 MongoDB 本地环境时&#xff0c;遇到了一个非常“玄学”的报错。明明按照教程一步步安装&#xff0c;环境变量也配好了&#xff0c;但无论是启动服务&#xff0c;还是使用 MongoDB Compass 连接本地数据库&#xff0c;都会直接报错。排查了半天&#xff0c;最后…...

Simulink仿真PMSM时,那个神秘的‘4’和‘30/π’到底怎么来的?手把手带你算清楚

Simulink仿真PMSM时关键参数转换原理与实战解析 在永磁同步电机(PMSM)的Simulink仿真过程中&#xff0c;工程师们常常会遇到几个看似"神秘"的增益系数——特别是30/π和4这两个数值。这些参数并非随意设置&#xff0c;而是深植于电机物理本质与单位系统转换的数学表达…...

告别XDMA限制:用开源Riffa框架在Linux下轻松实现多通道PCIE DMA通信(Kintex-7实测)

突破XDMA瓶颈&#xff1a;开源Riffa框架在Linux下的多通道PCIE DMA实战指南&#xff08;Kintex-7验证&#xff09; 当FPGA开发者面临高速数据采集、实时信号处理或多设备协同工作时&#xff0c;PCIE DMA通道的数量往往成为系统性能的瓶颈。Xilinx官方XDMA方案虽然稳定&#xff…...