一、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)有互相共享任何資源。它們可以一起同步操作。
二、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ù)分頻器寄存器可以由軟件讀寫(xiě),在計(jì)數(shù)器運(yùn)行時(shí)仍可以讀寫(xiě)。
時(shí)基單元包含:
● 計(jì)數(shù)器寄存器(TIMx_CNT)
● 預(yù)分頻器寄存器 (TIMx_PSC)
● 自動(dòng)裝載寄存器 (TIMx_ARR)
自動(dòng)裝載寄存器是預(yù)先裝載的,寫(xiě)或讀自動(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ù)裝載寄存器中寫(xiě)入新值時(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ù)裝載寄存器中寫(xiě)入新值時(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è)模式,不能寫(xiě)入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ù)裝載寄存器中寫(xiě)入新值時(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í)的更新事件(計(jì)數(shù)器下溢)
圖20 計(jì)數(shù)器時(shí)序圖, ARPE=1 時(shí)的更新事件(計(jì)數(shù)器溢出)
3.3 時(shí)鐘選擇
計(jì)數(shù)器時(shí)鐘可由下列時(shí)鐘源提供:
● 內(nèi)部時(shí)鐘(CK_INT)
● 外部時(shí)鐘模式1 :外部輸入腳(TIx)
● 外部時(shí)鐘模式2:外部觸發(fā)輸入(ETR)
● 內(nèi)部觸發(fā)輸入(ITRx):使用一個(gè)定時(shí)器作為另一個(gè)定時(shí)器的預(yù)分頻器,如可以配置一個(gè)定時(shí)器Timer1 而作為另一個(gè)定時(shí)器Timer2的預(yù)分頻器。
3.3.1 內(nèi)部時(shí)鐘源(CK_INT)
如果禁止了從模式控制器(TIMx_SMCR寄存器的SMS=000),則CEN、 DIR(TIMx_CR1 寄存器)和UG位(TIMx_EGR寄存器)是事實(shí)上的控制位,并且只能被軟件修改(UG位仍被自動(dòng)清除)。只
要CEN位被寫(xiě)成’1’,預(yù)分頻器的時(shí)鐘就由內(nèi)部時(shí)鐘CK_INT提供。
下圖顯示了控制電路和向上計(jì)數(shù)器在一般模式下,不帶預(yù)分頻器時(shí)的操作。
圖21 一般模式下的控制電路,內(nèi)部時(shí)鐘分頻因子為1
3.3.2 外部時(shí)鐘源模式1
當(dāng)TIMx_SMCR寄存器的SMS=111 時(shí),此模式被選中。計(jì)數(shù)器可以在選定輸入端的每個(gè)上升沿或下降沿計(jì)數(shù)。
圖22 TI2外部時(shí)鐘連接例子
例如,要配置向上計(jì)數(shù)器在T12輸入端的上升沿計(jì)數(shù),使用下列步驟:
-
配置TIMx_CCMR1 寄存器CC2S=’01’,配置通道2檢測(cè)TI2輸入的上升沿
-
配置TIMx_CCMR1 寄存器的IC2F[3:0],選擇輸入濾波器帶寬(如果不需要濾波器,保持IC2F=0000)
注: 捕獲預(yù)分頻器不用作觸發(fā),所以不需要對(duì)它進(jìn)行配置
-
配置TIMx_CCER寄存器的CC2P=’0’,選定上升沿極性
-
配置TIMx_SMCR寄存器的SMS=’111’,選擇定時(shí)器外部時(shí)鐘模式1
-
配置TIMx_SMCR寄存器中的TS=’110’,選定TI2作為觸發(fā)輸入源
-
設(shè)置TIMx_CR1 寄存器的CEN=’1’,啟動(dòng)計(jì)數(shù)器
當(dāng)上升沿出現(xiàn)在TI2,計(jì)數(shù)器計(jì)數(shù)一次,且TIF標(biāo)志被設(shè)置。在TI2的上升沿和計(jì)數(shù)器實(shí)際時(shí)鐘之間的延時(shí),取決于在TI2輸入端的重新同步電路。
圖23 外部時(shí)鐘模式1 下的控制電路
3.3.3 外部時(shí)鐘源模式2
選定此模式的方法為:令TIMx_SMCR寄存器中的ECE=1
計(jì)數(shù)器能夠在外部觸發(fā)ETR的每一個(gè)上升沿或下降沿計(jì)數(shù)(下圖是外部觸發(fā)輸入的框圖)
圖24 外部觸發(fā)輸入框圖
例如,要配置在ETR下每2個(gè)上升沿計(jì)數(shù)一次的向上計(jì)數(shù)器,使用下列步驟:
- 本例中不需要濾波器,置TIMx_SMCR寄存器中的ETF[3:0]=0000
- 設(shè)置預(yù)分頻器,置TIMx_SMCR寄存器中的ETPS[1:0]=01
- 設(shè)置在ETR的上升沿檢測(cè),置TIMx_SMCR寄存器中的ETP=0
- 開(kāi)啟外部時(shí)鐘模式2,置TIMx_SMCR寄存器中的ECE=1
- 啟動(dòng)計(jì)數(shù)器,置TIMx_CR1 寄存器中的CEN=1
計(jì)數(shù)器在每2個(gè)ETR上升沿計(jì)數(shù)一次。
在ETR的上升沿和計(jì)數(shù)器實(shí)際時(shí)鐘之間的延時(shí)取決于在ETRP信號(hào)端的重新同步電路。
圖25 外部時(shí)鐘模式2下的控制電路
3.4 捕獲/比較通道
每一個(gè)捕獲/比較通道都是圍繞著一個(gè)捕獲/比較寄存器(包含影子寄存器),包括捕獲的輸入部分(數(shù)字濾波、多路復(fù)用和預(yù)分頻器),和輸出部分(比較器和輸出控制)。(下面幾張圖是一個(gè)捕獲/比較通道概覽。)
輸入部分對(duì)相應(yīng)的TIx輸入信號(hào)采樣,并產(chǎn)生一個(gè)濾波后的信號(hào)TIxF。然后,一個(gè)帶極性選擇的邊緣檢測(cè)器產(chǎn)生一個(gè)信號(hào)(TIxFPx),它可以作為從模式控制器的輸入觸發(fā)或者作為捕獲控制。該信號(hào)通過(guò)預(yù)分頻進(jìn)入捕獲寄存器(ICxPS)。
圖26 捕獲/比較通道(如:通道1 輸入部分)
輸出部分產(chǎn)生一個(gè)中間波形OCxRef(高有效)作為基準(zhǔn),鏈的末端決定最終輸出信號(hào)的極性。
圖27 捕獲/比較通道1 的主電路
圖28 捕獲/比較通道的輸出部分(通道1)
捕獲/比較模塊由一個(gè)預(yù)裝載寄存器和一個(gè)影子寄存器組成。讀寫(xiě)過(guò)程僅操作預(yù)裝載寄存器。在捕獲模式下,捕獲發(fā)生在影子寄存器上,然后再?gòu)?fù)制到預(yù)裝載寄存器中。在比較模式下,預(yù)裝載寄存器的內(nèi)容被復(fù)制到影子寄存器中,然后影子寄存器的內(nèi)容和計(jì)數(shù)器進(jìn)行比較。
3.5 輸入捕獲模式
在輸入捕獲模式下,當(dāng)檢測(cè)到ICx信號(hào)上相應(yīng)的邊沿后,計(jì)數(shù)器的當(dāng)前值被鎖存到捕獲/比較寄存器(TIMx_CCRx)中。當(dāng)捕獲事件發(fā)生時(shí),相應(yīng)的CCxIF標(biāo)志(TIMx_SR寄存器)被置’1’,如果使能了中斷或者DMA操作,則將產(chǎn)生中斷或者DMA操作。如果捕獲事件發(fā)生時(shí)CCxIF標(biāo)志已經(jīng)為高,那么重復(fù)捕獲標(biāo)志CCxOF(TIMx_SR寄存器)被置’1’。寫(xiě)CCxIF=0可清除CCxIF,或讀取存儲(chǔ)在TIMx_CCRx寄存器中的捕獲數(shù)據(jù)也可清除CCxIF。寫(xiě)CCxOF=0可清除CCxOF。
以下例子說(shuō)明如何在TI1 輸入的上升沿時(shí)捕獲計(jì)數(shù)器的值到TIMx_CCR1 寄存器中,步驟如下:
● 選擇有效輸入端: TIMx_CCR1 必須連接到TI1 輸入,所以寫(xiě)入TIMx_CCR1 寄存器中的CC1S=01 ,只要CC1S不為’00’,通道被配置為輸入,并且TM1_CCR1 寄存器變?yōu)橹蛔x。
● 根據(jù)輸入信號(hào)的特點(diǎn),配置輸入濾波器為所需的帶寬(即輸入為TIx時(shí),輸入濾波器控制位是TIMx_CCMRx寄存器中的ICxF位)。假設(shè)輸入信號(hào)在最多5個(gè)內(nèi)部時(shí)鐘周期的時(shí)間內(nèi)抖動(dòng),我們須配置濾波器的帶寬長(zhǎng)于5個(gè)時(shí)鐘周期。因此我們可以(以fDTS頻率)連續(xù)采樣8次,以確認(rèn)在TI1 上一次真實(shí)的邊沿變換,即在TIMx_CCMR1 寄存器中寫(xiě)入IC1F=0011 。
● 選擇TI1 通道的有效轉(zhuǎn)換邊沿,在TIMx_CCER寄存器中寫(xiě)入CC1P=0(上升沿)。
● 配置輸入預(yù)分頻器。在本例中,我們希望捕獲發(fā)生在每一個(gè)有效的電平轉(zhuǎn)換時(shí)刻,因此預(yù)分頻器被禁止(寫(xiě)TIMx_CCMR1 寄存器的IC1PS=00)。
● 設(shè)置TIMx_CCER寄存器的CC1E=1 ,允許捕獲計(jì)數(shù)器的值到捕獲寄存器中。
● 如果需要,通過(guò)設(shè)置TIMx_DIER寄存器中的CC1IE位允許相關(guān)中斷請(qǐng)求,通過(guò)設(shè)置TIMx_DIER寄存器中的CC1DE位允許DMA請(qǐng)求。
當(dāng)發(fā)生一個(gè)輸入捕獲時(shí):
● 產(chǎn)生有效的電平轉(zhuǎn)換時(shí),計(jì)數(shù)器的值被傳送到TIMx_CCR1 寄存器。
● CC1IF標(biāo)志被設(shè)置(中斷標(biāo)志)。當(dāng)發(fā)生至少2個(gè)連續(xù)的捕獲時(shí),而CC1IF未曾被清除,CC1OF也被置’1’。
● 如設(shè)置了CC1IE位,則會(huì)產(chǎn)生一個(gè)中斷。
● 如設(shè)置了CC1DE位,則還會(huì)產(chǎn)生一個(gè)DMA請(qǐng)求。
為了處理捕獲溢出,建議在讀出捕獲溢出標(biāo)志之前讀取數(shù)據(jù),這是為了避免丟失在讀出捕獲溢出標(biāo)志之后和讀取數(shù)據(jù)之前可能產(chǎn)生的捕獲溢出信息。
注:設(shè)置TIMx_EGR寄存器中相應(yīng)的CCxG位,可以通過(guò)軟件產(chǎn)生輸入捕獲中斷和/或DMA請(qǐng)求。
3.6 PWM輸入模式
該模式是輸入捕獲模式的一個(gè)特例,除下列區(qū)別外,操作與輸入捕獲模式相同:
● 兩個(gè)ICx信號(hào)被映射至同一個(gè)TIx輸入。
● 這2個(gè)ICx信號(hào)為邊沿有效,但是極性相反。
● 其中一個(gè)TIxFP信號(hào)被作為觸發(fā)輸入信號(hào),而從模式控制器被配置成復(fù)位模式。
例如,你需要測(cè)量輸入到TI1 上的PWM信號(hào)的長(zhǎng)度(TIMx_CCR1 寄存器)和占空比(TIMx_CCR2寄存器),具體步驟如下(取決于CK_INT的頻率和預(yù)分頻器的值)
● 選擇TIMx_CCR1 的有效輸入:置TIMx_CCMR1 寄存器的CC1S=01(選擇TI1)。
● 選擇TI1FP1 的有效極性(用來(lái)捕獲數(shù)據(jù)到TIMx_CCR1 中和清除計(jì)數(shù)器):置CC1P=0(上升沿有效)。
● 選擇TIMx_CCR2的有效輸入:置TIMx_CCMR1 寄存器的CC2S=10(選擇TI1)。
● 選擇TI1FP2的有效極性(捕獲數(shù)據(jù)到TIMx_CCR2):置CC2P=1(下降沿有效)。
● 選擇有效的觸發(fā)輸入信號(hào):置TIMx_SMCR寄存器中的TS=101(選擇TI1FP1)。
● 配置從模式控制器為復(fù)位模式:置TIMx_SMCR中的SMS=100。
● 使能捕獲:置TIMx_CCER寄存器中CC1E=1 且CC2E=1 。
圖29 PWM輸入模式時(shí)序
由于只有 TI1FP1 和 TI2FP2 連到了從模式控制器,所以 PWM 輸入模式只能使用 TIMx_CH1/TIMx_CH2信號(hào)。
3.7 強(qiáng)置輸出模式
在輸出模式(TIMx_CCMRx寄存器中 CCxS=00)下,輸出比較信號(hào)(OCxREF和相應(yīng)的OCx)能夠直接由軟件強(qiáng)置為有效或無(wú)效狀態(tài),而不依賴于輸出比較寄存器和計(jì)數(shù)器間的比較結(jié)果。
置TIMx_CCMRx寄存器中相應(yīng)的OCxM=101 ,即可強(qiáng)置輸出比較信號(hào)(OCxREF/OCx)為有效狀態(tài)。這樣OCxREF被強(qiáng)置為高電平(OCxREF始終為高電平有效),同時(shí)OCx得到CCxP極性位相反的值。
例如: CCxP=0(OCx高電平有效),則OCx被強(qiáng)置為高電平。
置TIMx_CCMRx寄存器中的OCxM=100,可強(qiáng)置OCxREF信號(hào)為低。
該模式下,在TIMx_CCRx影子寄存器和計(jì)數(shù)器之間的比較仍然在進(jìn)行,相應(yīng)的標(biāo)志也會(huì)被修改。因此仍然會(huì)產(chǎn)生相應(yīng)的中斷和DMA請(qǐng)求。這將會(huì)在下面的輸出比較模式一節(jié)中介紹。
3.8 輸出比較模式
此項(xiàng)功能是用來(lái)控制一個(gè)輸出波形,或者指示一段給定的的時(shí)間已經(jīng)到時(shí)。
當(dāng)計(jì)數(shù)器與捕獲/比較寄存器的內(nèi)容相同時(shí),輸出比較功能做如下操作:
● 將輸出比較模式(TIMx_CCMRx寄存器中的OCxM位)和輸出極性(TIMx_CCER寄存器中的CCxP位)定義的值輸出到對(duì)應(yīng)的引腳上。在比較匹配時(shí),輸出引腳可以保持它的電平(OCxM=000)、被設(shè)置成有效電平(OCxM=001)、被設(shè)置成無(wú)效電平(OCxM=010)或進(jìn)行翻轉(zhuǎn)(OCxM=011)。
● 設(shè)置中斷狀態(tài)寄存器中的標(biāo)志位(TIMx_SR寄存器中的CCxIF位)。
● 若設(shè)置了相應(yīng)的中斷屏蔽(TIMx_DIER寄存器中的CCxIE位),則產(chǎn)生一個(gè)中斷。
● 若設(shè)置了相應(yīng)的使能位(TIMx_DIER寄存器中的CCxDE位, TIMx_CR2寄存器中的CCDS位選擇DMA請(qǐng)求功能),則產(chǎn)生一個(gè)DMA請(qǐng)求。
TIMx_CCMRx中的OCxPE位選擇TIMx_CCRx寄存器是否需要使用預(yù)裝載寄存器。
在輸出比較模式下,更新事件UEV對(duì)OCxREF和OCx輸出沒(méi)有影響。
同步的精度可以達(dá)到計(jì)數(shù)器的一個(gè)計(jì)數(shù)周期。輸出比較模式(在單脈沖模式下)也能用來(lái)輸出一個(gè)單脈沖。
輸出比較模式的配置步驟:
- 選擇計(jì)數(shù)器時(shí)鐘(內(nèi)部,外部,預(yù)分頻器)
- 將相應(yīng)的數(shù)據(jù)寫(xiě)入TIMx_ARR和TIMx_CCRx寄存器中
- 如果要產(chǎn)生一個(gè)中斷請(qǐng)求和/或一個(gè)DMA請(qǐng)求,設(shè)置CCxIE位和/或CCxDE位。
- 選擇輸出模式,例如當(dāng)計(jì)數(shù)器CNT與CCRx匹配時(shí)翻轉(zhuǎn)OCx的輸出引腳, CCRx預(yù)裝載未用,開(kāi)啟 OCx輸出且高電平有效,則必須設(shè)置OCxM=’011’、 OCxPE=’0’、 CCxP=’0’和CCxE=’1’。
- 設(shè)置TIMx_CR1 寄存器的CEN位啟動(dòng)計(jì)數(shù)器
TIMx_CCRx寄存器能夠在任何時(shí)候通過(guò)軟件進(jìn)行更新以控制輸出波形,條件是未使用預(yù)裝載寄存器(OCxPE=’0’,否則TIMx_CCRx影子寄存器只能在發(fā)生下一次更新事件時(shí)被更新)。下圖給
出了一個(gè)例子。
圖30 輸出比較模式,翻轉(zhuǎn)OC1
3.9 PWM 模式
脈沖寬度調(diào)制模式可以產(chǎn)生一個(gè)由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號(hào)。
在TIMx_CCMRx寄存器中的OCxM位寫(xiě)入’110’(PWM模式1)或’111’(PWM模式2),能夠獨(dú)立地設(shè)置每個(gè)OCx輸出通道產(chǎn)生一路PWM。必須設(shè)置TIMx_CCMRx寄存器OCxPE位以使能相應(yīng)的預(yù)裝載寄存器,最后還要設(shè)置TIMx_CR1 寄存器的ARPE位, (在向上計(jì)數(shù)或中心對(duì)稱模式中)使能自動(dòng)重裝載的預(yù)裝載寄存器。
僅當(dāng)發(fā)生一個(gè)更新事件的時(shí)候,預(yù)裝載寄存器才能被傳送到影子寄存器,因此在計(jì)數(shù)器開(kāi)始計(jì)數(shù)之前,必須通過(guò)設(shè)置TIMx_EGR寄存器中的UG位來(lái)初始化所有的寄存器。OCx的極性可以通過(guò)軟件在TIMx_CCER寄存器中的CCxP位設(shè)置,它可以設(shè)置為高電平有效或低電平有效。 TIMx_CCER寄存器中的CCxE位控制OCx輸出使能。在PWM模式(模式1 或模式2)下, TIMx_CNT和TIMx_CCRx始終在進(jìn)行比較, (依據(jù)計(jì)數(shù)器的計(jì)數(shù)方向 ) 以確 定是否符合 TIMx_CCRx≤ TIMx_CNT 或者 TIMx_CNT ≤ TIMx_CCRx 。然而為了與OCREF_CLR的功能(在下一個(gè)PWM周期之前,ETR信號(hào)上的一個(gè)外部事件能夠清除OCxREF)一致,OCxREF信號(hào)只能在下述條件下產(chǎn)生:
● 當(dāng)比較的結(jié)果改變
● 當(dāng)輸出比較模式(TIMx_CCMRx寄存器中的OCxM位)從“凍結(jié)” (無(wú)比較, OCxM=’000’)切換到某個(gè)PWM模式(OCxM=’110’或’111’)
這樣在運(yùn)行中可以通過(guò)軟件強(qiáng)置PWM輸出。根據(jù)TIMx_CR1 寄存器中 CMS位的狀態(tài),定時(shí)器能夠產(chǎn)生邊沿對(duì)齊的PWM信號(hào)或中央對(duì)齊的PWM信號(hào)。
PWM 邊沿對(duì)齊模式 (向上計(jì)數(shù)配置當(dāng)TIMx_CR1 寄存器中的DIR位為低的時(shí)候執(zhí)行向上計(jì)數(shù)。)下面是一個(gè)PWM模式1 的例子。當(dāng)TIMx_CNT
如果比較值為0,則OCxREF保持為’0’。 下圖為TIMx_ARR=8時(shí)邊沿對(duì)齊的PWM波形實(shí)例。
圖31 邊沿對(duì)齊的PWM波形(ARR=8)
向下計(jì)數(shù)的配置(當(dāng)TIMx_CR1 寄存器的DIR位為高時(shí)執(zhí)行向下計(jì)數(shù)。)
在PWM模式1,當(dāng)TIMx_CNT>TIMx_CCRx時(shí)參考信號(hào)OCxREF為低,否則為高。如果TIMx_CCRx中的比較值大于TIMx_ARR中的自動(dòng)重裝載值,則OCxREF保持為’1’。該模式下不能產(chǎn)生0%的PWM波形。
PWM 中央對(duì)齊模式(當(dāng)TIMx_CR1 寄存器中的CMS位不為’00’時(shí),為中央對(duì)齊模式(所有其他的配置對(duì)OCxREF/OCx信號(hào)都有相同的作用)。)
根據(jù)不同的CMS位設(shè)置,比較標(biāo)志可以在計(jì)數(shù)器向上計(jì)數(shù)時(shí)被置’1’、在計(jì)數(shù)器向下計(jì)數(shù)時(shí)被置’1’、或在計(jì)數(shù)器向上和向下計(jì)數(shù)時(shí)被置’1’。 TIMx_CR1 寄存器中的計(jì)數(shù)方向位(DIR)由硬件更新,不要用軟件修改它。
● TIMx_ARR=8
● PWM模式1
● TIMx_CR1 寄存器中的CMS=01 ,在中央對(duì)齊模式1 時(shí),當(dāng)計(jì)數(shù)器向下計(jì)數(shù)時(shí)設(shè)置比較標(biāo)志。
圖32 中央對(duì)齊的PWM波形(APR=8)
使用中央對(duì)齊模式的提示:
● 進(jìn)入中央對(duì)齊模式時(shí),使用當(dāng)前的向上/向下計(jì)數(shù)配置;這就意味著計(jì)數(shù)器向上還是向下計(jì)數(shù)取決于TIMx_CR1 寄存器中DIR位的當(dāng)前值。此外,軟件不能同時(shí)修改DIR和CMS位。
● 不推薦當(dāng)運(yùn)行在中央對(duì)齊模式時(shí)改寫(xiě)計(jì)數(shù)器,因?yàn)檫@會(huì)產(chǎn)生不可預(yù)知的結(jié)果。特別地:
─ 如果寫(xiě)入計(jì)數(shù)器的值大于自動(dòng)重加載的值(TIMx_CNT>TIMx_ARR),則方向不會(huì)被更新。
例如,如果計(jì)數(shù)器正在向上計(jì)數(shù),它就會(huì)繼續(xù)向上計(jì)數(shù)。
─ 如果將0或者TIMx_ARR的值寫(xiě)入計(jì)數(shù)器,方向被更新,但不產(chǎn)生更新事件UEV。
● 使用中央對(duì)齊模式最保險(xiǎn)的方法,就是在啟動(dòng)計(jì)數(shù)器之前產(chǎn)生一個(gè)軟件更新(設(shè)置TIMx_EGR 位中的UG位),不要在計(jì)數(shù)進(jìn)行過(guò)程中修改計(jì)數(shù)器的值。
3.10 單脈沖模式
單脈沖模式(OPM)是前述眾多模式的一個(gè)特例。這種模式允許計(jì)數(shù)器響應(yīng)一個(gè)激勵(lì),并在一個(gè)程序可控的延時(shí)之后,產(chǎn)生一個(gè)脈寬可程序控制的脈沖。
可以通過(guò)從模式控制器啟動(dòng)計(jì)數(shù)器,在輸出比較模式或者PWM模式下產(chǎn)生波形。設(shè)置TIMx_CR1寄存器中的OPM位將選擇單脈沖模式,這樣可以讓計(jì)數(shù)器自動(dòng)地在產(chǎn)生下一個(gè)更新事件UEV時(shí)停止。僅當(dāng)比較值與計(jì)數(shù)器的初始值不同時(shí),才能產(chǎn)生一個(gè)脈沖。啟動(dòng)之前(當(dāng)定時(shí)器正在等待觸發(fā)),必須如下配置:
向上計(jì)數(shù)方式: CNT < CCRx ≤ ARR (特別地, 0 < CCRx)
向下計(jì)數(shù)方式: CNT > CCRx
圖33 單脈沖模式的例子
例如,你需要在從TI2輸入腳上檢測(cè)到一個(gè)上升沿開(kāi)始,延遲tDELAY之后,在OC1 上產(chǎn)生一個(gè)長(zhǎng)度為tPULSE的正脈沖。
評(píng)論