STM32 时钟 定时器基础

2023-05-16

  • STM32 —— Clock Tree

    时钟源

    1. HSI:(High Speed Internal)内部的 RC 震荡电路产生时钟信号。
    2. HSE:(High Speed External) 外部晶振产生时钟信号。

    采用外部晶振信号原因在于:

    1. 晶振信号准确度更高
    2. 部分外设只能在晶振信号下工作
    1. LSE:(Low Speed External)外部晶振
    2. LSI:(Low Speed Internal)内部 RC

    在这里插入图片描述

    以上图为例:

    1. 低速时钟信号提供给 RTC (Real Time Clock)和 IWDG
    2. 高速时钟信号,经过时钟选择器(System Clock Mux),输出给 SYSCLKSYSCLK分频(AHB Prescaler )作为 AHB 时钟信号。AHB 信号经过分频作为 APB1APB2 时钟信号。

    CubeMX 设置

    RCC

    时钟源有两种提供方式:CrystalBYPASSCrystal 就是石英晶振,两条线接入 OSC_INOSC_OUT 。而 BYPASS (官方文档也称为 External Source ),则是只提供 OSC_INOSC_OUT 引脚悬空。

    RCC 下面的 Master Clock Output 则是可以让 RCC_MCO 输出时钟信号,给其它外设使用。

    如果用一块 STM32 给另一块板子提供时钟信号,那么从设备就应该选择 BYPASS

    SYS

    下面有 Timebase Source ,选择作为系统时钟的时钟源。系统时钟中断产生周期由一下语句确定

    HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq));
    

    SystemCoreClock 变量由 SystemCoreClockUpdate() 函数维护。每当 SysTick 提供时钟改变时,此变量也会相应改变。手动修改时注意

    定时器

    定时器是 MCU 中自主运行(free-running)的计数器。其时钟源可以来自以下三个方面:

    1. 内部时钟,也就是 Timer 所在的总线。
    2. 外部时钟源。
    3. 其余定时器作为时钟源。

    定时器分类

    更高级的定时器继承了低级定时器的所有功能。

    Basic Timers

    Basic Timers are 16-bit timers used as time base generator, and they do not have output/input pins. Basic timers can also be used as “master” for other timers.

    基本定时器从 0 计数到 Period 值,计数频率由挂载的是时钟总线决定,并可由 Prescalar 分频。当溢出时会产生 Update Event(UEV) 中断,并自动从初值(0)开始计数。

    基础定时器的主要结构由三个寄存器构成—— Counter Register (TIMx_CNT,当前计数值) / Prescaler Register (TIMx_PSC,预分频) / Auto-Reload Register (TIMx_ARR,溢出比较值)。当定时器使能后,每一个寄存器都可由软件读写。

    在这里插入图片描述

    PSC 的值存放在 Prescaler Control Register 里,当产生更新事件时,才会装载到 Prescaler Buffer 中,并在下一个计数周期内产生作用。

    更新事件 (Update Event,UEV)

    更新事件产生与否由 CR1 中 UDIS 位决定。当此位使能后,更新事件可由以下三种方式产生:

    1. 计数器上溢出或者下溢出。
    2. 设置 EGR 寄存器中的 UG 位。
    3. 从设备 (slove mode) 产生。

    当更新事件产生后,CNT 清 0 ,自动装载影子寄存器由 ARR 装载,预分频缓存由预分频寄存器装载。设置中断标志位(如果 SR 寄存器的 UIF 使能)

    EGR 寄存器 (Event Generation Register) 可由软件设置,由硬件自动清除。如果用软件将其末位置 1,会重置这个定时器并产生更新事件。(预分频计数器也会被重置)

    CubeMX 配置

    在这里插入图片描述

    • Prescalar :将总线的时钟频率分频后作为定时器的时钟频率。
    • Period : 定时器的计数上限。

U p d a t e E v e n t = T i m e r c l o c k ( P r e s c a l a r + 1 ) ( P e r i o d + 1 ) H z UpdateEvent = \frac{Timer_{clock}}{(Prescalar+1)(Period+1)} Hz UpdateEvent=(Prescalar+1)(Period+1)TimerclockHz

  • CounterMode: 指定计数方式。上升、下降、中间对齐。
  • auto-reload preloadAPRE 位;是否预先装载。ARR 实际上有两个寄存器,一个是可以直接操作,另一个无法直接操作的。根据 TIMx_CR1 寄存 器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2 者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。

使用

  • 中断方法

作为基本定时器,每隔一段时间产生一次中断。中断产生频率由 PeriodPrescalar 确定。HAL_TIM_Start_IT 开始中断传输;定时器溢出(计数到 Period)后,产生UIF中断(或者由 __HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET 判断)。

采用 STM32 HAL 库编程时,中断处理有对应的回调函数。在回调函数中判断传入的设备号后执行相应的代码。

中断处理结束后,记得清楚其标志位。 __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE)

  • Polling 方法

轮询时,使用大于等于判断;这主要是由于 CPU 执行需要消耗时间,很难精确读到某个值。采用函数读取 __HAL_TIM_GET_COUNTER(&tim) 计数器的值。

  • DMA Mode

采用 DMA,能释放 CPU 更多资源(CPU 不用去处理定时器频繁的中断)。应用于诸如 PWM 场景。

定时器 DMA 请求设定是 __HAL_TIM_ENABLE_DMA 。是设置定时器寄存器 DIER 寄存器相应位,开启 DMA 请求。与中断类似,在定时器计数溢出时,会发出 DMA 请求,DMA 依据配置执行数据传送。

HAL 库中无法使能基本定时器,给控制寄存器赋值后没有反应。

General Purpose Timers

通用定时器可以采用外部时钟源作为定时器的计数信号。

外部时钟源

  • External Clock Mode2 (ETR2)

在这里插入图片描述

当选择 Clock Source 为 ETR2 时,定时器采用外部时钟源。额外多出下面三个参数:

  • Clock Filter 设置的是 SMCR 寄存器的 ETF 位,具体见参考手册。默认置 0 即可。
  • Clock Polarity 信号源是否反转,设置的是 SMCR 寄存器的 ETP 位。
  • Clock Prescaler 输入时钟信号的预分频。

也可以采用内部其它定时器提供的信号作为另一个定时器的时钟源

  • External Clock Mode1 (ETR1)

在 ETR1 模式下的定时器能够接受内部 ITR0 ~ ITR3 的信号与 TI1FP1 与 TI2FP2 外部信号源。参数配置与 ETR2 相同。如果选择内部线的话,需要配置主定时器,会用到 Trigger Event Selection

  • Trigger Event Selection:主从设备设置时使用,本质上设置的是 CR2 寄存器。选择 Reset,是将主定时器 EGR 寄存器的 UG 位作为触发信号,也就是主定时器重置时,从定时器触发一次。Update Event,主定时器的更新事件作为触发信号,当主定时器溢出时触发从定时器。Enable,主定时器的使能位作为触发信号,主定时器使能触发从定时器更新。

从定时器被触发时可以使能相应的中断,可以编写 HAL_TIM_TriggerCallback 中断函数处理。

  • 软件强制生成事件

设置定时器的 EGR 寄存器可以强制其生成事件。 HAL 库提供 HAL_TIM_GenerateEvent。强制生成事件可以:

  1. 若生成更新事件,可以让 ARR 寄存器值装载到影子寄存器中。可以让主寄存器触发从寄存器。

Advanced Timers

typedef struct { 
    uint32_t Prescaler; /* Specifies the prescaler value used to divide the TIM clock. */ 
    uint32_t CounterMode; /* Specifies the counter mode.*/ 
    uint32_t Period; /* Specifies the period value to be loaded into the active Auto-Reload Register at the next update event.*/ 
    uint32_t ClockDivision; /* Specifies the clock division.*/ 
    uint32_t RepetitionCounter; /* Specifies the repetition counter value.*/ 
} TIM_Base_InitTypeDef; 

typedef struct { 
    TIM_TypeDef* Instance; /* Pointer to timer descriptor */ 
    TIM_Base_InitTypeDef Init;/* TIM Time Base required parameters */ 
    HAL_TIM_ActiveChannel Channel; /* Active channel*/ 
    DMA_HandleTypeDef* hdma[7]; /* DMA Handlers array*/ 
    HAL_LockTypeDefLock;/* Locking object*/ 
    __IO HAL_TIM_StateTypeDef State; /* TIM operation state*/ 
} TIM_HandleTypeDef; 
  • ClockDivision: 外部输入时钟信号与内部计数时钟信号之间的分频系数。

HAL_TIM_IRQHandler 可以适当剪裁,其功能有些多余。

  • hdma :计数器有七种 DMA 请求,与这个数组一一对应。

中断处理

在这里插入图片描述

HAL 采用统一的定时器中断处理函数,按如下划分中断事件。每个 IF 语句中有回调函数,只需要定义回调函数处理对应中断事件即可。

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

STM32 时钟 定时器基础 的相关文章

  • 正点原子MiniFly V1.2学习笔记四---txQueue队列数据哪来

    笔记二的第四点中 xff0c 把解包出来的指令发送到 rxQueue队列里 xff0c 然后从txQueue队列取数据发送到串口 那么txQueue队列的数据从哪里来的 一 txQueue数据从哪里来 xff1f 二 什么地方会调用radi
  • redis链接工具

    redis链接工具 今天推荐一款redis链接工具 xff0c 其实世面上连接redis的工具很多 xff0c 但是好用的很少 例如 xff1a redis desktop manager这款工具也不错 xff0c 但是我个人不能使用 xf
  • Linux 网络编程——UDP编程

    一 概述 UDP 是 User Datagram Protocol 的简称 xff0c 中文名是用户数据报协议 xff0c 是一个简单的面向数据报的运输层协议 xff0c 在网络中用于处理数据包 xff0c 是一种无连接的协议 UDP 不提
  • 给指定的寄存器地址:0x0001eea7 ,赋值

    coretexM0平台上给指定的寄存器地址 xff1a 0x0001eea7 赋值100 怎么实现 xff1f xff08 volatile char xff09 0x0001eea7 61 100 xff1b 常见错误1 xff1a xf
  • 常见cmake命令总结

    常见cmake命令总结 cmake常见命令 cmake minimum required 指定CMake的最小版本要求 cmake minimum required VERSION 2 8 project 定义工程名称 project PR
  • 利用Qt Phonon框架制作音视频播放器

    Phonon严格来说其实非为Qt的library xff0c Phonon原本就是KDE 4的开放源代码多媒体API xff0c 後来与Qt合并与开发 xff0c 所以简单来说就是Qt使用Phonon这个多媒体框架来提供一般影音多媒体档案的
  • 主设备号和次设备号

    Linux的设备管理是和文件系统紧密结合的 xff0c 各种设备都以文件的形式存放在 dev目录下 xff0c 称为设备文件 应用程序可以打开 关闭和读写这些设备文件 xff0c 完成对设备的操作 xff0c 就像操作普通的数据文件一样 为
  • Makefile中的wildcard用法

    在Makefile规则中 xff0c 通配符会被自动展开 但在变量的定义和函数引用时 xff0c 通配符将失效 这种情况下如果需要通配符有效 xff0c 就需要使用函数 wildcard xff0c 它的用法是 xff1a wildcard
  • GPIO

    一 什么是GPIO xff1f 首先应该理解什么是GPIO GPIO xff0c 英文全称为General Purpose IO ports xff0c 也就是通用IO口 在嵌入式系统中常常有数量众多 xff0c 但是结构却比较简单的外部设
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • vivi源代码最为详细分析(二)

    现在进入bootloader之vivi分析的第二阶段 xff0c 这部分使用C语言实现 xff0c 部分代码采取内嵌汇编的方式 这里需要用到GNU GCC内嵌汇编 的知识 xff0c 这部分基础还没有具备 xff0c 需要学习 下面先按照流
  • vivi源代码最为详细分析(三)

    step 5 xff1a MTD设备初始化 关于什么是MTD xff0c 为什么要使用MTD xff0c MTD技术的架构是什么 xff0c 等等 xff0c 可以参考 Linux MTD源代码分析 xff08 作者 xff1a Jim Z
  • 【笔记】docker-compose.yml 文件更改后重新启动加载更改后的内容

    docker compose yml 文件更改后想使之立刻生效 xff0c 但是不想手动删除已经建立的 container 等信息可以运行下面命令 重新创建容器实现修改 docker compose up force recreate d
  • bootloader开发阶段总结以及可能会碰到的问题

    到今天 xff0c vivi源代码基本分析完毕 对bootloader有了更深层的认识 在此期间 xff0c 仔细阅读了毛德操 胡希明先生编著的 嵌入式系统 采用公开源代码和StrongARM XScale处理器 第七章 xff1a 嵌入式
  • 用模式一实现用户登录功能

    login jsp为显示登录表单和处理登录请求的页面 xff0c 登录成功后跳转到logonSuccess jsp页面 xff0c 登录失败时重新显示登录表单和失败的帮助信息 xff0c 以便用户重新登录 xff1b 如果已登录用户再次访问
  • UDP通信 (C语言实现)

    直接看代码吧 v乛 乛 udp server c 文件信息 文 件 名 udp server c 创 建 人 文件创建日期 年 月 日 描 述 UDP 回射服务器程序
  • jni中使用extern "C"的原因

    首先 cplusplus这个宏是微软自定义宏 xff0c 大小是个整数 xff1a cplusplus This macro is defined when the C 43 43 compiler is in use You can us
  • VmWare虚拟机设置ubuntu和windows之间的共享文件夹

    一般在进行编程作业的时候 xff0c 我们会采用 开发在Windows中编辑源代码 xff0c 在linux中编译 执行源代码 这往往需要需要将在Windows下编辑好的源代码上传到linux系统种进行编译 怎么来进行上传呢 xff1f 其
  • C++的最后一道坎|百万年薪的程序员

    导语 C 43 43 的起源可以追溯到 40 年前 xff0c 但它仍然是当今使用最广泛的编程语言之一 xff0c C 43 43 发明人Bjarne Stroustrup 一开始没想到 C 43 43 会获得如此大的成功 xff0c 他说
  • Modbus 协议

    1 主站 xff1a 可以进行读写操作 从站 xff1a 只能被动响应主站操作 2 一个 Modbus 网络只有一个主站 xff0c 可以多个从站 xff08 主站不用连在两端 xff09 485 通讯 1 接线 最多 254 个站 xff

随机推荐

  • 数据结构对齐

    xfeff xfeff 对齐的算法 xff1a 由于各个平台和编译器的不同 xff0c 现以本人使用的gcc version 3 2 2编译器 xff08 32位x86平台 xff09 为例子 xff0c 来讨论编译器对struct数据结构
  • 关于示波器测485串口波特率的使用方法总结

    之前没有用过示波器 xff0c 更不知道怎么来测试串口的波特率 xff0c 结果遇到一客户说我们产品的波特率达不到9600 xff0c 只有9100 xff0c 为了验证这一说法 xff0c 我们只能自己测试一下 说明 xff1a 产品通过
  • C语言对寄存器封装

    一 封装外设 用C语言代码把外设地址映射用宏定义封装 span class hljs comment 外设基地址 span span class hljs preprocessor define PERIPH BASE unsigned i
  • JavaJDK下载安装与环境配置(Windows 10 超详细的图文版教程 )

    前言 xff1a 对于很多初学者来说 xff0c 我想可能很多人都会遇到JDK环境变量的配置问题 明明就是按照度娘上的教程去一步步配置的 xff0c 但还是会有很多的人出现配置不成功的问题 所以今天在这里分享一下windows 10 系统下
  • win32 获取窗口句柄的方法

    第一种方法是根据窗口句柄值获取窗口句柄 使用spy 43 43 获取指定窗口的窗口句柄值 xff0c 因为句柄值是16进制数 xff0c 所以前面加0x 然后进行强制转换为HWND类型 HWND hWnd 61 HWND 0x0028072
  • 当设置display:inline;时li的宽度无效的解决方法

    若制作导航栏时 xff0c 使用列表li 的定义时 xff0c 若想加上一个背景图 xff0c 这时候若定义li的一个属性为 li display inline width 83px height 30px xff0c 则浏览器会无视后面的
  • js文本框或者按钮鼠标悬停提示说明文字

    html页面中很多元素会用到文本提示 xff0c 当鼠标悬停之后显示一段说明文字 显示说明性文字 function tips id str t 61 getTop document getElementById id document ge
  • localstorage兼容ie8以下浏览器的问题

    最近在做一个网站 xff0c 由于希望尽可能减小服务器的压力 xff0c 也想提高网站的运转速度 xff0c 就想尽可能少的在服务器上读写数据以及下载重复数据 xff0c 需要重复使用的数据 xff0c 就储存在本地 xff0c 能在本地进
  • HTTP请求返回状态码中301与302的状态码区别

    一 xff0e 官方说法 301 xff0c 302 都是HTTP状态的编码 xff0c 都代表着某个URL发生了转移 xff0c 不同之处在于 xff1a 301 redirect 301 代表永久性转移 Permanently Move
  • java防止 csrf 攻击 --- 采用 spring .

    CSRF xff08 Cross site request forgery xff09 xff0c 中文名称 xff1a 跨站请求伪造 xff0c 也被称为 xff1a one click attack session riding xff
  • Gson解析数组多类型元素

    why used gson Gson is a Java library that can be used to convert Java Objects into their JSON representation It can also
  • js中获取时间new Date()详细介绍

    1 var myDate 61 new Date Date 返回当日的日期和时间 getDate 从 Date 对象返回一个月中的某一天 1 31 getDay 从 Date 对象返回一周中的某一天 0 6 getMonth 从 Date
  • 如何让一个行内元素(如一张图片)在div中居中

    xff08 1 xff09 第一种 xff1a 用vertical align lt div class 61 34 method1 34 gt lt span class 61 34 tiptop 34 gt lt span gt lt
  • 释放webpack tree-shaking潜力之webpack-deep-scope-analysis-plugin

    在上周末广州举办的 feday 中 webpack 的核心开发者 Sean 在介绍 webpack 插件系统原理时 隆重介绍了一个中国学生于 Google 夏令营 在导师 Tobias 带领下写的一个 webpack 插件 https gi
  • iframe跨域通信的通用解决方案

    此方案已有新版本 请查看 iframe跨域通信的通用解决方案 第二弹 xff08 终极解决方案 xff09 本文章可做技术学习供继续交流 一 背景 在这个Web页面越来越丰富的时代 xff0c 页面通过iframe嵌入其他的页面也越来越常见
  • C++实现轻量级RPC分布式网络通信框架

    前言 xff1a 2022 4 14更新 xff1a 在我重新回顾这篇文章的时候 xff0c 我觉得里面内容有点乱 xff0c 主要还是因为RPC里面涉及到很多概念和知识点 本来代码内容就已经挺抽象了 xff0c 还要结合各种概念 xff0
  • 浅谈JavaScript设计模式

    创建型模式 xff1a 该模式处理的是用于创建对象的各种机制 工厂方法抽象工厂建造者原型单例 结构型模式 xff1a 考虑的是对象的组成以及对象彼此之间的关系 适配器桥接组合装饰器外观享元代理 行为型模式 xff1a 关注的是对象之间的依赖
  • Ardupilot-SITL仿真模拟调试

    1 配置SITL仿真调试 span class token punctuation span span class token operator span waf configure span class token operator sp
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • STM32 时钟 定时器基础

    STM32 Clock Tree 时钟源 HSI xff1a xff08 High Speed Internal xff09 内部的 RC 震荡电路产生时钟信号 HSE xff1a xff08 High Speed External xff