通用定時器TIMx(2,3,4,5)
TIMx簡介
通用定時器是一個通過可編程預分頻器驅動的16位自動裝載計數器構成。它實用與很多場合,如:測試輸出信號的脈沖長度(輸入捕獲),產生輸出波形(輸出比較和PWM)。
注:每個定時器都是獨立工作的。
TIMx主要功能
1: 16位的向上,向下,向上/向下自動裝載計數器。(TIMx_CR1的DIR位)
2:16位可編程預分頻器,計數器時鍾的頻率系數在1~65536。(TIMx_PSC)
3:4個獨立通道 (配置TIMx_CCMRx的CC2S[1:0]和OCxM[2:0])
A. 輸入捕獲
B. 輸出比較
C. PWM生成
D. 單脈沖模式輸出
4:支持針對定位的增量(正交)編程器和霍爾傳感器比較。
時基單元
計數器寄存器(TIMx_CNT)
預分頻寄存器(TIMx_PSC)
自動裝載寄存器(TIMx_ARR)
自動裝載寄存器是預先裝載的,寫或讀自動重裝載寄存器將訪問預裝載寄存器。根據在
TIMx_CR1寄存器中的自動裝載預裝載使能位(ARPE)的設置,預裝載寄存器的內容被立即或在每次的更新事件UEV時傳送到影子寄存器 。
預分頻器可以將計數器的時鍾頻率按1到65526之間的任意值分頻。它是基於一個(在TIMx_PSC寄存器中的)位寄存器控制的16位計數器,這個寄存器由一個緩沖器,在寄存器工作時當出現更新記錄新的預分頻數,在下一次事件更新時對TIMx_PSC進行更新。
計數器時對分頻后時時鍾進行計數。
計數器模式
這個很好理解,計數器向上計數時,計數器的數值0開始計數直到預定數值(TIMx_ARR中的值)。然后產生一個計數器溢出事件。向下計數是從預定值(TIMx_ARR)到0,然后產生一個(下)溢出事件。
在中央對齊模式,計數器從0開始計數到自動加載的值-1(TIMx_ARR-1),產生一個計數器溢出事件,然后向下計數到1並且產生一個計數器下溢事件;然后再從0開始重新計數。
設置計數器計數模式在TIMx_CR1的DIR位,但是對於中央對齊模式該位只用於讀。對於中央對齊模式設置的是TIMx_CR1的CMS[1:0]位。
更新事件的產生可以是在一個溢出事件到來的時候,也可以是設置TIMx_EGR寄存器的UG位。
產生事件更新時,所有寄存器被更新。(預分頻器被更新,自動裝載影子寄存器被重新置入預裝載寄存器的值 )
設置TIMx_CR1寄存器中的UDIS位,可以禁止更新事件;這樣可以避免在向預裝載寄存器中的入新值時更新影子寄存器。
如果設置了TIMx_CR1寄存器中的URS位(選擇更新請求),設置UG位將產生一個更新事件UEV,但硬件不設置UIF標志(即不產生中斷或DMA請求);這是為了避免在捕獲模式下清除計數器時,同時產生更新和捕獲中斷 。
時鍾選擇
- 內部時鍾(CK_INT) SMS=000;
- 外部時鍾模式1:外部輸入腳(TIx) SMS=111;
- 外部時鍾模式2:外部觸發輸入(ETR)
- 內部觸發輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器。
在設內部時鍾和外部時鍾模式1時:設置TIMx_SMCR寄存器的SMS[3;0]位可以選着時鍾模式。
在設置外部時鍾模式2時:設置TIMx_SMCR寄存器中的ECE=1
設置位內部觸發輸入時: 配置定時器x1為主模式,它可以在每一個更新事件UEV時輸出一個周期性的觸發信號。在TIMx1_CR2寄存器的MMS=’010’時,每當產生一個更新事件時在TRGO1上輸出一個上升沿信號 設置TIMx2_SMCR寄存器的TS=’000’,配置定時器x2為使用ITR1作為內部觸發的從模式 然后把從模式控制器置於外部時鍾模式x1(TIMx2_SMCR寄存器的SMS=111);這樣定時器x2即可由定時器x1周期性的上升沿(即定時器x1的計數器溢出)信號驅動
定時器幾種常用用法(參考資料)
輸入捕獲
在輸入捕獲模式下,當檢測到ICx信號上相應的邊沿后,計數器的當前值被鎖存到捕獲/比較寄存器(TIMx_CCRx)中。當捕獲事件發生時,相應的CCxIF標志(TIMx_SR寄存器)被置’1’,如果使能了中斷或者DMA操作,則將產生中斷或者DMA操作。如果捕獲事件發生時CCxIF標志已經為高,那么重復捕獲標志CCxOF(TIMx_SR寄存器)被置’1’。寫CCxIF=0可清除CCxIF,或讀取存儲在TIMx_CCRx寄存器中的捕獲數據也可清除CCxIF。寫CCxOF=0可清除CCxOF。
以下例子說明如何在TI1輸入的上升沿時捕獲計數器的值到TIMx_CCR1寄存器中,步驟如下:
● 選擇有效輸入端: TIMx_CCR1必須連接到TI1輸入,所以寫入TIMx_CCR1寄存器中的CC1S=01,只要CC1S不為’00’,通道被配置為輸入,並且TM1_CCR1寄存器變為只讀。
● 根據輸入信號的特點,配置輸入濾波器為所需的帶寬(即輸入為TIx時,輸入濾波器控制位是TIMx_CCMRx寄存器中的ICxF位)。假設輸入信號在最多5個內部時鍾周期的時間內抖動,我們須配置濾波器的帶寬長於5個時鍾周期。因此我們可以(以fDTS頻率)連續采樣8次,以確認在TI1上一次真實的邊沿變換,即在TIMx_CCMR1寄存器中寫入IC1F=0011。
● 選擇TI1通道的有效轉換邊沿,在TIMx_CCER寄存器中寫入CC1P=0(上升沿)。
● 配置輸入預分頻器。在本例中,我們希望捕獲發生在每一個有效的電平轉換時刻,因此預分頻器被禁止(寫TIMx_CCMR1寄存器的IC1PS=00)。
● 設置TIMx_CCER寄存器的CC1E=1,允許捕獲計數器的值到捕獲寄存器中。
● 如果需要,通過設置TIMx_DIER寄存器中的CC1IE位允許相關中斷請求,通過設置
TIMx_DIER寄存器中的CC1DE位允許DMA請求。當發生一個輸入捕獲時:
● 產生有效的電平轉換時,計數器的值被傳送到TIMx_CCR1寄存器。
● CC1IF標志被設置(中斷標志)。當發生至少2個連續的捕獲時,而CC1IF未曾被清除,
CC1OF也被置’1’。
● 如設置了CC1IE位,則會產生一個中斷。
● 如設置了CC1DE位,則還會產生一個DMA請求。
為了處理捕獲溢出,建議在讀出捕獲溢出標志之前讀取數據,這是為了避免丟失在讀出捕獲溢出標志之后和讀取數據之前可能產生的捕獲溢出信息。
在捕獲/比較使能寄存器的(CC1E)位配置通道為輸入還是輸入
輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。 我們以測量脈寬為例,用一個簡圖來
說明輸入捕獲的原理,如圖 所示:
輸入捕獲脈寬測量原理
如圖 所示,就是輸入捕獲測量高電平脈寬的原理,假定定時器工作在向上計數模式,
圖中 t1~t2 時間,就是我們需要測量的高電平時間。測量方法如下:首先設置定時器通道 x 為上升沿捕獲,這樣, t1 時刻,就會捕獲到當前的 CNT 值,然后立即清零 CNT,並設置通道 x為下降沿捕獲,這樣到 t2 時刻,又會發生捕獲事件,得到此時的 CNT 值,記為 CCRx2。 這樣,根據定時器的計數頻率,我們就可以算出 t1~t2 的時間,從而得到高電平脈寬。在 t1~t2 之間,可能產生 N 次定時器溢出,這就要求我們對定時器溢出,做處理,防止高電平太長,導致數據不准確。如圖 15.1.1所示,t1~t2之間,CNT計數的次數等於:N*ARR+CCRx2,有了這個計數次數,再乘以 CNT 的計數周期,即可得到 t2-t1 的時間長度,即高電平持續時間。
輸入/捕獲模式相關的寄存器(TIMx_CCMRx,TIMx_CCER,TIMx_CR1)
配置過程:
基本設置:
配置相應的時鍾使能(定時器時鍾,和GPIO時鍾)
配置相應映射關系,IC映射到不同的地方,GPIO的設置也並不相同(在
TIMx_CCMRx中)
設置相應的捕獲分頻
設置相應濾波器
對相應的定時器進行基本的設置(ARR,PSC)
設置相應中斷使能(更新中斷)
打開相應捕獲/比較使能寄存器(設置捕獲使能和捕獲信號極性)
設置配置寄存器。打開計數器使能
配置中斷服務函數。
中斷服務函數
對於一個輸入\捕獲來說,當一個中斷到來時需要檢測信號(溢出后的中斷,和輸入\捕獲的中斷)對於一個溢出后的中斷,記錄中斷次數,同時要檢測捕獲是否超時(捕獲時間太長久認為一次輸入\捕獲發生),對於一個輸入\捕獲引起的中斷,判斷捕獲的信號的類型(一次捕獲,清空計數器和溢出數標志,同時設置新的捕獲邊沿(先上升后下降,先下降后上升)),當第二次捕獲到第二個輸入引起的中斷時,設置一次完整的捕獲完成,同時設置新的捕獲邊沿。對於一個中斷服務函數最后還要清除中斷標志。
PWM模式
脈沖寬度調制模式可以產生一個由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號。在TIMx_CCMRx寄存器中的OCxM位寫入’110’(PWM模式1)或’111’(PWM模式2),能夠獨立地設置每個OCx輸出通道產生一路PWM。必須設置TIMx_CCMRx寄存器OCxPE位以使能相應的預裝載寄存器,最后還要設置TIMx_CR1寄存器的ARPE位, (在向上計數或中心對稱模式中)使能自動重裝載的預裝載寄存器。
僅當發生一個更新事件的時候,預裝載寄存器才能被傳送到影子寄存器,因此在計數器開始計數之前,必須通過設置TIMx_EGR寄存器中的UG位來初始化所有的寄存器。
OCx的極性可以通過軟件在TIMx_CCER寄存器中的CCxP位設置,它可以設置為高電平有效或低電平有效。 TIMx_CCER寄存器中的CCxE位控制OCx輸出使能。
PWM的原理圖:
上圖 就是一個簡單的 PWM 原理示意圖。圖中,我們假定定時器工作在向上計數 PWM
模式,且當 CNT<CCRx 時,輸出 0,當 CNT>=CCRx 時輸出 1。那么就可以得到如上的 PWM
示意圖:當 CNT 值小於 CCRx 的時候, IO 輸出低電平(0),當 CNT 值大於等於 CCRx 的時候,IO 輸出高電平(1),當 CNT 達到 ARR 值的時候,重新歸零,然后重新向上計數,依次循環。改變 CCRx 的值,就可以改變 PWM 輸出的占空比,改變 ARR 的值,就可以改變 PWM 輸出的頻率,這就是 PWM 輸出的原理。
配置PWM:
設置相應時鍾使能(GPIO和輔助時鍾)
配置相應的的GPIO口為輸出模式
配置相應的自動裝載寄存器和預分頻寄存器
配置PWM模式。(CCMR)
{
在OCxM位設置PWM模式一般為110或111
配置CCxE位,這一位是輸入\捕獲使能位,在(CCER)中,想要PWM從IO輸出,改為要設置位1
}
打開相應ARPE(CR1)
打開相應的計數器使能位。
對TIMx_CCRn寄存器寫入相應的值來控制脈寬長度
時間長度(s)=PSC/P(外)*(ARR-CCR)
PSC為預分頻時間,P(外)為外部時鍾,ARR自動裝載寄存器的值,CCR為捕獲/比較寄存器的值。