问题提出
客户使用 STM32G474 的高精度定时器,基于 CubeMX 进行外设配置与代码生成,将某个子定时器的计数方式设置为 retriggerable single shot 方式,发现该子定时器无 PWM 输出,在调试模式下发现该子定时器的计数器一直为 0,即计数器一直没有启动,但如果将计数方式修改为continuous 模式,其他保持不变,定时器工作正常。
问题分析
检查客户提供的 CubeMx 配置文件,客户使能了 Master Timer 与 Timer B,Master Timer 的比较器事件 2 触发 Timer B 复位与运行,并配置了 Timer B 的 PWM 输出,使用该工程文件直接生成代码,并添加高精度定时器计数使能与输出使能函数。
解决方法
基于以上分析,造成该问题的主要原因是 CubeMx 基于 HAL 库自动生成的初始化代码中没有考虑不同的寄存器更新配置方式,只是单一的采用软件更新的方式来触发寄存器更新。要解决以上问题,需要修改代码中的定时器初始化的时序,在配置寄存器更新方式为“Update taken intoaccount on the following Reset/Roll-over event”前,让其他的配置先生效,基本逻辑如下,该逻辑在客户自己编写初始化代码时也需要遵循。
小结
解决客户提出的高精度定时器中的子定时器在 retriggerable single shot 计数模式下无法工作的问题,原因在于该计数模式下,当更新配置方式为“ Update taken into account on the followingReset/Roll-over event ”时,使用 CubeMx 生成的原始初始化代码出现了定时器配置无法生效,从而导致问题的出现。通过对初始化代码的逻辑进行简单修改,问题得以解决。当然,STM32CubeMx 的未来版本应会就这个地方做针对性地完善。