李倩 發表於 2018-11-19 19:18:42
STM32常規定時器主要包括基本定時器、通用定時器和高級定時器。不論哪一類定時器,都有個共同的計數定時單元,我們把它稱之為時基單元。
該單元主要由三部分組成:
分頻模塊、計數模塊、自動重裝載模塊。
分頻模塊用來對外來的計數時鐘進行分頻,這裡有個分頻計數器,通過它來實現對時鐘的分頻功能。與之對應的有個分頻器寄存器TIMx_PSC,用來配置和存放分頻比、分頻係數。
計數模塊用來對來自分頻器輸出的計數脈衝進行計數。相應的這裡有個寄存器—計數器寄存器TIMx_CNT,為了把該計數器跟別的計數器區別開來,不妨稱它為核心計數器。
自動重裝載模塊用來配合計數器溢出,當計數器溢出時為之賦予初始計數值的功能單元。與之相應的有個自動重裝載寄存器TIMx_ARR.當自動重裝載寄存器TIMx_ARR修改生效後就可以自動地作為計數器的計數邊界或重裝值。
關於自動重裝及自動重裝載寄存器TIMx_ARR是個相對比較難理解的地方,尤其關於ARR寄存器數據的含義。我們在看STM32參考手冊時,很難一下子理解得很到位,往往需要結合上下文內容反覆閱讀後去領會。關於計數器的溢出與重裝,在手冊裡只有些零散且並不算清晰的介紹,這裡盡力跟大家做些交流,以供參考。
當計數器溢出時,自動重裝載器為計數器重裝計數初始值。自動重裝寄存器【ARR】為計數器設置計數邊界或初始值,決定計數脈衝的多少或計時周期長短。比如:計數器向上計數時,計到多少發生溢出;向下計數時從多少開始往下計數。平常我們泛泛地說ARR寄存器為計數器提供計數邊界或重裝值,但它的具體含義及使用需要結合計數器的計數模式才能確定。
那一起看看STM32定時器所支持的三種計數模式及計數過程。
【文中圖片可以點擊放大觀看】
從上面三種計數模式下的計數動作來看,不同模式下計數器的溢出點並不一樣,溢出後重裝值也不一樣。顯然,ARR寄存器裡的數據扮演的角色也因不同的計數模式而有所不同。我這裡特地就三種計數模式下的溢出與重裝匯總成一個表格,以便觀察和比較。不難看出,重裝值並不一定等於ARR,有時重裝值就是0.
根據上面的介紹和分析,我們要弄清楚幾點:
1、對時鐘脈衝進行計數以及溢出是計數器的事;
2、當計數器發生溢出時對計數器重裝初始值是自動重裝載器的事;
3、ARR寄存器裡數據的含義會因計數模式的不同而有所不同;
我們弄個實例來看看,以加深對這個溢出與重裝的理解。
我們來看一個通過高級定時器使用比較輸出功能輸出指定個數脈衝的實例。假設使用PWM輸出的單脈衝模式,藉助高級定時器的RCR【重複計數器寄存器】來輸出指定個數的PWM脈衝。
單脈衝模式:計數器啟動後,對於高級定時器,發生第RCR+1次溢出時觸發更新事件,同時計數器停止計數。對於通用定時器,沒有RCR寄存器,即每次溢出都可以產生更新事件,然後停止計數。
首先,我們需選擇合適的計數模式與PWM輸出模式來完成該任務。
條件1:向上計數模式 + PWM1模式;RCR=2; 極性選擇高有效。
基於這個條件,當CCR大於計數器CNT時,OCx端輸出高電平,反之輸出低電平。
RCR=2,意味著計數器在發生第3次溢出時產生更新事件。
經驗證測試,基於上麵條件的輸出波形是下面的樣子。
【圖一、向上計數模式+ PWM1模式RCR=2;極性選擇高有效】
一眼就可以看出,輸出波形後面多了高電平尾巴,如果是自己期望的倒還好。如果希望最後電平停在低電平,顯然就不合適了。
我們先不管合不合適,看看為什麼會這樣。最後發生溢出時計數器的值不等於ARR嗎?結合上面圖形,不難看出ARR的值顯然比CCR要大得多,即最後時刻計數器的值比CCR要大,那根據上面PWM1模式和極性選擇條件,不是該輸出低電平嗎?怎麼會輸出高電平呢?奇怪!哪裡不對勁呢?
那我們換個PWM輸出模式,保持其它條件不變,看看使用PWM2模式結果如何?
條件2:向上計數模式 + PWM2模式;RCR=2; 極性選擇高有效。
基於上麵條件,當CCR大於計數器CNT時,OCx端輸出低電平,反之輸出高電平【即跟PWM1模式時的輸出是相反的】。
RCR=2,同樣意味著計數器在發生第3次溢出時產生更新事件。
經驗證測試,基於上述條件輸出波形變成了下面的樣子。
【圖二、向上計數模式+ PWM2模式RCR=2;極性選擇高有效】
3個脈衝輸出倒是漂亮。細心的人是否還是發現了最後結尾那個地方有點不對勁呢?第三次發生溢出【CNT==ARR】產生更新事件後,計數器停止計數了,如果此時計數器的值等於ARR的值,根據剛才PWM2模式和極性選擇的條件,那輸出應該保持為高電平才合理怎麼這又變成低了呢?
那問題出在哪裡呢?似乎哪一副圖都存在著原理上說不過去的地方。結合前面的溢出與重裝的的介紹與分析,或許有人看出端倪了。
其實,這兩副圖中,最後發生溢出的時刻都是在CNT等於ARR的時候,溢出的同時觸發了更新事件。加上定時器工作在單脈衝PWM輸出模式,計數器被停止計數。但計數器停止計數,並不妨礙計數器溢出時自動重裝載器對其做初始值的重裝。那麼這個重裝值是多少呢?結合這裡的計數模式,這個重裝值正好是0,即計數器的值變為0了,並停在這個位置。既然溢出後計數器值變為0了,對於PWM1模式+高有效極性選擇的話,相應的比較輸出結果就是高電平;對於PWM2模式+高有效極性選擇的話,相應的比較輸出結果就是低電平。經這樣分析所得結論,正好跟我們的實測結果一致。
打開APP閱讀更多精彩內容聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴