HAL+M4学习记录_7
一、TIM
记录学习HAL配置TIM定时器
1.1 简介
TIM(timer)定时器,16位或32位(TIM2和TIM5)计数器、预分频器(16位)、自动重装寄存器的时基单元;可对输入时钟进行计数,在计数值达到设定值时触发中断;根据复杂度和应用场景划分为了高级定时器、通用定时器和基本定时器;控制器上所有定时器都是彼此独立的,不共享任何资源。
| 类型 | 编号 | 总线 | 功能 |
|---|---|---|---|
| 高级 | TIM1、TIM8 | APB2 | 通用寄存器全部功能,重复计数器、死区生成、互补输出和刹车输入 |
| 通用 | TIM2 to TIM5、TIM9 to TIM14 | 9、10和11在APB2,其他在APB1 | 基本定时器全功能,内外时钟源选择、输入捕获、输出比较、编码器接口和主从触发模式,9-14只支持向上计数 |
| 基本 | TIM6、TIM7 | APB1 | 定时中断、主模式触发DAC功能 |
1.2 通用定时器
TIM2 to TIM5拥有4个独立通道,这里给出通用定时器框图

通过框图,可以得到以下信息
- TIMx_ETR:外部触发接口,ETR支持多种输入源:输入引脚(默认配置)、比较器输出和模拟看门狗
- 左侧TIMx_CHx:4个独立通道,主要用于输入捕获
- TRGO:内部输出通道,主要用于定时器级联,ADC、DAC的定时器触发
- OCx:4组输出比较单元
- 右侧TIMx_CHx:4个独立通道,主要用于输出比较
最上面一部分是定时器的时钟选择,有四个选择
- 内部时钟模式
CK_INT一般是84MHz。如果APB分频系数是1,则APB总线定时器时钟=APB总线时钟;如果APB分频系数不是1,则APB总线定时器时钟=APB总线时钟x2。 - 外部时钟模式1
外部时钟源使用外部输入引脚TIx作定时器时钟源。 - 外部时钟模式2
外部时钟源使用外部触发输入ETR,在TIM2 to TIM4中可用。 - 内部触发输入
内部触发输入ITRx,使用一个定时器作另一个定时器的时钟源。
框图右上角部分是控制器部分,有三个部件
- 触发控制器:对片内的一些外设输出,即内部输出通道
- 从模式控制器:控制计数器的复位、使能、递增/递减计数
- 编码器接口:用于电机控制
框图中间部分是时基单元,该部分包括三个寄存器
- 计数器寄存器(TIMx_CNT)
计数值是建立在分频的基础上,如预分频后频率为84MH在,那么计84次数为1us;该寄存器以CK_CNT为时钟。 - 预分频寄存器(TIMx_PSC)
用于设置定时器的分频。 - 自动重加载寄存器(TIMx_ARR)
自动重加载寄存器是计数器寄存器能达到的最大计数值;自动重加载寄存器内容是预装载的,对其进行读写操作会访问预装载寄存器;预装载寄存器内容既可以永久传送到影子寄存器(让设置立即起到效果的寄存器,能保证时钟同步),也可以在每次更新事件时传送到影子寄存器,就是让ARR寄存器的数值立即更新还是在每次更新事件发生的时候更新;自动重加载寄存器的值不能直接传到计数器寄存器,中间会经过一个影子寄存器,最后传到计数器寄存器。
框图左下部分是输入捕获功能:外部信号TIx由通道进入,先经过输入滤波和边沿检测,生成TIxFP1和TIxFP2;捕获通道ICx会根据软件对输入信号进行选择,后面的预分频器决定发生多少个事件进行一次捕获;经过预分频器的信号ICxPS是最终被捕获的信号,当发生捕获时,计数器CNT的值会被锁存到捕获寄存器CCR中并产生CCxI中断。
框图右下部份是输出比较功能:输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道X(x=1,2,3,4)设置为匹配时输出有效电平、将通道X设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1和PWM2这八种模式。当计数器CNT的值跟CCR的值相等时,输出参考信号OCxREF的极性会被改变,同时产生比较中断CCxI,相应的标志位会置位;在经过输出控制器后,产生输出信号OCx,OCx信号直接就是OCxREF信号。
1.3 时序图分析
- 预分频计数器时序
- 在预分频由1变为2的时序图

CK_CNT原以CK_PSC同频,在改变分频系数后,会等待更新事件以更新CK_CNT频率,同时计数器寄存器会清零开始重新计数;在写入一个新的分频值时,更新事件发生之前计数器寄存器一直使用预分频器缓冲值(影子寄存器)进行计数,在更新事件发生时这个缓冲值才会被更新,然后计数器寄存器以更新后的分频值进行计数;预分频计数器频率不变,仍以预分频缓冲值为极点进行计数。 - 在预分频由1变为4的时序图

CK_CNT原以CK_PSC同频,在改变分频系数后,会等待更新事件以更新CK_CNT频率,同时计数器寄存器会清零开始重新计数;在写入一个新的分频值时,更新事件发生之前计数器寄存器一直使用预分频器缓冲值(影子寄存器)进行计数,在更新事件发生时这个缓冲值才会被更新,然后计数器寄存器以更新后的分频值进行计数;预分频计数器频率不变,仍以预分频缓冲值为极点进行计数。
计数器计数频率: C K _ C N T = C K _ P S C ( P S C + 1 ) CK\_CNT = \frac{CK\_PSC}{(PSC+1)} CK_CNT=(PSC+1)CK_PSC
定时器定时周期: T = 1 C K _ C N T T = \frac{1}{CK\_CNT} T=CK_CNT1
- 在预分频由1变为2的时序图
- 计数器时序
这里设置ARR=0x36,改变时钟频率以查看计数器变化,CK_INT = CK_PSC-
分频系数为1

可以看到,在使能位出现后,CNT在下一个上升沿更新频率,计数器寄存器开始计数;在遇到极值时,计数器溢出事件发生,同时更新事件发生,产生更新中断标志,计数器寄存器重新计数。 -
分频系数为2

可以看到,CNT虽然在下一个上升沿就更新频率,但并不是在下一个上升沿就开始工作,而是在经过分频系数个上升沿后才开始工作 -
分频系数为4

-
分频系数为N

计数器溢出频率: C K _ C N T _ O V = C K _ C N T / ( A R R + 1 ) = C K _ P S C / ( P S C + 1 ) / ( A R R + 1 ) CK\_CNT\_OV = CK\_CNT/(ARR+1) = CK\_PSC/(PSC+1)/(ARR+1) CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)
-
- 计数器预装时序
-
计数器无预装值

自动重加载寄存器没有预装值,那么影子寄存器中也没有值,计数器寄存器当前值会与ARR值进行比较,若当前值大于ARR值,则产生计数溢出事件;若小于ARR值,则继续计数直到溢出。 -
计数器有预装值

自动重加载寄存器没有预装值,那么影子寄存器中有值,计数器寄存器会以预装值为极值继续计数,直到碰到预装值,发生计数溢出同时更新ARR,即计数极值。
-
1.4 捕获/比较通道
-
输入捕获模式
在输入捕获模式,捕获/比较寄存器TIMx_CCRx用于在相应的ICx信号检测到转变后锁存计数器的值,即通道输入引脚出现指定电平跳变时,当前CNT的值会被锁存到CCR中。可用于测量PWM波频率、占空比、脉冲间隔、电平持续时间等,可配置为PWMI模式,同时测量频率和占空比;可配置为主从触发模式,实现硬件全自动测量。

-
输出比较模式
使用时基单元的寄存器仅仅能设置周期,不能设置占空比。输出比较OC可以通过比较CNT与CCR的关系来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波。

二、TIM的HAL库用法
2.1 定时器寄存器结构体
在stm32f4xx.h文件中给出了这个类型定义
typedef struct
{ __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */
} TIM_TypeDef;
2.2 常用API
HAL_TIM_Base_MspInit()底层初始化回调函数,在调用HAL_TIM_Base_Init函数时会调用此函数,该函数是弱定义的__HAL_TIM_GET_FLAG()函数获取定时器标志位是否被置位__HAL_TIM_CLEAR_FLAG()函数清除定时器标志位
2.3 定时器初始化流程
- 配置定时器工作模式
- 底层初始化
- 启动定时器外设
相关文章:
HAL+M4学习记录_7
一、TIM 记录学习HAL配置TIM定时器 1.1 简介 TIM(timer)定时器,16位或32位(TIM2和TIM5)计数器、预分频器(16位)、自动重装寄存器的时基单元;可对输入时钟进行计数,在计数…...
mysql 慢查询日志slowlog
慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…...
基于AES的遥感图像加密算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 AES 加密算法概述 4.2 基于 AES 的遥感图像加密算法原理 5.完整程序 1.程序功能描述 通过AES算法对遥感图像进行加密和解密,分析加解密处理后图像的直方图,相关…...
MySQL insert 记录后查询是乱码问题分析
问题现象 后台应用程序使用的是云上的 MySQL 服务,需要给 MySQL 数据表里 insert 一些数据,平时都是先运行一个 MySQL 的 pod: kubectl run mysql-client --rm -it --restartNever --image mysql:5.7 --command -- env LANGC.UTF-8 mysql -…...
字符串算法之AC 自动机(Aho-Corasick Algorithm, 多模式匹配)详细解读
AC自动机(Aho-Corasick Algorithm)是一种高效的多模式字符串匹配算法,用于同时查找多个模式串(子串)在文本串中的出现位置。它结合了字典树(Trie)和有限状态机(Finite State Machine…...
YoloV10改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用
摘要 在计算机视觉领域,目标检测与实例分割任务一直是研究的热点。YoloV10作为目标检测领域的佼佼者,凭借其出色的性能和效率赢得了广泛的认可。然而,随着技术的不断进步,如何进一步提升YoloV10的性能成为了我们追求的目标。近期…...
学习之高阶编程str方法
__str__方法 问题思考:交互环境下print打印的内容和和直接输入变量,返回的内容不一样这是为什么?. 使用print打印的时候触发的是_str_方法, 注意点: 重写str,必须要记得写return. return返回的必须是一个字符串对象。 class MyClass:def _…...
FreeRTOS:事件标志组
目录 一、简介 二、 事件控制块 三、相关API 四、 应用场景 一、简介 在FreeRTOS中,使用信号量可以实现同步,但是使用信号量来同步的话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行同步,此时信号量就无能为力。…...
【高分论文密码】AI赋能大尺度空间模拟与不确定性分析及数字制图
随着AI大语言模型的广泛应用,大尺度空间模拟预测与数字制图技术在不确定性分析中的重要性日益凸显。这些技术已经成为撰写高分SCI论文的关键工具,被誉为“高分论文密码”。大尺度模拟技术能够从不同的时空尺度揭示农业生态环境领域的内在机理和时空变化规…...
智能摆件(墨水屏)
因为需要申请8k的堆,所以需要更改堆的大小 stm32修改堆栈大小(堆栈空间不足导致死机)_minimum heap size-CSDN博客...
ansible————playbook
一、playbook和ad hoc命令 ad hoc命令是单行,一个简单的任务,运行一次。ansible真正强大的地方是使用ansible的playbook重复运行多次复杂的任务。 一个play是是一组有序的任务,该paly对应着在inventory被选择的主机。一个playbook是一个包含…...
linux日志分割工具logorate快速验证配置是否有效
创建一些文件, 并修改文件的mtime(修改时间) # /var/log/test/*.log touch -d "2024-10-14" test1.log touch -d "2024-10-15" test2.log touch -d "2024-10-16" test3.log touch -d "2024-10-17" test4.log#快速创建一个1G的大文…...
Unity3D URP画面品质的上限如何详解
Unity3D是一款广泛应用于游戏开发的引擎,它提供了多种渲染管线用于实现不同的画面品质。其中一种渲染管线是Universal Render Pipeline(简称URP),它是Unity3D的一种轻量级渲染管线,专注于提供高性能和可移植性。 对惹…...
风管阻力计算
风管阻力主要包括摩擦阻力和局部阻力两大类。摩擦阻力:空气在风管内流动时,与管壁的摩擦作用导致的能量损失,与管道长度、断面尺寸、风速、空气密度等参数有关。局部阻力:风管系统中的弯头、三通、变径、阀门等部件,由于改变了气流的流动方向或速度,导致的额外能量损失,用局部阻…...
【redis】redis的多线程和IO多路复用
【redis】redis的多线程和IO多路复用 【一】前言【二】Redis单线程和多线程问题的背景【1】Redis的单线程【2】Redis为什么选择单线程?【3】Redis为什么开始利用多核?【4】Redis当前的性能瓶颈【5】Redis的主线程如何和IO线程协同 【三】IO多路复用的理解…...
webstorm 编辑器配置及配置迁移
1.下载地址 WebStorm:JetBrains 出品的 JavaScript 和 TypeScript IDE 其他版本下载地址 2.安装 点击下一步安装,可根据需要是否删除已有版本 注意: 完成安装后需要激活 3.设置快捷键 以下为个人常用可跳过或根据需要设置 如:…...
Oracle19.25发布,如何打补丁到19.25
一. 19.25发布 2024年10月16日 19c 19.25补丁发布 文档编号19202410.9,文档编码规则: 19(版本号)2024(年份)07(当季的第一个月01/04/07/10).9 一般每个季度的首月中15号左右发布…...
vue3中,拦截双击事件的第一次点击,写一些逻辑
在 Vue 3 中,如果想要拦截双击事件的第一次点击并执行一些逻辑,你可以使用一个状态变量来跟踪第一次点击事件,并在第二次点击时阻止第一次点击逻辑的执行。以下是一个实现示例: <template><divmousedown"handleMou…...
落地 ZeroETL 轻量化架构,ByteHouse 推出“四个一体化”策略
在数字化转型的浪潮中,数据仓库作为企业的核心数据资产,其重要性日益凸显。随着业务范围扩大,企业也会使用不同的数据仓库来管理、维护相关数据。研发人员需要花费大量时间和精力,从中导出数据,然后进行手动整理、转换…...
如何提高LabVIEW编程效率
提高LabVIEW编程效率对开发者来说非常重要,尤其是在处理复杂项目或紧迫的开发周期时。以下是一些可以显著提升LabVIEW编程效率的技巧,从代码结构、工具使用到团队协作的多个角度进行详细分析: 1. 模块化设计 模块化设计 是提高代码可维护性和…...
从‘文件夹’到对象列表:手把手教你用MinIO Java Client实现灵活的文件查询与过滤
从‘文件夹’到对象列表:手把手教你用MinIO Java Client实现灵活的文件查询与过滤在当今数据驱动的时代,对象存储已成为现代应用架构中不可或缺的一部分。MinIO作为高性能、兼容S3协议的开源对象存储解决方案,凭借其轻量级和易用性赢得了众多…...
从Gamma函数到泊松分布:一个概率论中的含参量积分实用案例解析
Gamma函数与泊松分布:概率论中的数学之美 在数据科学和机器学习的实践中,概率分布构成了建模的基石。当我们深入探究这些分布背后的数学原理时,Gamma函数以其优雅的性质和广泛的应用脱颖而出。它不仅连接了离散与连续概率世界,更在…...
WarcraftHelper:魔兽争霸III现代兼容性问题的终极解决方案指南
WarcraftHelper:魔兽争霸III现代兼容性问题的终极解决方案指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为经典即时战…...
保姆级教程:Windows系统下Arcgis 10.2从下载、安装到汉化一次搞定(附常见License启动失败解决方案)
Windows系统下Arcgis 10.2完整安装与汉化实战指南第一次接触Arcgis的新手往往会被复杂的安装流程和神秘的License Manager搞得晕头转向。作为一款功能强大的地理信息系统软件,Arcgis在科研、城市规划、环境监测等领域有着广泛应用,但它的安装过程确实会让…...
LaTeX公式一键转Word:3步告别数学公式编辑烦恼
LaTeX公式一键转Word:3步告别数学公式编辑烦恼 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 还在为Word文档中的数学公式编辑而抓狂…...
在线文档协作工具选型必看:14款产品对比(2026版)
一、在线文档协作工具的概念解析及其核心功能 在线文档协作工具是基于云端的文档创建、编辑、共享与协同沟通平台,核心目标是让团队在同一份资料上“实时共同工作”,减少反复传文件、版本混乱与沟通成本。 企业常见的核心能力包括: 多人实…...
NanaZip:现代Windows文件压缩问题的终极解决方案
NanaZip:现代Windows文件压缩问题的终极解决方案 【免费下载链接】NanaZip The 7-Zip derivative intended for the modern Windows experience 项目地址: https://gitcode.com/gh_mirrors/na/NanaZip 还在为Windows文件压缩工具界面老旧、功能单一而烦恼吗&…...
终极免费音乐解锁工具:5步轻松解密你的加密音乐文件
终极免费音乐解锁工具:5步轻松解密你的加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https:/…...
掌握Umi-OCR:5分钟上手开源免费离线文字识别工具
掌握Umi-OCR:5分钟上手开源免费离线文字识别工具 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。…...
独立开发者利用taotoken模型广场为不同任务选择性价比最优模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者利用taotoken模型广场为不同任务选择性价比最优模型 对于独立开发者而言,在有限的预算内高效完成多样化的开…...
