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