高精度定时器中 single-shot 计数模式不工作

1. 问题提出

客户使用 STM32G474 的高精度定时器,基于 CubeMX 进行外设配置与代码生成,将某个子定时器的计数方式设置为 retriggerable single shot 方式,发现该子定时器无 PWM 输出,在调试模式下发现该子定时器的计数器一直为 0,即计数器一直没有启动,但如果将计数方式修改为continuous 模式,其他保持不变,定时器工作正常。

2. 问题分析

检查客户提供的 CubeMx 配置文件,客户使能了 Master Timer 与 Timer B,Master Timer 的比较器事件 2 触发 Timer B 复位与运行,并配置了 Timer B 的 PWM 输出,使用该工程文件直接生成代码,并添加高精度定时器计数使能与输出使能函数,如下:
在这里插入图片描述
进入调试模式观察,发现 Master Timer 正常计数,但是 Timer B 的计数器一直保持 0,按照客户的描述,将 Timer B 的计数方式修改为“continous”后,Timer B 恢复正常计数。对比 TimerB 在“retriggerable single shot”与“continous”两种工作模式下的相关寄存器的值进行对比,发现除了计数模式不同之外,其他所有的状态都相同。

莫非真是“retriggerable single shot”存在问题?这明显不可能,此前多次使用过该模式并没有发现问题,于是将以前设计的能成功工作的例程拿来与该“问题”工程进行对比。经过比对分析发现,工程配置中使用的寄存器更新方式存在不同,如下图所示:

图1.正常工作工程中的寄存器更新配置
图1.正常工作工程中的寄存器更新配置
图2.“问题”工作工程中的寄存器更新配置
图2.“问题”工作工程中的寄存器更新配置
“问题”工程配置中使用 Master timer 的更新事件作为触发寄存器更新触发源,并且更新要等到本定时器的下一次的 Reset/Roll-over 事件出现时才生效。通过将“Update taken into accounton the following Reset/Roll-over event”修改为“Update taken into account immediately”,定时器也可以正常运行了,问题的原因就是由于该配置引起的。

查看该配置对应的寄存器说明:
在这里插入图片描述
当配置“Update taken into account on the following Reset/Roll-over event”对应于该位置“1”,即更新事件,无论是来自相邻定时器的还是软件产生的,都需要等到下一个 Reset/Rollover event 才生效。

在直接使用 CubeMx 产生的 HAL 底层配置代码且配置中使能了预加载的情况下,该寄存器更新配置方式会导致 Timer B 的初始化配置无法生效。

如图 3/4/5 所显示的,因为在 CubeMx 直接生成的代码中,Timer B 参数的配置通过调用函数HAL_HRTIM_WaveformTimerConfig()写入寄存器,然后在该函数中调用软件更新函数HRTIM_ForceRegistersUpdate()的方式让配置生效,那么在目前的配置下,软件触发更新也必须等待 Reset/Roll-over event 的出现。而在 retriggerable single shot 计数模式下,定时器不能自动启动计数,必须等待来自 Master Timer 的 Reset 事件(即前文提到的比较器事件 2)。

图3.“问题”工程中的寄存器更新与定时器 Reset 配置
图3.“问题”工程中的寄存器更新与定时器 Reset 配置
图4.“问题”工程产生的 Timer B 初始化代码
图4.“问题”工程产生的 Timer B 初始化代码
图5.Timer B 初始化代码中调用软件触发更新
图5.Timer B 初始化代码中调用软件触发更新

综上,虽然正确的配置了 Reset 事件,Master Timer 也正常计数且产生了比较事件 2,但问题在于在运行了初始化代码后,该配置仅仅是写到了 preload 寄存器中,而没有写入 active 寄存器中,即 Timer B 的复位源没有生效,带来的后果就是 Timer B 的计数器不运行,一直保持 0,且所有带有预加载特性的寄存器的值也没有生效。

作为对比,当配置为“Update taken into account immediately”时,调用软件触发更新函数HRTIM_ForceRegistersUpdate()函数,将使所有配置立即生效,定时器可正常工作。

3. 解决方法

基于以上分析,造成该问题的主要原因是 CubeMx 基于 HAL 库自动生成的初始化代码中没有考虑不同的寄存器更新配置方式,只是单一的采用软件更新的方式来触发寄存器更新。要解决以上问题,需要修改代码中的定时器初始化的时序,在配置寄存器更新方式为“Update taken intoaccount on the following Reset/Roll-over event”前,让其他的配置先生效,基本逻辑如下,逻辑在客户自己编写初始化代码时也需要遵循。

在这里插入图片描述

4. 小结

解决客户提出的高精度定时器中的子定时器在 retriggerable single shot 计数模式下无法工作的问,原因在于该计数模式下,当更新配置方式为“ Update taken into account on the following eset/Roll-over event ”时,使用 CubeMx 生成的原始初始化代码出现了定时器配置无法生效,从导致问题的出现。通过对初始化代码的逻辑进行简单修改,问题得以解决。当然,TM32CubeMx 的未来版本应会就这个地方做针对性地完善。


本文档参考ST官方的《【应用笔记】LAT1187+在Keil中使用STM32CubeProgrammer》文档。
参考下载地址:https://download.csdn.net/download/u014319604/88971341

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024MathorCup(妈妈杯) C题完整思路+数据集+完整代码+高质量成品论文

C题物流网络分中心货量预测及人员排班 (完整的资料数据集代码在文末) 电商物流网络在订单履约中由多个环节组成,其中,分拣中心作为网络的中 间环节,需要将包裹按照不同流向进行分拣并发往下一个场地,最终使…

「每日跟读」英语常用句型公式 第10篇

「每日跟读」英语常用句型公式 第10篇 1. It goes without saying that __ 毋庸置疑的是 ______ It goes without saying that hard work pays off(毋庸置疑的是,努力工作会有回报) It goes without saying that health is the most important wealth(毋庸置疑的…

C++第十五弹---string基本介绍(一)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、什么是STL 2、STL的版本 3、STL的六大组件 4、STL的重要性 5、如何学习STL 6、STL的缺陷 7、为什么学习string类 7.1、C语言中的字符串…

节省30%成本,宝马使用 NVIDIA Omniverse 构造的数字孪生虚拟汽车工厂,实现降本增效

在数字化转型过程中,汽车制造商宝马集团将工业 AI 的力量运用到整个生产网络,与NVIDIA Omniverse平台共同构建并运行工业元宇宙应用。 宝马集团董事Milan Nedeljković在GTC主题演讲会中,与NVIDIA创始人兼首席执行官黄仁勋共同展示了Omniver…

YOLOv8打印模型结构配置信息并查看网络模型详细参数:参数量、计算量(GFLOPS)

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

LeetCode-1143. 最长公共子序列【字符串 动态规划】

LeetCode-1143. 最长公共子序列【字符串 动态规划】 题目描述:解题思路一:动规五部曲解题思路二:1维DP解题思路三:0 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。…

TSINGSEE青犀AI智能分析网关V4吸烟/抽烟检测算法介绍及应用

抽烟检测AI算法是一种基于计算机视觉和深度学习技术的先进工具,旨在准确识别并监测个体是否抽烟。该算法通过训练大量图像数据,使模型能够识别出抽烟行为的关键特征,如烟雾、手部动作和口部形态等。 在原理上,抽烟检测AI算法主要…

【目标检测数据集】城市街道垃圾堆相关数据集

一、GarbageOverflow:城市街道垃圾堆数据集 该垃圾堆数据集是通过爬虫从网上进行爬取得到的,一共包含1188张图片,有2个类别,分别为[overflow, No Overflow],两个标签的数量分别为1734个标签和414个标签。部分数据集及…

中国历年GDP统计-探数API统计

数据介绍 时间维度:1978年-2021年 单位:亿元 该数据来源于国家统计局发布的中国统计年鉴2021,为按当年价格计算的中国历年GDP以及人均GDP。 数据说明: 数据来源于国家统计局。

【更新】全国省级-新质生产力数据集(2010-2022年)

01、数据简介 新质生产力,又称为新型生产力,是指在现代科技和经济社会发展的推动下,由新的生产要素、生产方式、生产关系等构成的具有新质特点的生产力。这种生产力突破了传统生产力的局限,具有更高的效率和创造力,是…

题目 2694: 蓝桥杯2022年第十三届决赛真题-最大数字【暴力解法】

最大数字 原题链接 🥰提交结果 思路 对于每一位,我我们都要尽力到达 9 所以我们去遍历每一位, 如果是 9 直接跳过这一位 如果可以上调到 9 我们将这一位上调到 9 ,并且在a 中减去对应的次数 同样的,如果可以下调到 9,我…

黄金基金和黄金有什么区别?

黄金基金本质上是一种投资工具,它通过间接投资黄金或与其紧密相关的金融衍生品来反映黄金市场的表现。不同于直接持有实物黄金,投资者购买黄金基金并不涉及实体黄金的保管问题,而是将资金交由专业的基金管理人管理,由他们代表投资…

Input DropDown 拼接成 select组件(基于antd和react)

前言:为什么不直接用select,还要舍近求远搞inputdropdown这种缝合怪,是因为antd的select不支持选中项再编辑,效果如图 比如:选中的lucy文案变成了placeholder不能再编辑了 封装此组件虽然比较简单,但还是有…

一文读懂Partisia Blockchain,被严重低估的隐私区块链生态

在今年 3 月,隐私公链 Partisia Blockchain 迎来了重要的进展,该生态通证 $MPC 上线了交易所,目前 $MPC 通证可以在 Kucoin、Gate、BitMart、Bitfinex、Bitture 等平台交易,并将在不久后上线 MEXC 平台。 在上个月上线市场至今&am…

中颖51芯片学习4. 可编程计数器阵列PCA0

中颖51芯片学习4. 可编程计数器阵列PCA0 一、PCA介绍1. PCA简介2. SH79F9476的PCA0特性3. PCA0 功能4. 时钟5. PCA0原理框图6. 工作方式 二、PCA0寄存器1. PCA0标志寄存器2. PCA使能寄存器3. PCA0方式寄存器4. P0CPMn PCA捕捉/比较寄存器5. P0FORCE强制输出控制寄存器6. PCA0计…

期货量化交易软件:MQL5 中的范畴论 (第 15 部分)函子与图论

概述 在上一篇文章中,我们目睹了前期文章中涵盖的概念(如线性序)如何视作范畴,以及为什么它们的“态射”在与其它范畴相关时即构成函子。在本文中,我们赫兹量化软件将阐述来自前期文章中的概括,即通过查看…

三方库移植之NAPI开发[2]C/C++与JS的数据类型转

通过NAPI框架进行C/C与JS数据类型的转换 OpenHarmony NAPI将ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八种数据类型,以及函数对应的Function类型,统一封装成napi_value类型,下文中表述为JS类…

基于LNMP部署wordpress

目录 一.环境准备 二.配置源并安装 三.配置Nginx 四.配置数据库 五.上传源码并替换 六.打开浏览器,输入虚拟机ip访问安装部署 七.扩展增加主题 一.环境准备 centos7虚拟机 关闭防火墙和seliunx stop firewalld #关闭防火墙 setenforce 0 …

隐身打击云函数CDN对抗 | 应急响应

0x00 简介 在攻防演练中,使用云函数来隐藏 C&C 的 ip 地址已经成为了一种“标配” 在应急处置过程中,我们经常遇到 netstat -pantu | grep ip 无法找到安全设备关于红队外联的告警的情况 由于 C&C 的 ip 地址是一直变化的,所以常…

基于深度学习的智能停车场车牌识别计费系统(完整程序+训练数据集+开题报告+论文))

摘要 本篇论文研究的是基于车牌识别技术的智能停车场管理系统,采用基于深度学习的车牌识别算法,通过卷积神经网络对车牌图像进行处理和分析,实现车牌字符的识别和车牌信息的提取。同时,本文还设计了一个智能停车场管理系统…