1. 問題提出
客戶使用STM32G474的高精度定時器,基于CubeMX進行外設設置和代碼生成,將某個子定時器的計數方式設置為retriggerable single shot方式,發現該子定時器無PWM輸出,在調試模式下發現該子定時器的計數器一直為0,即計數器一直沒有啟動,但如果將計數方式修改為continuous模式,其他保持不變,定時器工作正常。
2.問題描述
檢查客戶提供的CubeMX配置文件,客戶使能了Master Timer與Timer B,Master 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 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初始化代碼
圖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”前,讓其他的配置先生效,基本邏輯如下,該邏輯在客戶自己編寫初始化代碼時也需要遵循。
4.小結
解決客戶提出的高精度定時器中的子定時器在retriggerable single shot計數模式下無法工作的問題,原因在于該計數模式下,當更新配置方式為“Update taken into account on the following Reset/Roll-over event”時,使用CubeMX生成的原始初始化代碼出現了定時器配置無法生效,從而導致問題的出現。通過對初始化代碼的邏輯進行簡單修改,問題得以解決。當然,STM32CubeMX的未來版本應會就這個地方做針對性地完善。
來源:STM32單片機
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5254瀏覽量
119215 -
定時器
+關注
關注
23文章
3218瀏覽量
113707 -
CubeMx
+關注
關注
0文章
29瀏覽量
1277
發布評論請先 登錄
相關推薦
評論