問題提出
客戶使用 STM32G474 的高精度定時器,基于 CubeMX 進(jìn)行外設(shè)配置與代碼生成,將某個子定時器的計數(shù)方式設(shè)置為 retriggerable single shot 方式,發(fā)現(xiàn)該子定時器無 PWM 輸出,在調(diào)試模式下發(fā)現(xiàn)該子定時器的計數(shù)器一直為 0,即計數(shù)器一直沒有啟動,但如果將計數(shù)方式修改為continuous 模式,其他保持不變,定時器工作正常。
問題分析
檢查客戶提供的 CubeMx 配置文件,客戶使能了 Master Timer 與 Timer B,Master Timer 的比較器事件 2 觸發(fā) Timer B 復(fù)位與運行,并配置了 Timer B 的 PWM 輸出,使用該工程文件直接生成代碼,并添加高精度定時器計數(shù)使能與輸出使能函數(shù)。
解決方法
基于以上分析,造成該問題的主要原因是 CubeMx 基于 HAL 庫自動生成的初始化代碼中沒有考慮不同的寄存器更新配置方式,只是單一的采用軟件更新的方式來觸發(fā)寄存器更新。要解決以上問題,需要修改代碼中的定時器初始化的時序,在配置寄存器更新方式為“Update taken intoaccount on the following Reset/Roll-over event”前,讓其他的配置先生效,基本邏輯如下,該邏輯在客戶自己編寫初始化代碼時也需要遵循。
小結(jié)
解決客戶提出的高精度定時器中的子定時器在 retriggerable single shot 計數(shù)模式下無法工作的問題,原因在于該計數(shù)模式下,當(dāng)更新配置方式為“ Update taken into account on the followingReset/Roll-over event ”時,使用 CubeMx 生成的原始初始化代碼出現(xiàn)了定時器配置無法生效,從而導(dǎo)致問題的出現(xiàn)。通過對初始化代碼的邏輯進(jìn)行簡單修改,問題得以解決。當(dāng)然,STM32CubeMx 的未來版本應(yīng)會就這個地方做針對性地完善。