19. 通用定時器

星光樱梦發表於2024-03-25

一、通用定時器簡介

  STM32F407 有 10 個通用定時器(TIM2 ~ TIM5 和 TIM9 ~ TIM14)。這些定時器彼此完全獨立,不共享任何資源。其主要特性如下:16 位遞增、遞減、中心對齊計數器(計數值:0 ~ 65535),16 位可程式設計預分頻器(預分頻係數:1 ~ 65536),用於對計數器時脈頻率進行分頻,還可以觸發 DAC、ADC的同步電路,以及在更新事件、觸發事件、輸入捕獲、輸出比較時,會生成中斷/DMA 請求。它有 4 個獨立通道,可用於:輸入捕獲、輸出比較、輸出 PWM 、單脈衝模式等。可以使用外部訊號控制定時器且可以實現多個定時器互連的同步電路。它支援編碼器和霍爾感測器電路等。

定時器基本特性表

  STM32 晶片的計數器大多數都是 16 位的。通用定時器和高階定時器其實也就是在基本定時器的基礎上,新增了一些其他功能,如:輸入捕獲、輸出比較、輸出 PWM 和單脈衝模式等。而通用定時器數量較多,其特性也有一些的差異,但是基本原理都一樣。

二、通用定時器框圖

通用定時器框圖

①、時鐘源

  通用定時器時鐘可以選擇下面四類時鐘源之一:

  • 內部時鐘(CK_INT)
  • 外部時鐘模式 1:外部輸入引腳(TIx),x=1,2(即只能來自於通道 1 或者通道 2)
  • 外部時鐘模式 2:外部觸發輸入(ETR)
  • 內部觸發輸入(ITRx):使用一個定時器作為另一定時器的預分頻器

  通用定時器時鐘源的設定方法如下表所示:

通用定時器時鐘源設定方法

  【1】、內部時鐘(CK_INT)

  STM32F4 系列的定時器 TIM2 ~ TIM7、TIM12 ~ TIM14 都是掛載在 APB1 匯流排上,這些定時器的內部時鐘(CK_INT)實際上來自於 APB1 匯流排提供的時鐘。但是這些定時器時鐘不是由 APB1 匯流排直接提供,而是要先經過一個倍頻器。在,系統時鐘初始化函式 System_Clock_Init() 已經設定 APB1 匯流排時脈頻率為 42MHz,APB1 預分頻器的預分頻係數為 2,所以這些定時器時鐘源頻率為 84MHz。因為當 APB1 預分頻器的預分頻係數≥2 分頻時,掛載在 APB1 匯流排上的定時器時脈頻率是該匯流排時脈頻率的兩倍。

  APB2 匯流排上掛載的通用定時器 TIM9 ~ TIM11,掛載的匯流排變成了 APB2,在系統時鐘初始化函式 System_Clock_Init() 已經設定 APB2 匯流排時脈頻率為 84MHz,預分頻器的預分頻係數為 2,所以上述的定時器時鐘源頻率為 168MHz。

  【2】、外部時鐘模式 1(TI1、TI2)

  外部時鐘模式 1 這類時鐘源,顧名思義時鐘訊號來自晶片外部。時鐘源進入定時器的流程如下:外部時鐘源訊號 → IO → TIMx_CH1(或者 TIMx_CH2),這裡需要注意的是:外部時鐘模式 1 下,時鐘源訊號只能從 CH1 或者 CH2 輸入到定時器,CH3 和 CH4 都是不可以的。從 IO 到 TIMx_CH1(或者 TIMx_CH2),就需要我們配置 IO 的複用功能,才能使 IO 和定時器通道相連通。

外部時鐘模式1框圖

  時鐘源訊號 TI2 到達 CH2 後,來到定時器內部,TI2 首先經過一個濾波器,由 ICF[3:0]位來設定濾波方式,也可以設定不使用濾波器。接著經過邊沿檢測器,由 CC2P 位來設定檢測的邊沿,可以上升沿或者下降沿檢測。然後經過觸發輸入選擇器,由 TS[4:0] 位來選擇 TRGI(觸發輸入訊號)的來源。

  可以看到圖中框出了 TI1F_ED、TI1FP1 和 TI2FP2 三個觸發輸入訊號(TRGI)。TI1F_ED 表示來自於 CH1,並且沒有經過邊沿檢測器過濾的訊號,所以它是 CH1 的雙邊沿訊號,即上升沿或者下降沿都是有效的。TI1FP1 表示來自 CH1 並經過邊沿檢測器後的訊號,可以是上升沿或者下降沿。TI2FP2 表示來自 CH2 並經過邊沿檢測器後的訊號,可以是上升沿或者下降沿。這裡以 CH2 為例,那隻能選擇 TI2FP2。如果是 CH1 為例,那就可以選擇 TI1F_ED 或者 TI1FP1。

  最後經過從模式選擇器,由 ECE 位和 SMS[2:0] 位來選擇定時器的時鐘源。這裡我們介紹的是外部時鐘模式 1,所以 ECE 位置 0,SMS[2:0]=111 即可。CK_PSC 需要經過定時器的預分頻器分頻後,最終就能到達計數器進行計數了。

  【3】、外部時鐘模式 2(ETR)

  外部時鐘模式 2,時鐘訊號來自晶片外部。時鐘源進入定時器的流程如下:外部時鐘源訊號 → IO → TIMx_ETR。從 IO 到 TIMx_ETR,就需要我們配置 IO 的複用功能,才能使 IO 和定時器相連通。

外部時鐘模式2框圖

  定時器時鐘訊號首先從 ETR 引腳進來。接著經過外部觸發極性選擇器,由 ETP 位來設定上升沿有效還是下降沿有效,選擇下降沿有效的話,訊號會經過反相器。然後經過外部觸發預分頻器,由 ETPS[1:0] 位來設定預分頻係數,係數範圍:1、2、4、8。緊接著經過濾波器器,由 ETF[3:0] 位來設定濾波方式,也可以設定不使用濾波器。\(f_{DTS}\) 由 TIMx_CR1 暫存器的 CKD 位設定。最後經過從模式選擇器,由 ECE 位和 SMS[2:0]位來選擇定時器的時鐘源。這裡我們介紹的是外部時鐘模式 2,直接把 ECE 位置 1 即可。CK_PSC 需要經過定時器的預分頻器分頻後,最終就能到達計數器進行計數了。

  【4】、內部觸發輸入(ITRx)

  內部觸發輸入是使用一個定時器作為另一個定時器的預分頻器,即實現定時器的級聯。

TIM1作為TIM2的預分頻器框圖

  上圖中,TIM1 作為 TIM2 的預分頻器,需要完成的配置步驟如下:

  1. TIM1_CR2 暫存器的 MMS[2:0] 位設定為 010,即 TIM1 的主模式選擇為更新(選擇更新事件作為觸發輸出 (TRGO))。
  2. TIM2_SMCR 暫存器的 TS[2:0]位設定為 000,即使用 ITR1 作為內部觸發。TS[2:0] 位用於配置觸發選擇

  除了 ITR1,還有其他的選擇,詳細描述如下圖所示:

觸發選擇

TIMx內部觸發連線

②、控制器

  控制器包括:從模式控制器編碼器介面和觸發控制器(TRGO)。從模式控制器可以控制計數器復位、啟動、遞增/遞減、計數。編碼器介面針對編碼器計數。觸發控制器用來提供觸發訊號給別的外設,比如為其它定時器提供時鐘或者為 DAC/ADC 的觸發轉換提供訊號。

③、時基單元

  時基單元包括:計數器暫存器(TIMx_CNT)、預分頻器暫存器(TIMx_PSC)、自動過載暫存器(TIMx_ARR) 。這部分內容和基本定時器基本一樣的。

  不同點是:通用定時器的計數模式有三種:遞增計數模式遞減計數模式中心對齊模式

更新事件發生條件

  遞增計數模式可以參考基本定時器篇章。

  遞減計數模式 就是來了一個計數脈衝,計數器就減 1,直到計數器暫存器的值減到 0,減到 0 時定時器溢位,由於是遞減計數,故而稱為 定時器下溢,定時器溢位就會伴隨著更新事件的發生。然後計數器又從自動過載暫存器影子暫存器的值開始繼續遞減計數,如此迴圈。

  最後是 中心對齊模式,該模式下,計數器先從 0 開始遞增計數,直到計數器的值等於自動過載暫存器影子暫存器的值減 1 時,定時器上溢,同時生成更新事件,然後從自動過載暫存器影子暫存器的值開始遞減計算,直到計數值等於 1 時,定時器下溢,同時生成更新事件,然後又從 0 開始遞增計數,依此迴圈。每次定時器上溢或下溢都會生成更新事件。計數器的計數模式的設定請參考 TIMx_CR1 暫存器的位 CMS 和位 DIR。

④、輸入捕獲

  輸入捕獲,一般應用是要和第 ⑤ 部分一起完成測量功能。TIMx_CH1 ~ TIMx_CH4 表示定時器的 4 個通道,這 4 個通道都是可以獨立工作的。IO 埠透過複用功能與這些通道相連。配置好 IO 埠的複用功能後,將需要測量的訊號輸入到相應的 IO 埠,輸入捕獲部分可以對輸入的訊號的上升沿,下降沿或者雙邊沿進行捕獲,常見的測量有:測量輸入訊號的脈衝寬度、測量 PWM 輸入訊號的頻率和佔空比等。

  測量高電平脈衝寬度的工作原理:一般先要設定輸入捕獲的邊沿檢測極性,如:我們設定上升沿檢測,那麼當檢測到上升沿時,定時器會把計數器 CNT 的值鎖存到相應的捕獲/比較暫存器 TIMx_CCRy 裡,y=1~4。然後我們再設定邊沿檢測為下降沿檢測,當檢測到下降沿時,定時器會把計數器 CNT 的值再次鎖存到相應的捕獲/比較暫存器 TIMx_CCRy 裡。最後,我們將前後兩次鎖存的 CNT 的值相減,就可以算出高電平脈衝期間內計數器的計數個數,再根據定時器的計數頻率就可以計算出這個高電平脈衝的時間。如果要測量的高電平脈寬時間長度超過定時器的溢位時間週期,就會發生溢位,這時候我們還需要做定時器溢位的額外處理。低電平脈衝捕獲同理。

通道1輸入階段

  待測量訊號 TI1 到達 TIMx_CH1 後,TI1 首先經過一個濾波器,由 ICF[3:0] 位來設定濾波方式,也可以設定不使用濾波器。fDTS 由 TIMx_CR1 暫存器的 CKD 位設定。接著經過邊沿檢測器,由 CC1P 位來設定檢測的邊沿,可以上升沿或者下降沿檢測。(CC1NP 是配置互補通道的邊沿檢測的,在高階定時器才有,通用定時器沒有。)然後經過輸入捕獲對映選擇器,由 CC1S[1:0] 位來選擇把 IC1 對映到 TI1、TI2 還是 TRC。這裡我們的待測量訊號從通道 1 進來,所以選擇 IC1 對映到 TI1 上即可。緊接著經過輸入捕獲 1 預分頻器,由 ICPS[1:0] 位來設定預分頻係數,範圍:1、2、4、8。最後需要把 CC1E 位置 1,使能輸入捕獲,IC1PS 就是分頻後的捕獲訊號。

捕獲比較通道1主電路之輸入捕獲功能部分

  首先看到捕獲/比較預裝載暫存器,我們以通道 1 為例,那麼它就是 CCR1 暫存器,通道 2、通道 3、通道 4 就分別對應 CCR2、CCR3、CCR4。在圖中就可以看到 CCR1 ~ 4 是有影子暫存器的,該暫存器不可直接訪問。

  圖左下角的 CC1G 位可以產生軟體捕獲事件,那麼硬體捕獲事件如何產生的?這裡我們還是以通道 1 輸入為例,CC1S[1:0] = 01,即 IC1 對映到 TI1 上;CC1E 位置 1,使能輸入捕獲;比如不濾波、不分頻,ICF[3:0] = 00,ICPS[1:0] = 00;比如檢測上升沿,CC1P 位置 0;接著就是等待測量訊號的上升沿到來。當上升沿到來時,IC1PS 訊號就會觸發輸入捕獲事件發生,計數器的值就會被鎖存到捕獲/比較影子暫存器裡。當 CCR1 暫存器沒有被進行讀操作的時候,捕獲/比較影子暫存器裡的值就會鎖存到 CCR1 暫存器中,那麼程式設計師就可以讀取 CCR1 暫存器,得到計數器的計數值。檢測下降沿同理。

⑤、輸入捕獲和輸出比較公用部分

  該部分需要結合第 ④ 部分或者第 ⑥ 部分共同完成相應功能。

⑥、輸出比較

  圖中的第 ⑥ 部分是輸出比較,一般應用是要和第 ⑤ 部分一起完成定時器輸出功能。TIMx_CH1 ~ TIMx_CH4 表示定時器的 4 個通道,這 4 個通道都是可以獨立工作的。IO 埠透過複用功能與這些通道相連。

捕獲比較通道1主電路之輸出比較功能部分

  首先程式設計師寫 CCR1 暫存器,即寫入比較值。這個比較值需要轉移到對應的捕獲/比較影子暫存器後才會真正生效。什麼條件下才能轉移?圖中可以看到 compare_transfer 旁邊的與門,需要滿足三個條件:CCR1 不在寫入操作期間、CC1S[1:0] = 0 配置為輸出、OC1PE 位置 0(或者 OC1PE 位置 1,並且需要發生更新事件,這個更新事件可以軟體產生或者硬體產生)。當 CCR1 暫存器的值轉移到其影子暫存器後,新的值就會和計數器的值進行比較,它們的比較結果將會透過第⑥部分影響定時器的輸出。

通道1輸出階段

  上圖中,可以看到輸出模式控制器,由 OC1M[2:0]位配置輸出比較模式。F4 系列有 8 種輸出比較模式之多。oc1ref 是輸出參考訊號,高電平有效,為高電平時稱之為有效電平,為低電平時稱之為無效電平。它的高低電平受到三個方面的影響:OC1M[3:0]位配置的輸出比較模式、第 ⑤ 部分比較器的比較結果、還有就是 OC1CE 位配置的 ETRF 訊號。ETRF 訊號可以將 oc1ref 電平強制清零,該訊號來自 IO 外部。

  一般來說,當計數器的值和捕獲/比較暫存器的值相等時,輸出參考訊號 oc1ref 的極性就會根據我們選擇的輸出比較模式而改變。如果開啟了比較中斷,還會發生比較中斷。

  • CC1P 位用於選擇通道輸出極性。
  • CC1E 位置 1 使能通道輸出。
  • OC1 訊號就會從 TIMx_CH1 輸出到 IO 埠,再到 IO 外部。

三、通用定時器常用暫存器

3.1、TIMx控制暫存器

TIMx控制暫存器1

  TIMx_CR1 暫存器位 7(ARPE)用於控制自動過載暫存器是否進行緩衝,如果 ARPE 位置 1,ARR 起緩衝作用,即只有在更新事件發生時才會把 ARR 的值寫入其影子暫存器裡;如果 ARPE 位置 0,那麼修改自動過載暫存器的值時,該值會馬上被寫入其影子暫存器中,從而立即生效。

  TIMx_CR1 暫存器 CMS[6:5] 位,用於設定邊沿對齊模式還是中心對齊模式。當 CMS[1:0] 位設定為 00 時,為邊沿對齊模式,其它值為中心對齊模式。

  TIMx_CR1 暫存器位 4 DIR 位,用於控制定時器的計數方向。設定 DIR 位為 0 時,為遞增計數。設定 DIR 位為 1 時,為遞減計數。當定時器配置為中心對齊模式或編碼器模式時,該位為只讀狀態。

  TIMx_CR1 暫存器位 0 CEN 位,用於使能計數器的工作,必須要設定該位為 1,計數器才會開始計數。

TIMx控制暫存器2

3.2、TIMx從模式控制暫存器

TIMx從模式控制暫存器

  該暫存器的 SMS[2:0]位,用於從模式選擇,其實就是選擇計數器輸入時鐘的來源。比如通用定時器中斷例程中我們設定 SMS[2:0]=000,禁止從模式,這樣 PSC 預分頻器的時鐘就直接來自內部時鐘(CK_INT),按照我們例程 System_Clock_Init() 函式的配置,頻率為 84Mhz(APB1 匯流排時脈頻率的 2 倍)。

3.3、TIMx DMA中斷/使能暫存器

TIMx DMA/中斷使能暫存器

  該暫存器用於使能/失能觸發 DMA 請求、捕獲/比較中斷以及更新中斷。如果我們要使用更新中斷,所以把位 0(UIE)置 1 即可。

3.4、TIMx狀態暫存器

TIMx狀態暫存器

  該暫存器都是一些中斷標誌位,比如更新中斷標誌位、捕獲/比較中斷標誌位等。在通用定時器中斷例程中我們用到更新中斷標誌位,當定時器更新中斷到來後,位 0(UIF)會由硬體置 1,我們需要在中斷服務函式里面把該位清零。

3.5、TIMx事件生成暫存器

TIMx事件生成暫存器

  該暫存器作用是讓使用者用軟體方式產生各類事件。UG 位是更新事件的控制位,作用和定時器溢位時產生的更新事件一樣,區別是這裡是透過軟體產生的,而定時器溢位是硬體自己完成的。只有開啟了更新中斷,這兩種方式都可以產更新中斷。

3.6、TIMx捕獲/比較模式暫存器

TIMx捕獲/比較模式暫存器1

  該暫存器的有些位在不同模式下,功能不一樣。比如我們要讓 TIM14 的 CH1 輸出 PWM 波為例進行介紹,該暫存器的模式設定位 OC1M[2:0] 就是對應著通道 1 的模式設定,此部分由 3 位組成。總共可以配置成 8 種模式,我們使用的是 PWM 模式,所以這 3 位必須設定為 110 或者 111,分別對應 PWM 模式 1 和 PWM 模式 2。這兩種 PWM 模式的區別就是輸出有效電平的極性相反。

TIMx捕獲/比較模式暫存器2

3.7、TIMx捕獲/比較使能暫存器

TIMx捕獲比較使能暫存器

  該暫存器控制著各個輸入輸出通道的開關和極性。如果我們想讓要讓 TIM14 的 CH1 輸出 PWM 波,這裡我們要使能 CC1E 位,該位是通道 1 輸入/輸出使能位,要想 PWM 從 IO 口輸出,這個位必須設定為 1。CC1P 位是設定通道 1 的輸出極性。

3.8、TIMx計數器

TIMx計數器

  TIM2/TIM5 的計數暫存器是 32 位的,TIM3/TIM4 的計數暫存器都是 16 位有效的,計數模式可以是遞增計數模式、遞減計數模式和中心對齊計數模式。其他定時器和基本定時器一樣,可以直接寫該暫存器設定計數的初始值,也可以讀取該暫存器獲取計數器值。

3.9、TIMx預分頻器

TIMx預分頻器

  定時器的預分頻暫存器都是 16 位的,即寫入該暫存器的數值範圍是 0 到 65535,表示 1 到 65536 分頻。比如我們要 8400 分頻,就往該暫存器寫入 8399。

3.10、TIMx自動過載暫存器

TIMx自動過載暫存器

  在 F4 系列中,TIM2 和 TIM5 的自動重灌載暫存器是 32 位的,其他通用定時器自動過載暫存器是低 16 位有效。該暫存器可以由 APRE 位設定是否進行緩衝。計數器的值會和自動重灌暫存器影子暫存器進行比較,當兩者相等,定時器就會溢位,從而發生更新事件,如果開啟了更新中斷,還會發生更新中斷。

3.11、TIMx捕獲/比較暫存器

TIMx捕獲/比較暫存器1

  捕獲/比較暫存器(TIMx_CCR1),該暫存器只有 1 個,對應通道 CH1。我們使用的是通道 1。在輸出模式下,捕獲/比較暫存器影子暫存器的值與 CNT 的值比較,根據比較結果產生相應動作,利用這點,我們透過修改這個暫存器的值,就可以控制 PWM 的佔空比了。

TIMx捕獲/比較暫存器2

TIMx捕獲/比較暫存器3

TIMx捕獲/比較暫存器4

四、通用定時器對應通道引腳

【1】、TIM2 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PA0 PA5/PA15
Channel 2 PA1 PB3
Channel 3 PA2 PB10
Channel 4 PA3 PB11

【2】、TIM3 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PA6 PC6/PB4
Channel 2 PA7 PC7/PB5
Channel 3 PB0 PC8
Channel 4 PB1 PC9

【3】、TIM4 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PD12 PB6
Channel 2 PD13 PB7
Channel 3 PD14 PB8
Channel 4 PD15 PB9

【4】、TIM5 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PA0
Channel 2 PA1
Channel 3 PA2
Channel 4 PA3

【5】、TIM9 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PE5 PA2
Channel 2 PE6 PA3

【6】、TIM10 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PF6 PB8

【7】、TIM11 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PF7 PB9

【8】、TIM12 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PB14
Channel 2 PB15

【9】、TIM13 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PF8 PA6

【10】、TIM14 對應通道引腳及其重對映

通道名 通道引腳 重對映通道引腳
Channel 1 PF9 PA7

相關文章