STM32常規(guī)定時器主要包括基本定時器、通用定時器和高級定時器。不論哪一類定時器,都有個共同的計數(shù)定時單元,我們把它稱之為時基單元。
該單元主要由三部分組成:
分頻模塊、計數(shù)模塊、自動重裝載模塊?。
分頻模塊用來對外來的計數(shù)時鐘進行分頻,這里有個分頻計數(shù)器,通過它來實現(xiàn)對時鐘的分頻功能。與之對應(yīng)的有個分頻器寄存器TIMx_PSC,用來配置和存放分頻比、分頻系數(shù)。
計數(shù)模塊用來對來自分頻器輸出的計數(shù)脈沖進行計數(shù)。相應(yīng)的這里有個寄存器—計數(shù)器寄存器TIMx_CNT,為了把該計數(shù)器跟別的計數(shù)器區(qū)別開來,不妨稱它為核心計數(shù)器。
自動重裝載模塊用來配合計數(shù)器溢出,當(dāng)計數(shù)器溢出時為之賦予初始計數(shù)值的功能單元。與之相應(yīng)的有個自動重裝載寄存器TIMx_ARR.當(dāng)自動重裝載寄存器TIMx_ARR修改生效后就可以自動地作為計數(shù)器的計數(shù)邊界或重裝值。
關(guān)于自動重裝及自動重裝載寄存器TIMx_ARR是個相對比較難理解的地方,尤其關(guān)于ARR寄存器數(shù)據(jù)的含義。我們在看STM32參考手冊時,很難一下子理解得很到位,往往需要結(jié)合上下文內(nèi)容反復(fù)閱讀后去領(lǐng)會。關(guān)于計數(shù)器的溢出與重裝,在手冊里只有些零散且并不算清晰的介紹,這里盡力跟大家做些交流,以供參考。
當(dāng)計數(shù)器溢出時,自動重裝載器為計數(shù)器重裝計數(shù)初始值。自動重裝寄存器【ARR】為計數(shù)器設(shè)置計數(shù)邊界或初始值,決定計數(shù)脈沖的多少或計時周期長短。比如:計數(shù)器向上計數(shù)時,計到多少發(fā)生溢出;向下計數(shù)時從多少開始往下計數(shù)。平常我們泛泛地說ARR寄存器為計數(shù)器提供計數(shù)邊界或重裝值,但它的具體含義及使用需要結(jié)合計數(shù)器的計數(shù)模式才能確定。
那一起看看STM32定時器所支持的三種計數(shù)模式及計數(shù)過程。
【文中圖片可以點擊放大觀看】
從上面三種計數(shù)模式下的計數(shù)動作來看,不同模式下計數(shù)器的溢出點并不一樣,溢出后重裝值也不一樣。顯然,ARR寄存器里的數(shù)據(jù)扮演的角色也因不同的計數(shù)模式而有所不同。我這里特地就三種計數(shù)模式下的溢出與重裝匯總成一個表格,以便觀察和比較。不難看出,重裝值并不一定等于ARR,有時重裝值就是0.
根據(jù)上面的介紹和分析,我們要弄清楚幾點:
1、對時鐘脈沖進行計數(shù)以及溢出是計數(shù)器的事;
2、當(dāng)計數(shù)器發(fā)生溢出時對計數(shù)器重裝初始值是自動重裝載器的事;
3、ARR寄存器里數(shù)據(jù)的含義會因計數(shù)模式的不同而有所不同;
我們弄個實例來看看,以加深對這個溢出與重裝的理解。
我們來看一個通過高級定時器使用比較輸出功能輸出指定個數(shù)脈沖的實例。假設(shè)使用PWM輸出的單脈沖模式,借助高級定時器的RCR【重復(fù)計數(shù)器寄存器】來輸出指定個數(shù)的PWM脈沖。
單脈沖模式:計數(shù)器啟動后,對于高級定時器,發(fā)生第RCR+1次溢出時觸發(fā)更新事件,同時計數(shù)器停止計數(shù)。對于通用定時器,沒有RCR寄存器,即每次溢出都可以產(chǎn)生更新事件,然后停止計數(shù)。
首先,我們需選擇合適的計數(shù)模式與PWM輸出模式來完成該任務(wù)。
條件1:向上計數(shù)模式 + PWM1模式;RCR=2; 極性選擇高有效。
基于這個條件,當(dāng)CCR大于計數(shù)器CNT時,OCx端輸出高電平,反之輸出低電平。
RCR=2,意味著計數(shù)器在發(fā)生第3次溢出時產(chǎn)生更新事件。
經(jīng)驗證測試,基于上面條件的輸出波形是下面的樣子。
【圖一、向上計數(shù)模式+ PWM1模式RCR=2;極性選擇高有效】
一眼就可以看出,輸出波形后面多了高電平尾巴,如果是自己期望的倒還好。如果希望最后電平停在低電平,顯然就不合適了。
我們先不管合不合適,看看為什么會這樣。最后發(fā)生溢出時計數(shù)器的值不等于ARR嗎?結(jié)合上面圖形,不難看出ARR的值顯然比CCR要大得多,即最后時刻計數(shù)器的值比CCR要大,那根據(jù)上面PWM1模式和極性選擇條件,不是該輸出低電平嗎?怎么會輸出高電平呢?奇怪!哪里不對勁呢?
那我們換個PWM輸出模式,保持其它條件不變,看看使用PWM2模式結(jié)果如何?
條件2:向上計數(shù)模式 + PWM2模式;RCR=2; 極性選擇高有效。
基于上面條件,當(dāng)CCR大于計數(shù)器CNT時,OCx端輸出低電平,反之輸出高電平?【即跟PWM1模式時的輸出是相反的】。
RCR=2,同樣意味著計數(shù)器在發(fā)生第3次溢出時產(chǎn)生更新事件。
經(jīng)驗證測試,基于上述條件輸出波形變成了下面的樣子。
【圖二、向上計數(shù)模式+ PWM2模式RCR=2;極性選擇高有效】
3個脈沖輸出倒是漂亮。細(xì)心的人是否還是發(fā)現(xiàn)了最后結(jié)尾那個地方有點不對勁呢?第三次發(fā)生溢出【CNT==ARR】產(chǎn)生更新事件后,計數(shù)器停止計數(shù)了,如果此時計數(shù)器的值等于ARR的值,根據(jù)剛才PWM2模式和極性選擇的條件,那輸出應(yīng)該保持為高電平才合理怎么這又變成低了呢?
那問題出在哪里呢?似乎哪一副圖都存在著原理上說不過去的地方。結(jié)合前面的溢出與重裝的的介紹與分析,或許有人看出端倪了。
其實,這兩副圖中,最后發(fā)生溢出的時刻都是在CNT等于ARR的時候,溢出的同時觸發(fā)了更新事件。加上定時器工作在單脈沖PWM輸出模式,計數(shù)器被停止計數(shù)。但計數(shù)器停止計數(shù),并不妨礙計數(shù)器溢出時自動重裝載器對其做初始值的重裝。那么這個重裝值是多少呢?結(jié)合這里的計數(shù)模式,這個重裝值正好是0,即計數(shù)器的值變?yōu)?了,并停在這個位置。既然溢出后計數(shù)器值變?yōu)?了,對于PWM1模式+高有效極性選擇的話,相應(yīng)的比較輸出結(jié)果就是高電平;對于PWM2模式+高有效極性選擇的話,相應(yīng)的比較輸出結(jié)果就是低電平。經(jīng)這樣分析所得結(jié)論,正好跟我們的實測結(jié)果一致。
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124573 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
365125 -
定時器
+關(guān)注
關(guān)注
23文章
3298瀏覽量
119003
原文標(biāo)題:STM32定時器的溢出與重裝
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM32定時器的分頻模塊、計數(shù)模塊、自動重裝載模塊?
三種STM32定時器區(qū)別通用定時器功能特點描述
STM32F10ZET6內(nèi)部三種定時器區(qū)別
HT48 MCU定時器/計數(shù)器的應(yīng)用
HT48 MCU 定時器/計數(shù)器的使用
STM32定時器三種中心對齊計數(shù)模式簡介

STM32F103-定時器

應(yīng)用筆記 | 高精度定時器中single-shot計數(shù)模式不工作

評論