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