有人使用STM32G4系列芯片內部的多個定時器做PWM輸出,輸出頻率一樣,占空比也一樣,均為50%??墒?,當他中途調整各個定時器以相同的工作參數,即改變ARR的值和CCR值后,會發現TIM2和TIM5兩個定時器要比其它定時器延時等待一段長達20s左右的時間后才恢復正常PWM輸出,覺得頗為奇怪。
該用戶將芯片系統時鐘配置成170MHz,并作為各個片內定時器的時鐘源,不做分頻后作為各個計數器的計數時鐘。
起初各個定時器的參數配置如下圖左邊所示內容,工作起來后,于某時刻將各個定時器的工作參數改成下圖右邊所示內容。
參數的修改基本在同一時刻完成,可是修改完各定時器的參數后,除了TIM2/TIM5的通道外,其它都能及時地基于新參數產生PWM輸出,TIM2/TIM5的輸出通道竟然會持續20s左右的低電平后才重新產生基于新參數的PWM輸出,怪異得很!
我們這里針對他用到的8個定時器來整理一下。8個定時器中除了TIM2/TIM5是32位定時器外,其它都是16位定時器。時鐘源、時基參數、PWM輸出配置都一樣。另外,他還強調關閉了各定時器的ARR和CCR的預裝功能,就是說針對這兩個寄存器即改即生效。
現在看來,感覺問題跟定時器的位寬有關。在STM32G4系列芯片里,TIM3是16位TIMER,TIM2是32位TIMER。這里不妨就拿它兩個作為代表做下測試,模擬該用戶的使用場景,看看是否可以重現問題現象。剛開始,兩個定時器使用完全相同的參數配置。【見下圖】
我在代碼里隨機地修改兩個定時器以相同的參數,也依然保持跟用戶相同數據。測試發現,很容易遇到修改參數后,TIM2要延時20多秒后才恢復PWM輸出的情形。如下圖所示:
結合上圖示波器輸出截圖,不難看出,針對TIM2/TIM3修改相同工作參數后,TIM2相對TIM3要延遲一段20多秒的低電平后才恢復PWM輸出。見紅色長橢圓形所圈出的地方。
其實,如果眼尖細心的人也許發現修改參數后,TIM3也保持了一段低電平時間后才做正常PWM輸出,感覺TIM3的PWM輸出也并非即該即生效,只是延時相比TIM2短了不少而已。見下圖黃色箭頭所指位置。
為什么會這樣呢?
我們進一步理一下當前定時器的配置情況?,F在兩個TIMER除了計數器位寬不一樣外,其它的具體配置都是完全一樣的。時基參數一樣,向上計數模式,PWM1模式,極性選擇為高有效。做PWM輸出時OC端遵循當CCR大于CNT時輸出高,否則輸出低電平。顯然,兩個定時器輸出通道的輸出規則也是一樣的。
那問題到底出在哪里呢?
有個問題我們可能忽略了,那就是我們修改定時器工作參數【這里就是時基參數和CCR值】的時間點。假設現有某定時器處于向上計數模式、自動重裝值被設定為ARR_1值后開始計數工作,然后在如下圖所示某時刻修改ARR值成ARR_2并立即生效。
當計數器計到CNT_x位置時成功修改了ARR的值變為ARR_2,此時計數器繼續向上計到ARR2后發生溢出后,重裝0開始新的計數循環。 但是,如果新的且生效的ARR值ARR_2比當前計數器值【CNT_x】還小會怎么樣呢?即像下面圖示的樣子:
此時新的ARR值是ARR_2,不再是ARR_1??纱藭r的計數器的值CNT_x比新的ARR_2還大,計數器又是向上計數模式。此時計數器如何計數呢?
計數器會依然按照現有計數方向計數:
對于16位寬度的定時器,它會從CNT_x一直計到0xffff時發生溢出,再從0開始計數,計到ARR_2后發生溢出重裝,這樣周期性地循環計數。顯然,如果定時器還做PWM輸出的話,從CNT_x到0xffff這段時間的輸出不是正常的,或者說不是預期的。
對于32位寬度的定時器,它會從CNT_x一直計到0xffffffff時才發生溢出,再從0開始計數,計到ARR_2后發生溢出重裝,這樣周期性地循環計數。同樣,如果定時器還做PWM輸出的話,從CNT_x到0xffffffff這段時間的輸出也不是正常的,或者說不是預期的。
也就是說,如果針對工作中的定時器中途成功修改ARR,且修改情形符合上面提到的第二種情形時,就會出現一段并不屬于用戶控制或用戶期望的計數段。自然,這段時間內的PWM輸出往往也不是用戶預期想要的。這段時間的長短取決于計數器的位寬和計數時鐘頻率。這個現象不論16位還是32位TIMER都有可能出現,無非時間長短、現象是否明顯罷了。這也解釋了前面16位TIMER和32位TIMER在成功修改ARR后都可能出現一段不受控或說非預期的計數時間段。
好,拉回我們前面的模擬測試。在測試中發生TIM2長時間暫停PWM輸出后才恢復的情形時,我們可以借助調試工具,發現成功修改ARR值時的CNT值要比新的ARR值【11332】大,見下面代碼截圖【圖中數據是16機制】:
此時,不論TIM2還是TIM3都要繼續往上計數到各自計數寬度所對應的默認計數最大值后才基于新的ARR值做循環計數。在這段繼續往上計數的時間段內,因為新的CCR值也已經生效且總是小于CNT的值,結合PWM1模式和高有效的極性選擇配置,這段時間自然持續保持低電平輸出。
前面也說了,是否會出現一段不受控或說非預期的較長計數段跟我們修改TIMER工作參數的時間點有關系。當修改工作參數時間點符合前面分析的第一種情形,即新的ARR值大于當前計數器值時,是不會出現那段不受控或說非預期的較長延時的。比如我在測試代碼中,調整修改時間點如下面情形時,就看不到TIM2需要長時間延時后才輸出PWM的情況。
從上圖中不難看出,成功修改完新的ARR值后,當前計數器的值比新的ARR值小。這時計數器只需按照原計數方向計到新的ARR值后溢出重裝,開始循環計數。此時也感覺不到PWM輸出的明顯異常,更看不到長時間無PWM輸出的情形。
上面的問題也分析得差不多了,如何避免問題的產生呢?
我們可以開啟ARR寄存器的預裝功能,這樣就可以避免可能出現一段漫長的非預期的計數段。如果不希望開啟ARR寄存器的預裝功能,而希望隨時修改ARR生效,我們可以在修改定時器的工作參數后,通過手動方式對TIMER進行復位,即對TIMER事件發生寄存器的UG位置1,這樣除了產生定時器更新事件外,計數器會根據計數模式重裝新的計數初值,若是向下計數模式,重裝ARR后開始向下計數,其它模式則重裝0值后開始向上計數。當然,也可以在修改定時器的工作參數后,直接對CNT賦予0值。
下面代碼截圖示意隨機修改ARR及CCR【此時關閉了二者的預裝功能】的情況,每次修改后都讓計數器從0開始計數,就完全可以避免可能出現長時間無PWM輸出的情況。
上面的分析都是基于計數器采用向上計數模式而言的,如果換了計數模式,有些描述可能需相應做調整,但基本意思是一樣的。
-
芯片
+關注
關注
456文章
51281瀏覽量
427776 -
PWM
+關注
關注
114文章
5201瀏覽量
214966 -
計數器
+關注
關注
32文章
2276瀏覽量
95052 -
定時器
+關注
關注
23文章
3256瀏覽量
115445
原文標題:一段莫名的延時輸出問題
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
STM32G4定時器TIM輸入捕獲頻率測量
stm32G4 H7系列的HRTIM高分辨率定時器可以做捕獲輸入嗎?
利用STM32F4系列基本定時器寫延時程序
![利用<b class='flag-5'>STM32F4</b><b class='flag-5'>系列</b>基本<b class='flag-5'>定時器</b>寫<b class='flag-5'>延時</b>程序](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于STM32G4芯片的DAC應用示例分享
![基于<b class='flag-5'>STM32G4</b><b class='flag-5'>芯片</b>的DAC應用示例分享](https://file.elecfans.com/web2/M00/20/EF/poYBAGGgV06ABI_AAAAkzpCmeRM955.png)
STM32F4: Systick滴答定時器-延時函數講解(五)
![<b class='flag-5'>STM32F4</b>: Systick滴答<b class='flag-5'>定時器</b>-<b class='flag-5'>延時</b>函數講解(五)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32】SysTick滴答定時器(delay延時函數講解)
![【<b class='flag-5'>STM32</b>】SysTick滴答<b class='flag-5'>定時器</b>(delay<b class='flag-5'>延時</b>函數講解)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論