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. 模块化设计 模块化设计 是提高代码可维护性和…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
