STM32的通用定時器TIMx系統(tǒng)了解
通用定時器(TIMx)
一、TIMx簡介
二、TIMx主要功能
三、TIMx功能描述
3.1 時基單元
3.2 計數(shù)器模式
3.3 時鐘選擇
3.4捕獲/比較通道
3.5 輸入捕獲模式
3.6 PWM輸入模式
3.7 強置輸出模式
3.8 輸出比較模式
3.9 PWM模式
3.10單脈沖模式
四、簡單例子理解TIMx
4.1 使得PB5-TIM3通道2產(chǎn)生頻率為12.5Hz的方波,該方波控制LED1的閃爍
4.2周期控制通用定時器3的2通道,實現(xiàn)1KHz的不同占空比波形,控制LED實現(xiàn)呼吸燈
本文涉及鏈接
一、TIMx簡介
通用定時器是一個通過可編程預(yù)分頻器驅(qū)動的16位自動裝載計數(shù)器構(gòu)成。它適用于多種場合,包括測量輸入信號的脈沖長度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)。使用定時器預(yù)分頻器和RCC時鐘控制器預(yù)分頻器,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調(diào)整。每個定時器都是完全獨立的,沒有互相共享任何資源。它們可以一起同步操作。[正版請搜索:beautifulzzzz(看樓主博客園官方博客,享高質(zhì)量生活)嘻嘻?。。
二、TIMx主要功能
通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定時器功能包括:
●16位向上、向下、向上/向下自動裝載計數(shù)器
● 16位可編程(可以實時修改)預(yù)分頻器,計數(shù)器時鐘頻率的分頻系數(shù)為1 ~65536之間的任意數(shù)值
● 4個獨立通道:
─ 輸入捕獲
─ 輸出比較
─ PWM生成(邊緣或中間對齊模式)
─ 單脈沖模式輸出
● 使用外部信號控制定時器和定時器互連的同步電路
● 如下事件發(fā)生時產(chǎn)生中斷/DMA:
─ 更新:計數(shù)器向上溢出/向下溢出,計數(shù)器初始化(通過軟件或者內(nèi)部/外部觸發(fā))
─ 觸發(fā)事件(計數(shù)器啟動、停止、初始化或者由內(nèi)部/外部觸發(fā)計數(shù))
─ 輸入捕獲
─ 輸出比較
● 支持針對定位的增量(正交)編碼器和霍爾傳感器電路
● 觸發(fā)輸入作為外部時鐘或者按周期的電流管理
圖1 通用定時器框圖
注:Reg:根據(jù)控制位的設(shè)定,在U事件時傳送預(yù)加載寄存器的內(nèi)容至工作寄存器
斜向下的箭頭:事件
斜向上的箭頭:中斷和DMA輸出
三、TIMx功能描述
3.1 時基單元
可編程通用定時器的主要部分是一個16位計數(shù)器和與其相關(guān)的自動裝載寄存器。這個計數(shù)器可以向上計數(shù)、向下計數(shù)或者向上向下雙向計數(shù)。此計數(shù)器時鐘由預(yù)分頻器分頻得到。計數(shù)器、自動裝載寄存器和預(yù)分頻器寄存器可以由軟件讀寫,在計數(shù)器運行時仍可以讀寫。
時基單元包含:
● 計數(shù)器寄存器(TIMx_CNT)
● 預(yù)分頻器寄存器 (TIMx_PSC)
● 自動裝載寄存器 (TIMx_ARR)
自動裝載寄存器是預(yù)先裝載的,寫或讀自動重裝載寄存器將訪問預(yù)裝載寄存器。根據(jù)在TIMx_CR1 寄存器中的自動裝載預(yù)裝載使能位(ARPE)的設(shè)置,預(yù)裝載寄存器的內(nèi)容被立即或在每次的更新事件UEV時傳送到影子寄存器。當(dāng)計數(shù)器達到溢出條件(向下計數(shù)時的下溢條件)并當(dāng)TIMx_CR1 寄存器中的UDIS位等于’0’時,產(chǎn)生更新事件。更新事件也可以由軟件產(chǎn)生。隨后會詳細描述每一種配置下更新事件的產(chǎn)生。
計數(shù)器由預(yù)分頻器的時鐘輸出CK_CNT驅(qū)動,僅當(dāng)設(shè)置了計數(shù)器TIMx_CR1 寄存器中的計數(shù)器使能位(CEN)時, CK_CNT才有效。
注:真正的計數(shù)器使能信號CNT_EN是在CEN的一個時鐘周期后被設(shè)置。
預(yù)分頻器可以將計數(shù)器的時鐘頻率按1 到65536之間的任意值分頻。它是基于一個(在TIMx_PSC寄存器中的)16位寄存器控制的16位計數(shù)器。這個控制寄存器帶有緩沖器,它能夠在工作時被改變。新的預(yù)分頻器參數(shù)在下一次更新事件到來時被采用。(圖2和圖3給出了在預(yù)分頻器運行時,更改計數(shù)器參數(shù)的例子。)
圖2 當(dāng)預(yù)分頻器的參數(shù)從1 變到2時,計數(shù)器的時序圖
圖3 當(dāng)預(yù)分頻器的參數(shù)從1 變到4時,計數(shù)器的時序圖
3.2 計數(shù)器模式
3.2.1 向上計數(shù)模式
在向上計數(shù)模式中,計數(shù)器從0計數(shù)到自動加載值(TIMx_ARR計數(shù)器的內(nèi)容),然后重新從0開始計數(shù)并且產(chǎn)生一個計數(shù)器溢出事件。
每次計數(shù)器溢出時可以產(chǎn)生更新事件,在TIMx_EGR寄存器中(通過軟件方式或者使用從模式控制器)設(shè)置UG位也同樣可以產(chǎn)生一個更新事件。
設(shè)置TIMx_CR1 寄存器中的UDIS位,可以禁止更新事件;這樣可以避免在向預(yù)裝載寄存器中寫入新值時更新影子寄存器。在UDIS位被清’0’之前,將不產(chǎn)生更新事件。但是在應(yīng)該產(chǎn)生更新事件時,計數(shù)器仍會被清’0’,同時預(yù)分頻器的計數(shù)也被請0(但預(yù)分頻系數(shù)不變)。此外,如果設(shè)置了 TIMx_CR1 寄存器中的URS位(選擇更新請求),設(shè)置UG位將產(chǎn)生一個更新事件UEV,但硬件不設(shè)置UIF標(biāo)志(即不產(chǎn)生中斷或DMA請求);這是為了避免在捕獲模式下清除計數(shù)器時,同時產(chǎn)生更新和捕獲中斷。
當(dāng)發(fā)生一個更新事件時,所有的寄存器都被更新,硬件同時(依據(jù) URS 位)設(shè)置更新標(biāo)志位(TIMx_SR寄存器中的UIF位)。
● 預(yù)分頻器的緩沖區(qū)被置入預(yù)裝載寄存器的值(TIMx_PSC寄存器的內(nèi)容)。
● 自動裝載影子寄存器被重新置入預(yù)裝載寄存器的值(TIMx_ARR)。
下圖給出一些例子,當(dāng)TIMx_ARR=0x36時計數(shù)器在不同時鐘頻率下的動作。
圖4 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為1
圖5 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為2
圖6 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為4
圖7 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為N
圖8 計數(shù)器時序圖,當(dāng)ARPE=0時的更新事件(TIMx_ARR沒有預(yù)裝入)
圖9 計數(shù)器時序圖,當(dāng)ARPE=1 時的更新事件(預(yù)裝入了TIMx_ARR)
3.2.2向下計數(shù)模式
在向下模式中,計數(shù)器從自動裝入的值(TIMx_ARR計數(shù)器的值)開始向下計數(shù)到0,然后從自動裝入的值重新開始并且產(chǎn)生一個計數(shù)器向下溢出事件。
每次計數(shù)器溢出時可以產(chǎn)生更新事件,在TIMx_EGR寄存器中(通過軟件方式或者使用從模式控制器)設(shè)置UG位,也同樣可以產(chǎn)生一個更新事件。
設(shè)置TIMx_CR1 寄存器的UDIS位可以禁止UEV事件。這樣可以避免向預(yù)裝載寄存器中寫入新值時更新影子寄存器。因此UDIS位被清為’0’之前不會產(chǎn)生更新事件。然而,計數(shù)器仍會從當(dāng)前自動加載值重新開始計數(shù),同時預(yù)分頻器的計數(shù)器重新從0開始(但預(yù)分頻系數(shù)不變)。
此外,如果設(shè)置了 TIMx_CR1 寄存器中的URS位(選擇更新請求) ,設(shè)置UG位將產(chǎn)生一個更新事件UEV但不設(shè)置UIF標(biāo)志(因此不產(chǎn)生中斷和DMA請求),這是為了避免在發(fā)生捕獲事件并清除計數(shù)器時,同時產(chǎn)生更新和捕獲中斷。 當(dāng)發(fā)生更新事件時,所有的寄存器都被更新,并且(根據(jù)URS位的設(shè)置)更新標(biāo)志位(TIMx_SR寄存器中的UIF位)也被設(shè)置。
● 預(yù)分頻器的緩存器被置入預(yù)裝載寄存器的值(TIMx_PSC寄存器的值)。
● 當(dāng)前的自動加載寄存器被更新為預(yù)裝載值(TIMx_ARR寄存器中的內(nèi)容)。
注:自動裝載在計數(shù)器重載入之前被更新,因此下一個周期將是預(yù)期的值。
以下是一些當(dāng)TIMx_ARR=0x36時,計數(shù)器在不同時鐘頻率下的操作例子。
圖10 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為1
圖11 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為2
圖12 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為4
圖13 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為N
圖14 計數(shù)器時序圖,當(dāng)沒有使用重復(fù)計數(shù)器時的更新事件
3.2.3中央對齊模式(向上/向下計數(shù))
在中央對齊模式,計數(shù)器從0開始計數(shù)到自動加載的值(TIMx_ARR寄存器)?1 ,產(chǎn)生一個計數(shù)器溢出事件,然后向下計數(shù)到1 并且產(chǎn)生一個計數(shù)器下溢事件;然后再從0開始重新計數(shù)。
在這個模式,不能寫入TIMx_CR1 中的DIR方向位。它由硬件更新并指示當(dāng)前的計數(shù)方向。可以在每次計數(shù)上溢和每次計數(shù)下溢時產(chǎn)生更新事件;也可以通過(軟件或者使用從模式控制器)設(shè)置TIMx_EGR寄存器中的UG位產(chǎn)生更新事件。然后,計數(shù)器重新從0開始計數(shù),預(yù)分頻器也重新從0開始計數(shù)。
設(shè)置TIMx_CR1 寄存器中的UDIS位可以禁止UEV事件。這樣可以避免在向預(yù)裝載寄存器中寫入新值時更新影子寄存器。因此UDIS位被清為’0’之前不會產(chǎn)生更新事件。然而,計數(shù)器仍會根據(jù)當(dāng)前自動重加載的值,繼續(xù)向上或向下計數(shù)。
此外,如果設(shè)置了 TIMx_CR1 寄存器中的URS位(選擇更新請求) ,設(shè)置UG位將產(chǎn)生一個更新事件UEV但不設(shè)置UIF標(biāo)志(因此不產(chǎn)生中斷和DMA請求),這是為了避免在發(fā)生捕獲事件并清除計數(shù)器時,同時產(chǎn)生更新和捕獲中斷。
當(dāng)發(fā)生更新事件時,所有的寄存器都被更新,并且(根據(jù)URS位的設(shè)置)更新標(biāo)志位(TIMx_SR寄存器中的UIF位)也被設(shè)置。
● 預(yù)分頻器的緩存器被加載為預(yù)裝載(TIMx_PSC寄存器)的值。
● 當(dāng)前的自動加載寄存器被更新為預(yù)裝載值(TIMx_ARR寄存器中的內(nèi)容)。
注:如果因為計數(shù)器溢出而產(chǎn)生更新,自動重裝載將在計數(shù)器重載入之前被更新,因此下一個周期將是預(yù)期的值(計數(shù)器被裝載為新的值)。
以下是一些計數(shù)器在不同時鐘頻率下的操作的例子:
圖15 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為1 , TIMx_ARR=0x6
圖16 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為2
圖17 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為4, TIMx_ARR=0x36
圖18 計數(shù)器時序圖,內(nèi)部時鐘分頻因子為N
圖19 計數(shù)器時序圖, ARPE=1 時的更新事