STM32之定时器原理
高級定時器(TIM1、TIM8);通用定時器(TIM2、TIM3、TIM4、TIM5);基本定時器(TIM6、TIM7)。
他們之間的區別情況見下表:
| 定時器種類 | 位數 | 計數器模式 | 發出DMA請求 | 捕獲/比較通道個數 | 互補輸出 | 特殊應用場景 |
| 高級定時器 | 16 | 向上、向下、向上/下 | 可以 | 4 | 有 | 帶死區控制盒緊急剎車,可應用于PW M電機控制 |
| 通用定時器 | 16 | 向上、向下、向上/下 | 可以 | 4 | 無 | 通用。定時計數,PWM輸出,輸入捕獲 ,輸出比較 |
| 基本定時器 | 16 | 向上、向下、向上/下 | 可以 | 0 | 無 | 主要應用于驅動DAC |
?
STM32的通用定時器
?
通用定時器功能特點描述
STM32的通用定時器是由一個可編程預分頻器(PSC)驅動的16位自動重裝載計數器(CNT)構成,可用于測量輸入脈沖長度(輸入捕獲)或者產生輸出波形(輸出比較和PWM)等。
STM3 的通用TIMx(TIM2、TIM3、TIM4 和 TIM5)定時器功能特點包括:
- 位于低速的APB1總線上(注意:高級定時器是在高速的APB2總線上);
- 16位向上、向下、向上/向下(中心對齊)計數模式,自動裝載計數器(TIMx_CNT);
- 16位可編程(可以實時修改)預分頻器(TIMx_PSC),計數器時鐘頻率的分頻系數 為 1~65535 之間的任意數值;
- 4 個獨立通道(TIMx_CH1~4),這些通道可以用來作為:
- 可使用外部信號(TIMx_ETR)控制定時器和定時器互連(可以用 1 個定時器控制另外一個定時器)的同步電路。
- 如下事件發生時產生中斷/DMA(6個獨立的IRQ/DMA請求生成器):?
STM32 的通用定時器可以被用于:測量輸入信號的脈沖長度(輸入捕獲)或者產生輸出波形(輸出比較和 PWM)等。? ?
使用定時器預分頻器和 RCC 時鐘控制器預分頻器,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調整。STM32 的每個通用定時器都是完全獨立的,沒有互相共享的任何資源。
計數器模式
通用定時器可以向上計數、向下計數、向上向下雙向計數模式。
- 向上計數模式:計數器從0計數到自動加載值(TIMx_ARR),然后重新從0開始計數并且產生一個計數器溢出事件。
- 向下計數模式:計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然后從自動裝入的值重新開始,并產生一個計數器向下溢出事件。
- 中央對齊模式(向上/向下計數):計數器從0開始計數到自動裝入的值-1,產生一個計數器溢出事件,然后向下計數到1并且產生一個計數器溢出事件;然后再從0開始重新計數。
簡單地理解三種計數模式,可以通過下面的圖形:
?
通用定時器工作流程
對于這個定時器框圖,分成四部分來講:最頂上的一部分(計數時鐘的選擇)、中間部分(時基單元)、左下部分(輸入捕獲)、右下部分(PWM輸出)。這里主要介紹一下前兩個,后兩者的內容會在后面的文章中講解到。
計數時鐘的選擇
計數器時鐘可由下列時鐘源提供:
- 內部時鐘(TIMx_CLK)?
- 外部時鐘模式1:外部捕捉比較引腳(TIx)
- 外部時鐘模式2:外部引腳輸入(TIMx_ETR)
- 內部觸發輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1而作為另一個定時器Timer2的預分頻器。
內部時鐘源
從圖中可以看出:由AHB時鐘經過APB1預分頻系數轉至APB1時鐘,再通過某個規定轉至TIMxCLK時鐘(即內部時鐘CK_INT、CK_PSC)。最終經過PSC預分頻系數轉至CK_CNT。
那么APB1時鐘怎么轉至TIMxCLK時鐘呢?除非APB1的分頻系數是1,否則通用定時器的時鐘等于APB1時鐘的2倍。
例如:默認調用SystemInit函數情況下:SYSCLK=72M、AHB時鐘=72M、APB1時鐘=36M,所以APB1的分頻系數=AHB/APB1時鐘=2。所以,通用定時器時鐘CK_INT=2*36M=72M。最終經過PSC預分頻系數轉至CK_CNT。
時基單元
時基單元包含:計數器寄存器(TIMx_CNT)、預分頻器寄存器(TIMx_PSC)、自動裝載寄存器(TIMx_ARR)三部分。
對不同的預分頻系數,計數器的時序圖為:
計數模式
此時,再來結合時鐘的時序圖和時基單元,分析一下各個計數模式:
向上計數模式
向下計數模式
中央對齊模式
?
通用定時器相關配置寄存器
計數器當前值寄存器(TIMx_CNT)
作用:存放計數器的當前值。
預分頻寄存器(TIMx_PSC)
作用:對CK_PSC進行預分頻。此時需要注意:CK_CNT計算的時候,預分頻系數要+1。
自動重裝載寄存器(TIMx_ARR)
作用:包含將要被傳送至實際的自動重裝載寄存器的數值。
注意:該寄存器在物理上實際上對應著2個寄存器。一個是我們直接操作的,另一個是我們看不到的,這個看不到的寄存器叫做影子寄存器。實際上真正起作用的是影子寄存器。根據TIMx_CR1位的APRE位的設置,APRE=0時,預裝載寄存器的內容就可以隨時傳送到影子寄存器,此時兩者是互通的;APRE=1時,在每一次更新事件時,才將預裝在寄存器的內容傳送至影子寄存器。
控制寄存器(TIMx_CR1)
作用:對計數器的計數方式、使能位等進行設置。
這里有ARPE位:自動重裝載預裝載允許位。ARPE=0時,TIMx_ARR寄存器沒有緩沖;ARPE=1時,TIMx_ARR寄存器被裝入緩沖器。
DMA/中斷使能寄存器(TIMx_DIER)
作用:對DMA/中斷使能進行配置。
?
通用定時器超時時間
超出(溢出)時間計算:
Tout=(ARR+1)(PSC+1)/TIMxCLK
其中:Tout的單位為us,TIMxCLK的單位為MHz。
這里需要注意的是:PSC預分頻系數需要加1,同時自動重加載值也需要加1。
- 為什么自動重加載值需要加1,因為從ARR到0之間的數字是ARR+1個;
- 為什么預分頻系數需要加1,因為為了避免預分頻系數不設置的時候取0的情況,使之從1開始。
這里需要和之前的預分頻進行區分:由于通用定時器的預分頻系數為1~65535之間的任意數值,為了從1開始,所以當預分頻系數寄存器為0的時候,代表的預分頻系數為1。而之前的那些預分頻系數都是固定的幾個值,比如1、4、8、16、32、64等等,而且可能0x000代表1,0x001代表4,0x010代表8等等。也就是說,一邊是隨意的定義(要從1開始),另一邊是宏定義了某些值(只有特定的一些值)。
比如,想要設置超出時間為500ms,并配置中斷,TIMxCLK按照系統默認初始化來(即72MHz),PSC取7199,由此可以計算出ARR為4999。
也就是說,在內部時鐘TIMxCLK為72MHz,預分頻系數為7199的時候,從4999遞減至0的事件是500ms。
總結
以上是生活随笔為你收集整理的STM32之定时器原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeRTOS任务挂起与解除
- 下一篇: NAT协议