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

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

3天内不再提示

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

STM32单片机 来源:未知 2023-08-09 17:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

关键字:高精度定时器,Single-shot 计数模式

目录预览

1 问题提出2 问题分析3 解决办法4 小结

1. 问题提出

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

2.问题描述

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

1229c950-3698-11ee-9e74-dac502259ad0.png

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

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

12695f84-3698-11ee-9e74-dac502259ad0.png

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

1288dc42-3698-11ee-9e74-dac502259ad0.png

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

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

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

12a29146-3698-11ee-9e74-dac502259ad0.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)

12e47e9e-3698-11ee-9e74-dac502259ad0.png

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

13021486-3698-11ee-9e74-dac502259ad0.png

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

13267a6a-3698-11ee-9e74-dac502259ad0.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”前,让其他的配置先生效,基本逻辑如下,该逻辑在客户自己编写初始化代码时也需要遵循。

13632a64-3698-11ee-9e74-dac502259ad0.png

4.小结

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

完整内容请点击“阅读原文”下载原文档。

长按扫码关注公众号

更多资讯,尽在STM32

点击“阅读原文”,可下载原文档


原文标题:应用笔记 | 高精度定时器中single-shot计数模式不工作

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

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

    关注

    6074

    文章

    45341

    浏览量

    663643
  • STM32
    +关注

    关注

    2305

    文章

    11121

    浏览量

    371183

原文标题:应用笔记 | 高精度定时器中single-shot计数模式不工作

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32A030微控制定时器

    16bit 自动重装载计数 并由一个可编程预分频驱动。GTIM 支持定时器模式计数器
    发表于 12-04 06:47

    CW32L010+定时器介绍

    :用于对时钟信号进行分频,以降低计数器计数频率。通过预分频,可以实现更长的定时周期和更细粒度的定时控制。 控制寄存
    发表于 12-01 07:53

    CW32L0开发板学习记录四,高级定时器ATIM学习

    (ATIM): 高级定时器 (ATIM) 包含一个 16bit 自动重载计数器,并由一个可编程的预分频驱动。ATIM 支持定时计数、复位
    发表于 12-01 07:35

    CW32定时器及中断介绍

    = BTIM_Mode_TIMER;/* 工作模式,00:定时器模式01:计数器模式10:触发
    发表于 12-01 07:08

    单片机定时器中断

    分频后送来;另一个是T0或T1引脚输入的外部脉冲源。如果定时器/计数器工作定时模式,则表示时间已到;如果
    发表于 11-24 06:22

    PWM、定时器、SysTick 区别及应用场景

    在单片机和嵌入式开发,经常会遇到PWM(脉宽调制)、定时器、SysTick(系统滴答定时器)这几个词。很多初学者容易把它们混为一谈,以为都是“定时相关的东西”。其实,它们在本质和应用
    的头像 发表于 11-17 10:53 233次阅读
    PWM、<b class='flag-5'>定时器</b>、SysTick 区别及应用场景

    SysTick系统滴答定时器简介

    SysTick—系统定时器是属于CM33内核的一个外设,内嵌在NVIC。系统定时器是一个24bit的向下递减的计数器
    的头像 发表于 09-23 09:50 1335次阅读
    SysTick系统滴答<b class='flag-5'>定时器</b>简介

    WIZnet W55MH32以太网单片机开发教程 第十一章 通用定时器(上篇)

    本章介绍了W55MH32的通用定时器TIM2~TIM5,其由 16 位计数器等构成,具输入捕获等功能,有多种计数模式及时钟选择。对例程进行了讲解并下载验证,TIM9~14功能类似,详见《W55MH32参考手册》。
    的头像 发表于 05-28 10:12 855次阅读
    WIZnet W55MH32以太网单片机开发教程 第十一章 通用<b class='flag-5'>定时器</b>(上篇)

    MCU定时器/计数器

    RISC-V核低功耗MCU通过灵活的定时器架构、低功耗模式适配及硬件级中断优化,在工业控制、智能家居等场景实现高精度计时与能耗控制的协同设计,满足复杂任务调度与实时响应的双重需求‌。
    的头像 发表于 04-27 13:54 592次阅读

    TPS3851 带集成看门狗定时器高精度电压监控数据手册

    TPS3851 将精密电压监控与可编程看门狗定时器相结合。TPS3851比较的欠压 (V ) 精度为 0.8% (–40°C 至 +125°C) ~ITN~ ) 阈值。该TPS38
    的头像 发表于 04-10 16:04 808次阅读
    TPS3851 带集成看门狗<b class='flag-5'>定时器</b>的<b class='flag-5'>高精度</b>电压监控<b class='flag-5'>器</b>数据手册

    TPS3852 高精度电压监控,带可编程窗口看门狗定时器数据手册

    TPS3852包括精确的磁滞,使该器件成为 与严格公差系统一起使用。监控 RESET 延迟具有 15% 精度高,高精度延时定时器
    的头像 发表于 04-10 15:30 710次阅读
    TPS3852 <b class='flag-5'>高精度</b>电压监控<b class='flag-5'>器</b>,带可编程窗口看门狗<b class='flag-5'>定时器</b>数据手册

    TPS3852-Q1 汽车级高精度电压监控,带集成窗口看门狗定时器数据手册

    温度范围内实现 0.8% 的精度。 此外,TPS3852-Q1 具有精确的磁滞,使该器件非常适合与紧公差系统一起使用。监控 RESET delay 具有 15% 精度高精度延迟
    的头像 发表于 04-10 15:08 681次阅读
    TPS3852-Q1 汽车级<b class='flag-5'>高精度</b>电压监控<b class='flag-5'>器</b>,带集成窗口看门狗<b class='flag-5'>定时器</b>数据手册

    TPS3851-Q1 带集成看门狗定时器的汽车级高精度电压监控数据手册

    TPS3851-Q1 器件将精密电压监控与可编程看门狗定时器相结合。TPS3851-Q1 比较在欠压 (V 下) 的精度为 0.8% (–40°C 至 +125°C) ~ITN~
    的头像 发表于 04-10 14:45 711次阅读
    TPS3851-Q1 带集成看门狗<b class='flag-5'>定时器</b>的汽车级<b class='flag-5'>高精度</b>电压监控<b class='flag-5'>器</b>数据手册

    ADS1298 single-shot模式数据未转换是怎么回事?

    采用STM32和ADS1298开发12导心电测量仪。ADS1298配置为continuous模式已经工作正常,现在要改为single-shot模式。在
    发表于 12-23 07:41

    使用ads1219这款模数转换,读写流程和使用single-shot模式和continuous的区别是什么?

    我最近在使用ads1219这款模数转换,遇到一些问题,我是想通过FPGA来读取ADS1219的两路单端的模拟信号,在疑惑是读写流程和使用single-shot模式和continuous的区别
    发表于 12-10 06:12