LAT1183
Local Application Tips
LAT1183 Rev 1.0 Jan. 2023
高精度定时器中 single-shot 数模式不工作
关键字:高精度定时器, single-shot 计数模式
1. 问题提出
客户使用 STM32G474 的高精度定时器,基 CubeMX 进行外设配置与代码生成,将某个子
定时器的计数方式设置 retriggerable single shot 方式,发现该子定时器无 PWM 输出,在调试
模式下发现该子定时器的计数器一直为 0,即计数器一直没有启动,但如果将计数方式修改
continuous 模式,其他保持不变,定时器工作正常
2. 问题分析
检查客户提供 CubeMx 配置文件,客户使能 Master Timer Timer BMaster Timer
比较器事件 2 触发 Timer B 复位与运行,并配置了 Timer B PWM 输出,使用该工程文件直接生
成代码,并添加高精度定时器计数使能与输出使能函数,如下:
进入调试模式观察,发现 Master Timer 正常计数,但 Timer B 的计数器一直保持 0,按照
客户的描述,将 Timer B 的计数方式修改为“continous”后,Timer B 恢复正常计数。对比 Timer
B 在“retriggerable single shot”与“continous两种工作模式下的相关寄存器的值进行对比,发
现除了计数模式不同之外,其他所有的状态都相同。
莫非真是“retriggerable single shot”存在问题?这明显不可能,此前多次使用过该模式并没
有发现问题,于是将以前设计的能成功工作的例程拿来与该“问题”工程进行对比。经过比对分
析发现,工程配置中使用的寄存器更新方式存在不同,如下图所示:
1. 正常工作工程中的寄存器更新配置
2. “问题”工作工程中的寄存器更新配置
“问题”工程配置中使用 Master timer 的更新事件作为触发寄存器更新触发源,并且更新要等
到本定时器的下一次的 Reset/Roll-over 事件出现时才生效。通过将“Update taken into account
LAT1183
LAT1183 - Rev 1.0 page 2/6
on the following Reset/Roll-over event”修改为“Update taken into account immediately”,定
时器也可以正常运行了,问题的原因就是由于该配置引起的
查看该配置对应的寄存器说明
当配置“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)
3. “问题”工程中的寄存器更新与定时器 Reset 配置
4. “问题”工程产生 Timer B 初始化代码