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. 模块化设计 模块化设计 是提高代码可维护性和…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...