STMCU小助手
发布时间:2023-2-14 18:14
|
1. 问题提出 客户使用 STM32G474 的高精度定时器,基于 CubeMX 进行外设配置与代码生成,将某个子定时器的计数方式设置为 retriggerable single shot 方式,发现该子定时器无 PWM 输出,在调试模式下发现该子定时器的计数器一直为 0,即计数器一直没有启动,但如果将计数方式修改为continuous 模式,其他保持不变,定时器工作正常。 5 w, v( b+ s! g3 G 2. 问题分析 , y1 J8 u% S1 \ 检查客户提供的 CubeMx 配置文件,客户使能了 Master Timer 与 Timer B,Master Timer 的比较器事件 2 触发 Timer B 复位与运行,并配置了 Timer B 的 PWM 输出,使用该工程文件直接生成代码,并添加高精度定时器计数使能与输出使能函数,如下: 2 n* }8 }. R/ i3 n9 \ 8 e; T' Y+ H' a! T7 c
进入调试模式观察,发现 Master Timer 正常计数,但是 Timer B 的计数器一直保持 0,按照客户的描述,将 Timer B 的计数方式修改为“continous”后,Timer B 恢复正常计数。对比 TimerB 在“retriggerable single shot”与“continous”两种工作模式下的相关寄存器的值进行对比,发现除了计数模式不同之外,其他所有的状态都相同。 莫非真是“retriggerable single shot”存在问题?这明显不可能,此前多次使用过该模式并没有发现问题,于是将以前设计的能成功工作的例程拿来与该“问题”工程进行对比。经过比对分析发现,工程配置中使用的寄存器更新方式存在不同,如下图所示: 2 d7 D' j' z# G- N0 q
( W8 C8 }, g/ M) q8 | “问题”工作工程中的寄存器更新配置 “问题”工程配置中使用 Master timer 的更新事件作为触发寄存器更新触发源,并且更新要等到本定时器的下一次的 Reset/Roll-over 事件出现时才生效。通过将“Update taken into account on the following Reset/Roll-over event”修改为“Update taken into account immediately”,定时器也可以正常运行了,问题的原因就是由于该配置引起的。 * @7 k) D3 K7 D0 X' b* E 查看该配置对应的寄存器说明:
$ B' y; J. O$ y2 e0 h . { g- \: A) F$ ] 当配置“Update taken into account on the following Reset/Roll-over event”对应于该位置“1”,即更新事件,无论是来自相邻定时器的还是软件产生的,都需要等到下一个 Reset/Rollover event 才生效。 * `6 } `4 c' d) h" s" N 在直接使用 CubeMx 产生的 HAL 底层配置代码且配置中使能了预加载的情况下,该寄存器更新配置方式会导致 Timer B 的初始化配置无法生效。 ) [' T7 y) Z# ] 如图 3/4/5 所显示的,因为在 CubeMx 直接生成的代码中,Timer B 参数的配置通过调用函数HAL_HRTIM_WaveformTimerConfig()写入寄存器,然后在该函数中调用软件更新函数HRTIM_ForceRegistersUpdate()的方式让配置生效,那么在目前的配置下,软件触发更新也必须等待 Reset/Roll-over event 的出现。而在 retriggerable single shot 计数模式下,定时器不能自动启动计数,必须等待来自 Master Timer 的 Reset 事件(即前文提到的比较器事件 2)。& D' U5 T0 R1 q+ V# ` ) e, v8 h, a; _3 Z2 v. Q$ X+ p , g6 k/ p# Q9 v7 F5 E5 t; ]- }0 f8 h
综上,虽然正确的配置了 Reset 事件,Master Timer 也正常计数且产生了比较事件 2,但问题在于在运行了初始化代码后,该配置仅仅是写到了 preload 寄存器中,而没有写入 active 寄存器中,即 Timer B 的复位源没有生效,带来的后果就是 Timer B 的计数器不运行,一直保持 0,且所有带有预加载特性的寄存器的值也没有生效。% Y9 R# R u! h$ `7 j5 G 作为对比,当配置为“Update taken into account immediately”时,调用软件触发更新函数HRTIM_ForceRegistersUpdate()函数,将使所有配置立即生效,定时器可正常工作。; Y$ b" N/ \+ m6 a6 T- P1 I* Q( n ' o v4 I. ]( N7 o+ _, S- f, ` 完整版请查看:附件
高精度定时器中single-shot计数模式不工作_V1.0.pdf
(311.73 KB, 下载次数: 2)
|
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版