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

利用STM32F4系列基本定時器寫延時程序

基于STM32G4芯片的DAC應(yīng)用示例分享

STM32F4: Systick滴答定時器-延時函數(shù)講解(五)

STM32定時器US延時

【STM32】SysTick滴答定時器(delay延時函數(shù)講解)

AN5310_使用STM32F3系列與STM32G4系列設(shè)備的模擬特性指南

評論