我們有時會利用STM32片內的多個TIMER進行級聯(lián),實現(xiàn)同步啟動。不過有人會遇到沒法同步啟動的情況;或者說基于相同的配置,某次可以成功,下次再來又不行了;或者說同樣的芯片、同樣的代碼,別人的可以,而自己卻不行云云。所謂不行、不成功就是指基于同步啟動后,主從TIMER的PWM輸出相位肉眼可見的不同步,明顯存在啟動時間差。
我這里不妨先以STM32G4芯片內TIM1/TIM2/TIM3為例來演示下實現(xiàn)過程。看看到底能否實現(xiàn),會不會碰到無法同步的情形。如果有,可否解決。
根據(jù)該系列參考手冊有關TIMER內部互聯(lián)關系圖可知TIM1/TIM2/TIM3就可以建立起主從關系。下圖便是其中的一部分TIMER信號互聯(lián)觸發(fā)關系圖。
我將TIM1/TIM2/TIM3按照下面的方式前后主從級聯(lián)。
TIM1的觸發(fā)輸出TRGO作為TIM2的觸發(fā)輸入【ITR0】,TIM2的觸發(fā)輸出TRGO作為TIM3的觸發(fā)輸入【ITR1】,其中TIM2/TIM3均配置在Trigger從模式。至于TIM1和TIM2的觸發(fā)輸出【TRGO】信號均選擇各自計數(shù)器的使能動作,即對定時器的TIMx_CR1@CEN位置1。對于處在Trigger從模式的定時器,外來觸發(fā)信號具有對TIMER計數(shù)器使能的同等效果。TIM3的TRGO不必關注,因為TIMER級聯(lián)應用時,TRGO信號是給下一級TIMER用的。
使用CubeMx對STM32G431進行配置。配置過程中將主從模式控制位MSM使能,具體參考下面配置。【注:3個定時器的時基參數(shù)及PWM配置都一樣。未對計數(shù)時鐘做分頻。最后希望輸出3路完全同頻同相的波形。】
利用CubeMx完成配置后,基于STM32 HAL庫添加用戶代碼進行驗證測試。經測試,發(fā)現(xiàn)3路輸出同步與否 跟 3個定時器的初始化代碼順序有明顯的關系。
比如,基于上面初始配置順序的3路輸出就沒有做到同步啟動,貌似互不理睬。
同樣,基于上面初始配置順序的3路輸出也沒有做到完美同步啟動,中間那路明顯異類。
然而,基于上面初始化順序的3路輸出倒是同步完美。
現(xiàn)在3個TIMER,初始化配置代碼擺放先后順序共6種組合,我把6種組合的實現(xiàn)結果集中在下面表格里一起來看。
我們發(fā)現(xiàn)上面6種組合中,僅表格里最后一組可以實現(xiàn)完美同步輸出,符合預期。
也就是說,只有初始化時遵循先主后從的配置順序才可能實現(xiàn)完美同步啟動。
在正確的配置順序下,我們不妨看看啟動后三個定時器的計數(shù)情況:【下圖是兩次隨機暫停程序讀到的3個計數(shù)器的值,見紅線下劃線標示的】
我們可以清晰地看到任意兩次暫停得到的三個計數(shù)器的值,兩兩主從定時器的計數(shù)值相差1個定時器外設時鐘單位,注意是TIMER外設時鐘,并不是計數(shù)時鐘,具體到這里就是1us/170。【因此刻沒有對時鐘源分頻,計數(shù)時鐘剛好等于TIMER外設時鐘】
一般來講,主從間的這1個TIMER外設時鐘的延時不該對應用構成影響,若覺得有影響,大概率是您選錯芯片了,或許該選個主頻更高的。何況當對計數(shù)時鐘做分頻后,計數(shù)器往往沒法感覺和區(qū)分這個細小延時的。當然,實在有強迫癥或其它想法,如果計數(shù)時鐘跟TIMER外設時鐘相同,即未做分頻前提下,我們還可以通過修改計數(shù)器初始值保證啟動后保持相同計數(shù)值或預期值。比方,在正確初始配置順序下,啟動前將三個計數(shù)器的初始值稍作調整,見下圖紅線方框里的代碼。
這樣調整后,每次暫停程序運行時,三個計數(shù)器的值總是保持高度一致,不差分毫。
提醒:剛才通過調整計數(shù)初值實現(xiàn)徹底的計數(shù)器同步計數(shù)僅限于計數(shù)時鐘源沒有做分頻的前提下,若計數(shù)時鐘有被分頻是不需要這么做的,也不能這么做。因為那1個主從啟動硬件延時是跟著外設時鐘走的,不是跟著計數(shù)時鐘走的。當計數(shù)時鐘被分頻后,計數(shù)器往往感受不到那個延時了,顯然分頻系數(shù)越大越感覺不到主從間的那個延時。如果此時手動額外在計數(shù)器初值上加1或加2就弄巧成拙了,本來可以忽略的延時被你這么一加反而加大延時了。當然,為產生啟動相差而有意調整計數(shù)初始值又是另外一回事了。
到此,我們也順便看看像下面級聯(lián)的情形,主從級聯(lián),從級并列多個定時器被同一觸發(fā)信號觸發(fā)。
具體到這里,TIM1的觸發(fā)輸出同時接到TIM2/TIM3/TIM4的內部觸發(fā)輸入。內部信號接法見上圖。
我們照樣使用cubeMx配置4個TIMER。
完成配置后,添加用戶代碼、稍加整理 。注意各定時器的初始化順序,必須按照先主后從的順序進行,同級并聯(lián)的無所謂先后。至于各定時器的啟動函數(shù)順序,原則上要求跟初始化順序反過來,即按照先從后主的順序來啟動。
運行代碼,可以看到4個TIMER輸出的PWM輸出同步得很完美。同樣,我們也可以通過隨機暫停程序查看4個定時器的計數(shù)值的情況。下圖就是任意時刻暫停程序后得到的4個計數(shù)器的數(shù)據(jù)。詳見下面截圖底部表格說明。
顯然,在初始計數(shù)值相同情況下,主從定時器的計數(shù)值相差1個定時外設時鐘,這點跟上面的測試是一致的。另外,基于一個觸發(fā)信號下的同級定時器沒有計數(shù)差值。
總的說來,STM32芯片內多個TIMER實現(xiàn)同步啟動完全可以實現(xiàn),而且可以做到很好的同步,配置也簡單。通常使用計數(shù)器的使能信號作為觸發(fā)信號。應用中最常見的問題莫過于定時器初始化順序不當,記得按照先主后從的順序進行,否則會導致無法實現(xiàn)整體同步啟動及預期輸出,這里特作提醒。
審核編輯:湯梓紅
-
芯片
+關注
關注
453文章
50406瀏覽量
421813 -
PWM
+關注
關注
114文章
5144瀏覽量
213401 -
STM32
+關注
關注
2266文章
10871瀏覽量
354801 -
定時器
+關注
關注
23文章
3237瀏覽量
114467
發(fā)布評論請先 登錄
相關推薦
評論