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

Android 开发 TabLayout 自定义指示器长度
前言 原生 TabLayout 的指示器长度是充满整个屏幕的,但在实际开发中 UI 会设计成 指示器的长度等于或者小于标题字体长度,如图 如果设置成跟字体长度一样即使用 API: mTabLayout.setTabIndicatorFullWidth(false);或者在 xml 布局文件中的TabLayout标签…...

构造mex(牛客周赛 Round 59)
题目链接; D-构造mex_牛客周赛 Round 59 (nowcoder.com) 题目描述: 输出和输出描述: 输入样例: 3 6 3 3 7 4 3 6 6 0 输出样例: NO YES 4 0 1 2 YES 1 1 1 1 1 1 分析: 数学思维题,赛后看了一…...

RabbitMQ 交换机的类型
在 RabbitMQ 中,交换机(Exchange)是一个核心组件,负责接收来自生产者的消息,并根据特定的路由规则将消息分发到相应的队列。交换机的存在改变了消息发送的模式,使得消息的路由更加灵活和高效。 交换机的类…...

机器人顶会参会经验——许华哲老师PRE-IROS 2024分享
摘要:清华大学交叉信息学院许华哲老师在PRE-IROS 2024上分享了机器人顶会参会技巧,包括社交和活动选择方面的实用建议等内容。本文整理了许老师在直播中分享的干货。 在刚刚过去的PRE-IROS 2024论文预分享会上,清华叉院许华哲老师全方位解析…...

计算机组成原理--一章二章
这里写目录标题 第一章:计算机系统概述计算机的发展计算机的组成计算机的性能指标 第二章:数据的表示和运算2.1进位十进制BCD码无符号整数的表示和运算带符号整数的表示和运算原反补码的特性对比移码定点小数 2.2奇偶校验码算数逻辑运算单元(…...

zookeeper kafka集群配置
一.下载安装包 地址:https://download.csdn.net/download/cyw8998/16579797 二.配置文件 zookeeper.properties dataDir/data/kafka/zookeeper_data/zookeeper # the port at which the clients will connect clientPort2181 # disable the per-ip limit on the…...

Java IO 基础知识
IO 流简介 IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在…...

【报错处理】MR/Spark 使用 BulkLoad 方式传输到 HBase 发生报错: NullPointerException
博主希望能够得到大家的点赞收藏支持!非常感谢 点赞,收藏是情分,不点是本分。祝你身体健康,事事顺心! Spark 通过 BulkLoad 方式传输到 HBase,我发现会出现空指针异常。简单写下如何解决的。 原理…...

域7:安全运营 第17章 事件的预防和响应
第七域包括 16、17、18、19 章。 事件的预防和响应是安全运营管理的核心环节,对于组织有效识别、评估、控制和减轻网络安全威胁至关重要。这一过程是循环往复的,要求组织不断总结经验,优化策略,提升整体防护能力。通过持续的监测、…...

Linux常见基本指令 +外壳shell + 权限的理解
下面这篇文章主要介绍了一些Linux的基本指令及其周边知识, 以及shell的简单理解和权限的理解. 目录 前言1.基本指令及其周边知识1.1 ADD类touch [file]文件的时间mkdir [directory]cp [file/directory]echo [file]输出重定向Linux中, 一切皆文件 1.2 DELETE类rmdirrm通配符关机…...