0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_pJlTbmA9 来源:STM32单片机 作者:STM32单片机 2023-10-25 18:08 次阅读

1. 问题提出

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

2.问题描述

检查客户提供的CubeMX配置文件,客户使能了Master Timer与Timer B,Master Timer的比较器事件2触发Timer B复位与运行,并配置了Timer B的PWM输出,使用该工程文件直接生成代码,并添加高精度定时器计数使能与输出使能函数,如下:

wKgaomUDwPSAfXevAADy3h14Gdc305.png

进入调试模式观察,发现Master Timer正常计数,但是Timer B的计数器一直保持0,按照客户的描述,将Timer B的计数方式修改为“continous”后,Timer B恢复正常计数。对比Timer B在“retriggerable single shot”与“continous”两种工作模式下的相关寄存器的值进行对比,发现除了计数模式不同之外,其他所有状态都相同。

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

wKgZomUDwPaAdfLBAADXsqRtjfc572.png

图1.正常工作工程中的寄存器更新配置

wKgaomUDwPeAPmoYAAEPAjO75zA705.png

图2.“问题”工作工程中的寄存器更新配置

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

查看该配置对应的寄存器说明:

wKgZomUDwPmAVgSrAAKSD43MP4s859.png

当配置“Update taken into account on the following Reset/Roll-over event”对应于该位置“1”,即更新事件,无论是来自相邻定时器的还是软件产生的,都需要等到下一个Reset/Roll-over 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)

wKgZomUDwPqAeTOpAAFwt9YUXU4915.png

图3.“问题”工程中的寄存器更新与定时器Reset配置

wKgZomUDwPyASqjhAAQ6sxu-ZHQ446.png

图4.“问题”工程产生的Timer B初始化代码

wKgaomUDwP6ADetCAAY5AH_EYZM306.png

图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 into account on the following Reset/Roll-over event”前,让其他的配置先生效,基本逻辑如下,该逻辑在客户自己编写初始化代码时也需要遵循。

wKgZomUDwP-AG__qAAFYaQiauQE750.png

4.小结

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

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112036
  • CubeMx
    +关注

    关注

    0

    文章

    28

    浏览量

    1211
收藏 人收藏

    评论

    相关推荐

    单片机定时器/计数器的结构

     每来一个脉冲计数器加1,当加到计数器为全1(即FFFFH)时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(
    发表于 06-17 09:57 7073次阅读
    单片机<b class='flag-5'>定时器</b>/<b class='flag-5'>计数</b>器的结构

    MSP430的定时器A的增计数模式没有写到新周期=旧周期,计数器会是怎样?

    MSP430的定时器的增计数模式中文数据手册写有:增计数模式,通过改变TACCR0的值来重置计数
    发表于 02-12 00:38

    请问cc2530的定时器输出PWM只能用自由模式计数吗?

    本人打算用PWM输出一个38KHz的PWM,因此定时器计数模式只能用模模式,但是配置完发现定时器确实有工作,通道的比较值也有设置,但是就是
    发表于 05-13 06:35

    STM32定时器的分频模块、计数模块、自动重装载模块‍

    生溢出;向下计数时从多少开始往下计数。平常我们泛泛地说ARR寄存计数器提供计数边界或重装值,但它的具体含义及使用需要结合
    发表于 05-27 08:00

    GPT高精度延时定时器简介

    Linux NXP (I.MX6ULL) GPT高精度延时定时器0、GPT 定时器简介1、GPT 定时器特性如下:2、GPT 定时器的可选时
    发表于 01-12 06:46

    求助,定时器控制连续计数模式如何运作?

    连续计数模式计数器会不断由0累加至224-1再回到0重新开始计数,当每次24位向上计数器数值与定时器比较缓存
    发表于 06-27 07:25

    高精度定时器电路及制作

    高精度定时器电路及制作
    发表于 04-14 11:39 14次下载
    <b class='flag-5'>高精度</b><b class='flag-5'>定时器</b>电路及制作

    长时间高精度定时器

    长时间高精度定时器:某些场合需要长时间高精度定时器,此图定时电路定时时间较长,
    发表于 12-14 08:05 1000次阅读
    长时间<b class='flag-5'>高精度</b><b class='flag-5'>定时器</b>

    定时器/计数器的结构和工作原理

    定时器/计数器的结构和工作原理 定时器/计数器的结构  定时器/
    发表于 03-29 09:08 1.9w次阅读
    <b class='flag-5'>定时器</b>/<b class='flag-5'>计数</b>器的结构和<b class='flag-5'>工作</b>原理

    51单片机——定时器计数

    /T(定时/计数选择位):C/T=0——定时模式C/T=1——计数模式3.M0M1(工作方式选择
    发表于 11-22 16:36 8次下载
    51单片机——<b class='flag-5'>定时器</b>和<b class='flag-5'>计数</b>器

    STM32定时器三种中心对齐计数模式简介

    STM32的通用定时器和高级定时器除了支持单向的向上或向下计数模式外,还支持中心对齐计数模式,即一个计数周期内分别由向上
    发表于 12-08 20:51 31次下载
    STM32<b class='flag-5'>定时器</b>三种中心对齐<b class='flag-5'>计数模式</b>简介

    工程师笔记|高精度定时器的同步功能

    了多个定时器,多个定时器之间可以单独工作,也可以进行同步,且高精度定时器还能与片上的其他定时器
    的头像 发表于 11-22 18:15 970次阅读

    应用笔记 | 高精度定时器single-shot计数模式工作

    关键字:高精度定时器Single-shot 计数模式 目录预览 1 问题提出  2 问题分析 3 解决办法 4 小结 1. 问题提出 客户使用STM32G474的
    的头像 发表于 08-09 17:45 422次阅读
    应用笔记 | <b class='flag-5'>高精度</b><b class='flag-5'>定时器</b>中<b class='flag-5'>single-shot</b><b class='flag-5'>计数模式</b>不<b class='flag-5'>工作</b>

    高精度定时器Push_Pull模式输出逻辑

    电子发烧友网站提供《高精度定时器Push_Pull模式输出逻辑.pdf》资料免费下载
    发表于 09-19 15:00 0次下载
    <b class='flag-5'>高精度</b><b class='flag-5'>定时器</b>Push_Pull<b class='flag-5'>模式</b>输出逻辑

    简述STM32定时器计数模式

    STM32的向上计数模式是指定时器计数器从0开始计数,直到达到自动加载值(TIMx_ARR),然后重新从0开始计数,并产生一个
    的头像 发表于 12-13 10:09 1686次阅读