问题来源:

最近使用BLDC硬件COM时间做硬件换向,手册中提到“预加载”机制,然后网上了解一下 ,然后发现一文章,观点总结如下:



本身我是接受这个观点的,但是我点开了评论区,就疑惑了



然后我决定试试:在实验之前,先搞清楚几个概念:定时器周期ARR值,更新事件发生时间点、修改周期值的时间点(这俩货很重要)、先产生更新事件,后进入更新中断。



实验前准备:

  • 芯片STM32G431C8T6,使用TIM1,通道1。定时器主频170MHz,初始化预分频值设置为17000,周期值设置为50000,通道1比较值设置为10000,配置为PWM1模式。修改arr值统一修改为20000。
  • 解释:定时器周期初始化为5s,修改时修改为2s。用PWM来观察定时器周期变化,便于用示波器测量周期和观察结果。

实验过程——1

板子上电,TIM1初始化,开启定时器。更新中断里修改AAR值为20000,观察示波器上PWM波的情况并测量周期值。

1. 不使能预加载,结果如下:



结果显示更新中断回调里设置ARR = 20000之后,中断回调程序结束,TIM1周期变为2s,也就是开头贴的博主所说的这一句:

2. 使能预加载,结果如下:



结果显示,在更新中断回调里更改ARR=20000,中断回调结束后依然是跑一个5s的周期之后,再变成2s,这里的结果也就对应这一句话:

总结:

为了防止语言歧义,我定义中断回调程序结束后的TIM跑的周期称为下一个周期。目前来看,原博主的总结是对的。

但是但是!!!!!!!!其实问题的关键根本不是在不在更新中断里修改ARR值**

  • 1.对于重装载寄存器的预加载来说,关键在于改变ARR的时间点和当前定时器的时间点(定时器的计数值)
  • 2.对于比较寄存器的预加载来说,关键在于改变比较值的时间点和当前定时器的时间点(定时器的计数值)

实验过程——2

接着验证,现在我把修改ARR的地方由更新中断里变成主循环之前,定时器初始化条件不变。

1.预加载使能,同时修改值 > 定时器当前计数值

使能预加载的情况下,开启通道后紧接着修改ARR值为20000,这时TIM1的计数值还没有跑到20000(定时器计数很慢)



结果为:



结果显示,开启预加载情况下,修改ARR的值,跑完初始化设定的5s,在下一个周期变为2s。

2.预加载使能,同时修改值 < 定时器当前计数值



在保证定时器计数已经超过25000的情况下,紧接着设置周期值为20000(程序我验证过,不存在已经跑过一个tim周期的情况存在),结果如下:



结果依然是在当前周期不生效,在下一个周期生效。所以在使能了预加载的情况在,生效时间永远是在发生更新事件后的下一个周期(手册也描述了,更新事件后才载入工作寄存器),而不论你更改ARR的时间点在哪里。

3.预加载失能,同时修改值 > 定时器当前计数值



结果如下:



结果显示,修改值立刻生效,这里先不下结论,先看最后一个实验

4. 预加载失能,同时修改值 < 定时器当前计数值



结果如下:



结果显示,第一个周期跑到了TIM1计数器的最大值(65535,示波器没那么精确),既不是50000,也不是20000。



终极结论:

1. 首先不要纠结于下个周期生效还是下下个周期生效这种模糊的说法,直接忘掉OK?
2. 使能重装载寄存器预加载的情况下,不论修改ARR值的时间点在哪,结果都是在修改之后,更新事件发生后的下一周期生效。
3. 在不使能预加载的情况下,其实生效机制就是立刻生效,但是要注意:
1)修改值小于当前定时器的计数值(就是定时器已经跑过了这个修改点),修改后,本次周期会跑到该定时器的最大周期值(16位就是0xFFFF,32位就是0xFFFFFFFF)
2)修改值大于当前定时器的计数值(就是定时器还未跑过修改点),修改后,立刻生效,本次定时器周期就会变成修改值。
4.由于我比较关注的是比较通道的预加载,所以同样也做了实验,这里就不贴出来了,结果是一样的,依然是这个逻辑。


最后再叨叨两句:

回头看博主的话:

虽然我理解他的意思但是这种表述真的是很模糊的,在定时器更新中断回调里修改ARR,和在其他地方修改ARR两种情况所说的下一个定时器周期是一个概念吗?什么是下一个?什么是下下个?所以希望大家避免这种表述方式;

把握住核心逻辑:

1. 使能预加载,修改ARR,更新事件发生,新ARR值生效

2. 不使能预加载,修改ARR值,立刻生效

3. 特殊情况记心里(不使能预加载时,有个特殊情况你懂的)

关于STM32 定时器预加载机制的个人实验总结的更多相关文章

  1. 57.fielddata预加载机制以及序号标记预加载

    如果真的要对分词的field执行聚合,那么每次都在query-time的同时由es生成fielddata并加载到内存中来,速度可能会比较慢,性能很差,改善性能的方式就是预先生成fielddata值并加 ...

  2. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  3. 关于禁止ViewPager预加载问题【转】

    转自:http://blog.csdn.net/qq_21898059/article/details/51453938#comments 我最近上班又遇到一个小难题了,就是如题所述:ViewPage ...

  4. 预加载与智能预加载(iOS)

    来源:Draveness(@Draveness) 链接:http://www.jianshu.com/p/1519a5302141 前两次的分享分别介绍了 ASDK 对于渲染的优化以及 ASDK 中使 ...

  5. web资源预加载-生产环境实践

    此文记录资源预加载在我们项目的实践,技术难度不算高,重在介绍一套技术方案的诞生与实施,其中都进行了哪些思考,依据什么来做决策,如何进行效果评估,等等.为读者在制定技术方案时提供一定启示. 背景 资源预 ...

  6. 通过link的preload进行内容预加载

    Preload 作为一个新的web标准,旨在提高性能和为web开发人员提供更细粒度的加载控制.Preload使开发者能够自定义资源的加载逻辑,且无需忍受基于脚本的资源加载器带来的性能损失. <l ...

  7. Javascript图片预加载详解

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  8. javascript图片懒加载与预加载的分析

    javascript图片懒加载与预加载的分析 懒加载与预加载的基本概念.  懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片, ...

  9. java加载机制整理

    本文是根据李刚的<疯狂讲义>作的笔记,程序有的地方做了修改,特别是路径,一直在混淆,浪费了好多时间!!希望懂的同学能够指导本人,感激尽............ 1.jvm 和 类的关系 当 ...

  10. MailOtto 实现完美预加载以及源码解读

    背景: 最近项目组需要一个小课题分享,小白刚好从微博里看到一个这样有趣的开源工具MailOtto,是阿里巴巴员工 Drakeet 维护的一个专注懒事件的事件总线,gitHub地址为:https://g ...

随机推荐

  1. Greenplum数据库时间操作汇总

    Greenplum数据库时间操作与mysql有一些区别,汇总以往笔记记录下来. greenplum时间格式:'yyyy-mm-dd hh24:mi:ss.us'.'yyyy-mm-dd hh:mi:s ...

  2. HTB-UnderPass

    该靶机nmap扫描udp发现161端口snmp服务,利用snmpwalk扫描得到目录信息,使用dirsearch扫描得到一个yml文件,存放数据库账号密码,记录下来,此时需要登录口,使用字典扫描拼接/ ...

  3. Redis的淘汰机制

    第一种情况:设置了过期时间的数据 a:挑选使用最少的数据淘汰 b:随机淘汰 c:选择时间快过期数据淘汰 第二种:没有设置过期时间的数据 a:挑选使用最少的数据淘汰 b:随机淘汰 第三种: a:禁止驱逐 ...

  4. 🎀Mybatis-Plus中的MetaObjectHandler

    简介 MetaObjectHandler 是一个非常有用的组件,用于处理实体对象中的字段填充逻辑,比如自动填充创建时间.更新时间.创建人.修改人等字段. 组件介绍 MetaObjectHandler ...

  5. Eclipse 中 JAVA AWT相关包不提示问题(解决)

    原因: 由于在2021年7月15日 OpenJDK管理委员会全票通过批准成立由Phil Race担任初始负责人的 Client Libraries Group(客户端类库工作组). 新的工作组将继续赞 ...

  6. QT C++ 实现数据类与 json 的转换

    QT 提供了 QJsonDocument.QJsonObject.QJsonArray.QJsonValue 等类用于 JSON 的解析和转换.QJsonValue 支持的数据类型包括:bool.do ...

  7. IEC101、IEC103、IEC104、Modbus报文解析工具

    一.概述 国际电工委员会第57技术委员会(IEC TC57)1995年出版IEC 60870-5-101后,得到了广泛的应用.为适应网络传输,2000年IEC TC57又出版了IEC 60870-5- ...

  8. springboot分页查询并行优化实践

    --基于异步优化与 MyBatis-Plus 分页插件思想的实践 适用场景 数据量较大的单表分页查询 较复杂的多表关联查询,包含group by等无法进行count优化较耗时的分页查询 技术栈 核心框 ...

  9. 俩天完美复刻DeepWiki,并且免费开源!

    俩天完美复刻DeepWiki,并且免费开源! 大家好!今天非常高兴为大家介绍KoalaWiki项目 - 这是我们团队花费两天时间完美复刻一个免费开源的AI驱动代码知识库系统,可以说是DeepWiki的 ...

  10. Python 3.14 新特性盘点,更新了些什么?

    Python 3.14.0 稳定版将于 2025 年 10 月正式发布,目前已进入 beta 测试阶段.这意味着在往后的几个月里,3.14 的新功能已冻结,不再合入新功能(除了修复问题和完善文档). ...