1. 程式人生 > 其它 >stm32定時器

stm32定時器

STM32F4 的通用定時器包含一個 16 位或 32 位自動過載計數器(CNT),該計數器由可程式設計預分頻器(PSC) 驅動。 STM32F4 的通用定時器可以被用於:測量輸入訊號的脈衝長度(輸入
捕獲)或者產生輸出波形(輸出比較和 PWM)等。 使用定時器預分頻器和 RCC 時鐘控制器預分頻器,脈衝長度和波形週期可以在幾個微秒到幾個毫秒間調整。 STM32F4 的每個通用定時器都
是完全獨立的,沒有互相共享的任何資源。

STM3 的通用 TIMx (TIM2~TIM5 TIM9~TIM14)定時器功能包括:

1)16 /32 (TIM2 TIM5)向上、向下、向上/向下自動裝載計數器(TIMx_CNT),注意: TIM9~TIM14 只支援向上(遞增)計數方式。
2)16 位可程式設計(可以實時修改)預分頻器(TIMx_PSC),計數器時鐘頻率的分頻係數為 165535 之間的任意數值。
34 個獨立通道(TIMx_CH1~4TIM9~TIM14 最多 2 個通道),這些通道可以用來作為:
A.輸入捕獲
B.輸出比較
CPWM 生成(邊緣或中間對齊模式) ,注意: TIM9~TIM14 不支援中間對齊模式
D.單脈衝模式輸出
4)可使用外部訊號(TIMx_ETR)控制定時器和定時器互連(可以用 1 個定時器控制另外一個定時器)的同步電路。
5)如下事件發生時產生中斷/DMATIM9~TIM14 不支援 DMA):
A.更新:計數器向上溢位/向下溢位,計數器初始化(通過軟體或者內部/外部觸發)
B.觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)
C.輸入捕獲
D.輸出比較
E.支援針對定位的增量(正交)編碼器和霍爾感測器電路(TIM9~TIM14 不支援)
F.觸發輸入作為外部時鐘或者按週期的電流管理(TIM9~TIM14 不支援)

下面我們介紹一下與我們這章的實驗密切相關的幾個通用定時器的暫存器(以下均以 TIM2~TIM5 的暫存器介紹, TIM9~TIM14 的略有區別,具體請看《STM32F4xx 中文參考手冊》 對應章節)。

這裡,定時器的時鐘來源有 4 個:
1) 內部時鐘(CK_INT
2) 外部時鐘模式 1:外部輸入腳(TIx
3) 外部時鐘模式 2:外部觸發輸入(ETR),僅適用於 TIM2TIM3TIM4
4) 內部觸發輸入(ITRx):使用 A 定時器作為 B 定時器的預分頻器(A B 提供時鐘)。
這些時鐘,具體選擇哪個可以通過 TIMx_SMCR 暫存器的相關位來設定。這裡的 CK_INT時鐘是從 APB1 倍頻的來的,除非 APB1 的時鐘分頻數設定為 1(一般都不會是 1),否則通用
定時器 TIMx 的時鐘是 APB1 時鐘的 2 倍,當 APB1 的時鐘不分頻的時候,通用定時器 TIMx的時鐘就等於 APB1 的時鐘。這裡還要注意的就是高階定時器以及 TIM9~TIM11 的時鐘不是來
APB1,而是來自 APB2 的。

這裡順帶介紹一下 TIMx_CNT 暫存器,該暫存器是定時器的計數器,該暫存器儲存了當前定時器的計數值。

接著我們介紹自動重灌載暫存器(TIMx_ARR),該暫存器在物理上實際對應著 2 個暫存器。一個是程式設計師可以直接操作的,另外一個是程式設計師看不到的,這個看不到的暫存器在
STM32F4xx 中文參考手冊》裡面被叫做影子暫存器。事實上真正起作用的是影子暫存器。 根據 TIMx_CR1 暫存器中 APRE 位的設定: APRE=0 時,預裝載暫存器的內容可以隨時傳送到影
子暫存器,此時 2 者是連通的;而 APRE=1 時,在每一次更新事件(UEV)時,才把預裝載暫存器(ARR) 的內容傳送到影子暫存器。

最後,我們要介紹的暫存器是:狀態暫存器(TIMx_SR)。該暫存器用來標記當前與定時器相關的各種事件/中斷是否發生。該暫存器的各位描述如圖 13.1.5 所示:

***************************************************************定時器中斷

1TIM3 時鐘使能。
這裡我們通過 APB1ENR 的第 1 位來設定 TIM3 的時鐘,因為 Stm32_Clock_Init 函式裡面把APB1的分頻設定為4了,所以我們的TIM3時鐘就是APB1時鐘的2倍,等於系統時鐘(84M)。
2) 設定 TIM3_ARR TIM3_PSC 的值。
通過這兩個暫存器,我們來設定自動重灌的值,以及分頻係數。這兩個引數加上時鐘頻率就決定了定時器的溢位時間。
3) 設定 TIM3_DIER 允許更新中斷。因為我們要使用 TIM3 的更新中斷,所以設定 DIER UIE 位為 1,使能更新中斷。
4) 允許 TIM3 工作。
光配置好定時器還不行,沒有開啟定時器,照樣不能用。我們在配置完後要開啟定時器,通過 TIM3_CR1 CEN 位來設定。
5TIM3 中斷分組設定。
在定時器配置完了之後,因為要產生中斷,必不可少的要設定 NVIC 相關暫存器,以使能TIM3 中斷。
6) 編寫中斷服務函式。
在最後,還是要編寫定時器中斷服務函式,通過該函式來處理定時器產生的相關中斷。在中斷產生後,通過狀態暫存器的值來判斷此次產生的中斷屬於什麼型別。然後執行相關的操作,
我們這裡使用的是更新(溢位)中斷,所以在狀態暫存器 SR 的最低位。在處理完中斷之後應該向 TIM3_SR 的最低位寫 0,來清除該中斷標誌。
通過以上幾個步驟,我們就可以達到我們的目的了,使用通用定時器的更新中斷,來控制DS1 的亮滅。