基于stm32f103zet6的定時器的學習1(理論知識)
之前就聽到網(wǎng)友說定時器這部分比較復雜,難搞,實驗室里有個同學也搞了一段時間,不過它屬于哪種專研型的人!學著學者,我也來到了定時器這章。
在網(wǎng)上查看了一下,也翻閱了一些書籍,高級定時器,通用定時器,普通定時器這三種就從通用的開始學吧!
一、首先還是將定時器框圖分解一下吧,那么令人窒息的框圖著實讓人恐怖!雖然窒息,但是還是有必要貼上去!
對上面框圖中的寄存器名字解釋如下
TIMx_ETR:TIMER外部觸發(fā)引腳ETR:外部觸發(fā)輸入ETRP:分頻后的外部觸發(fā)輸入ETRF:濾波后的外部觸發(fā)輸入
ITRx:內(nèi)部觸發(fā)x(由另外的定時器觸發(fā))TI1F_ED:TI1的邊沿檢測器。TI1FP1/2:濾波后定時器1/2的輸入TRGI:觸發(fā)輸入
TRGO:觸發(fā)輸出 CK_PSC:應該叫分頻器時鐘輸入CK_CNT:定時器時鐘。(定時周期的計算就靠它)
TIMx_CHx:TIMER的輸入腳 TIx:應該叫做定時器輸入信號xICx:輸入比較xICxPS:分頻后的ICx
OCx:輸出捕獲xOCxREF:輸出參考信號
1、通用定時器的主要部分是一個【16位計數(shù)器】和與其相關的【自動裝載寄存器】。
可以實現(xiàn)三種計數(shù)方式:
a、【增計數(shù)】
b、【減計數(shù)】
c、【同時進行增減計數(shù)】(注意理解這里的同時,從同時非彼同時)
datasheet上關于計數(shù)模式的解釋如下!
在向上計數(shù)模式中,計數(shù)器從0 計數(shù)到自動加載值(TIMx_ARR計數(shù)器的內(nèi)容) ,然后重新從0 開始
計數(shù)并且產(chǎn)生一個計數(shù)器溢出事件。
在向下模式中,計數(shù)器從自動裝入的值(TIMx_ARR計數(shù)器的值)開始向下計數(shù)到0,然后從自動
裝入的值重新開始并且產(chǎn)生一個計數(shù)器向下溢出事件。
在中央對齊模式,計數(shù)器從0 開始計數(shù)到自動加載的值(TIMx_ARR寄存器)?1 ,產(chǎn)生一個計數(shù)器
溢出事件,然后向下計數(shù)到1并且產(chǎn)生一個計數(shù)器下溢事件;然后再從0開始重新計數(shù)。
對于中央對齊模式,開始不怎么了解,現(xiàn)在我個人的理解就是相當于:如果初值是3的話,那么它的計數(shù)方式就是
3、2、1、0、1、2、3這樣,先進性-1操作,后進行+1操作!
完畢!
2、那么首先就引進時鐘單元:定時器是由什么提供時鐘節(jié)拍的呢?
先來看一下幾種時鐘模式:
計數(shù)器時鐘可以由下列時鐘源提供:
·內(nèi)部時鐘(CK_INT)
·外部時鐘模式1:外部輸入腳(TIx)
·外部時鐘模式2:外部觸發(fā)輸入(ETR)
·內(nèi)部觸發(fā)輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1而作為另一個定時器Timer2的預分頻器。
由于定時器功能實在過于強大,所以采用內(nèi)部時鐘模式,其它的等有空在說吧!實在扛不住??!那么什么是內(nèi)部時鐘模式呢??
截取網(wǎng)上的一張圖,你就會相當清晰了
TIM1和TIM8是由APB2分頻提供的,而TIM2--TIM7是由分頻APB1提供的,從時鐘來源,我們是否就可以猜測到定時器1和定時器8更加高級呢?
APB2提供,最高可以到72M呀!至少我是這樣猜想的!截取某網(wǎng)友對定時器時鐘設置這部分的詳解,如果你看了,你定會豁然開朗的,我把他的話整理了一下!
1、從圖中可以看出,定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器,圖中的藍色部分,注意了是倍頻器,不是分頻器,繼續(xù)看??!
2、下面以定時器2~7的時鐘說明這個倍頻器的作用:(當然定時器和定時器8也是這樣的原理)
a、當APB1的預分頻系數(shù)為1時,這個倍頻器不起作用(也就是倍頻系數(shù)為1),定時器的時鐘頻率等于APB1的頻率;
b、當 APB1的預分頻系數(shù)為其它數(shù)值(即預分頻系數(shù)為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率兩倍(倍頻系數(shù)為2)。
3、可以通過這幾個例子來敘述(對于定時器2至定時器7)
a、假定AHB=36MHz,因為APB1允許的最大頻率為36MHz,所以APB1的預分頻系數(shù)可以取任意數(shù)值;
b、當APB1預分頻系數(shù)=1 時,APB1=36MHz,TIM2~7的時鐘頻率=36MHz(倍頻器不起作用);當APB1預分頻系數(shù)=2時,APB1=18MHz,在倍頻器的作用下,TIM2~7的時鐘頻率=36MHz。
總結:有人會問,既然需要TIM2~7的時鐘頻率=36MHz,為什么不直接取APB1的預分頻系數(shù)=1?
答案是:APB1不但要為TIM2~7提供時鐘,而且還要為其它外設提供時鐘;設置這個倍頻器可以在保證其它外設使用較低時鐘頻率時,TIM2~7仍能得到較高的時鐘頻率。
再舉個例子:當AHB=72MHz時,APB1的預分頻系數(shù)必須大于2,因為APB1的最大頻率只能為36MHz。如果APB1的預分頻系數(shù)=2,則因為這個倍頻器,TIM2~7仍然能夠得到72MHz的時鐘頻率。能夠使用更高的時鐘頻率,無疑提高了定時器的分辨率,這也正是設計這個倍頻器的初衷。
相信到這里,我們都可以熟悉的操作定時器的時鐘了,但是這只是其中的一個模式,也就是內(nèi)部時鐘的模式!
還有其它三種模式暫時不做討論。
3、跟著時鐘有個大概的了解之后,繼續(xù)看一個難點
所謂的帶陰影的寄存器就出來了,看到上圖那5個帶陰影的寄存器沒有,千萬別以為是印刷或者掃描的問題,下面一起來看看對這個陰影寄存器的通俗解釋:有陰影的寄存器,表示在物理上這個寄存器對應2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preloadregister(預裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadowregister(影子寄存器);正如手冊上的14.3.1節(jié)所說,根據(jù)TIMx_CR1寄存器中APRE位的設置,preloadregister的內(nèi)容可以隨時傳送到shadowregister,即兩者是連通的(permanently),或者在每一次更新事件(UEV)時才把preloadregister的內(nèi)容傳送到shadowregister !
現(xiàn)在估計是明白了這個特點了,我的理解 也就是一個復雜的自動重裝過程。
4、到這里你一定還發(fā)現(xiàn)了大寫的 U和那個小箭頭了!再看下面的分析:
表示對應寄存器的影子寄存器可以在發(fā)生更新事件時,被更新為它的preload register的內(nèi)容;而圖中UI部分,表示對應的Autoreload register可以產(chǎn)生一個更新事件(U)或更新事件中斷(UI)。
所謂的時間U ,事件中斷UI就是這么來的!
5、這樣設計的好處是什么呢?
設計preload register和shadow register的好處是,所有真正需要起作用的寄存器(shadow register)可以在同一個時間(發(fā)生更新事件時)被更新為所對應的preload register的內(nèi)容,這樣可以保證多個通道的操作能夠準確地同步。如果沒有shadow register,或者preload register和shadow register是直通的,即軟件更新preload register時,同時更新了shadow register,因為軟件不可能在一個相同的時刻同時更新多個寄存器,結果造成多個通道的時序不能同步,如果再加上其它因素(例如中斷),多個通道的時序關系有可能是不可預知的。
6、接著看左下角的定時器通道:
TM32的定時器輸入通道都有一個濾波單元,分別位于每個輸入通路上(下圖中的黃色框)和外部觸發(fā)輸入通路上(下圖中的蘭色框),它們的作用是濾除輸入信號上的高頻干擾。
具體操作如下:
在TIMx_CR1中的CKD[1:0]可以由用戶設置對輸入信號的采樣頻率基準,有三種選擇:
1)采樣頻率基準fDTS=定時器輸入頻率fCK_INT
2)采樣頻率基準fDTS=定時器輸入頻率fCK_INT/2
3)采樣頻率基準fDTS=定時器輸入頻率fCK_INT/4
然后使用上述頻率作為基準對輸入信號進行采樣,當連續(xù)采樣到N次個有效電平時,認為一次有效的輸入電平。
實際的采樣頻率和采樣次數(shù)可以由用戶程序根據(jù)需要選擇;外部觸發(fā)輸入通道的濾波參數(shù)在從模式控制寄存器(TIMx_SMCR)的ETF[3:0]中設置;每個輸入通道的濾波參數(shù)在捕獲/比較模式寄存器1(TIMx_CCMR1)或捕獲/比較模式寄存器2(TIMx_CCMR2)的IC1F[3:0]、IC2F[3:0]、IC3F[3:0]和IC4F[3:0]中設置。
注意了:注入的引腳和輸出的引腳是一樣的!,其實手冊上也有說明之前的操作!請看
例如:當fCK_INT=72MHz時,選擇fDTS=fCK_INT/2=36MHz,采樣頻率fSAMPLING=fDTS/2=18MHz且N=6,則頻率高于3MHz的信號將被這個濾波器濾除,有效地屏蔽了高于3MHz的干擾。
比如,結合輸入捕獲的中斷,可以輕松地實現(xiàn)按鍵的去抖動功能,而不需要軟件的干預;這可是由硬件實現(xiàn)的去抖動功能,大大節(jié)省了軟件的開銷和程序代碼的長度。
每個定時器最多可以實現(xiàn)4個按鍵的輸入,這個方法也可以用于鍵盤矩陣的掃描,而且因為是通過中斷實現(xiàn),軟件不需頻繁的進行掃描動作。
這段話,也是摘抄某位網(wǎng)友的,示波器學習的時候就很蛋疼,所以不是很理解!
7、最后來說說比較捕獲通道,這個可是核心的東西!
每一個捕獲/ 比較通道都是圍繞著一個捕獲/ 比較寄存器( 包含影子寄存器) ,包括捕獲的輸入部分
(數(shù)字濾波、多路復用和預分頻器),和輸出部分(比較器和輸出控制)。關于影子寄存器已經(jīng)講解的很明白了!
首先看著我用紅色圈起來的那塊,那就是一個捕獲比較通道:
異或那塊先不管他,好像跟編碼器有關,輸入有個特色就是可以把TI的輸入搞到CC1上去,也可以把T2的輸入搞到CC1上去,其實也可以把T1搞到CC1上去同時把T1搞到CC2上去,這樣就有了后來的PWM輸入。輸出上的特色是不直接輸出,而是有個OC1REF,這樣可以定義高有效還是低有效,輸出自己需要的有效電平!
以上只是定時器