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. 模块化设计 模块化设计 是提高代码可维护性和…...
如何构建企业级中文大语言模型平台:3大核心策略与实战指南
如何构建企业级中文大语言模型平台:3大核心策略与实战指南 【免费下载链接】Awesome-Chinese-LLM 整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主,包括底座模型,垂直领域微调及应用,数据…...
FUTURE POLICE赋能在线教育:AI助教自动批改口语作业
FUTURE POLICE赋能在线教育:AI助教自动批改口语作业 每次上完英语口语课,最头疼的是什么?对很多学生来说,是等待老师批改作业的漫长过程,还有那千篇一律的“发音不错,继续努力”的反馈。对老师而言&#x…...
实时与非实时操作系统核心技术对比与应用解析
实时与非实时操作系统技术解析1. 操作系统分类概述现代计算机系统根据任务调度机制的不同,主要分为实时操作系统(RTOS)和分时操作系统两大类。这两类系统在任务调度、资源分配和响应机制等方面存在本质区别,适用于不同的应用场景。1.1 实时操作系统定义实…...
文墨共鸣模型作为Claude Code的替代或补充:代码生成与解释能力对比
文墨共鸣模型作为Claude Code的替代或补充:代码生成与解释能力对比 最近和几个做开发的朋友聊天,大家不约而同地提到了一个话题:现在AI写代码的工具这么多,到底哪个更靠谱?有人习惯用GitHub Copilot,有人偏…...
如何3分钟免费为Figma安装中文界面插件:设计师效率提升完整指南
如何3分钟免费为Figma安装中文界面插件:设计师效率提升完整指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 作为一名中文设计师,你是否曾在使用Figma时因为英…...
Qwerty Learner终极指南:免费提升英语打字速度的完整教程
Qwerty Learner终极指南:免费提升英语打字速度的完整教程 【免费下载链接】qwerty-learner 项目地址: https://gitcode.com/GitHub_Trending/qw/qwerty-learner Qwerty Learner是一款专为键盘工作者设计的开源工具,通过单词记忆与英语肌肉记忆训…...
RMBG-2.0在远程办公中的应用:Zoom虚拟背景实时抠像插件开发指南
RMBG-2.0在远程办公中的应用:Zoom虚拟背景实时抠像插件开发指南 远程办公已经成为许多人的日常,视频会议更是其中的核心环节。你是否厌倦了千篇一律的虚拟背景图片?或者因为摄像头背景杂乱而不敢开启视频?今天,我们将…...
手把手教你用STM32H7S7实现高速USB复合设备(CDC+MSC):从CubeMX配置到性能优化
STM32H7高速USB复合设备开发实战:CDCMSC架构设计与性能调优 在嵌入式系统开发中,USB复合设备技术正成为连接智能硬件与主机系统的关键桥梁。STM32H7系列凭借其Cortex-M7内核和480Mbps的高速USB外设,为开发者提供了实现高性能复合设备的理想平…...
开源网页监控工具changedetection.io:实时追踪网页变化的全方位解决方案
开源网页监控工具changedetection.io:实时追踪网页变化的全方位解决方案 【免费下载链接】changedetection.io The best and simplest free open source website change detection, website watcher, restock monitor and notification service. Restock Monitor, c…...
本科生 AI 写论文天花板!Paperxie 智能写作:从选题到成稿全流程,零焦虑搞定毕业论文
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 一、写在前面:毕业论文,为什么成了本科生的 “年度噩梦”? 每年毕业季&#x…...
