版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章定時器本章講述了定時器,包括STM32F103定時器概述、基本定時器、通用定時器、高級定時器、定時器庫函數(shù)和定時器應(yīng)用實例和SysTick系統(tǒng)滴答定時器。6.1STM32F103定時器概述定時與計數(shù)的應(yīng)用十分廣泛。在實際生產(chǎn)過程中,許多場合都需要定時或者計數(shù)操作。例如產(chǎn)生精確的時間,對流水線上的產(chǎn)品進行計數(shù)等。因此,定時/計數(shù)器在嵌入式單片機應(yīng)用系統(tǒng)中十分重要。定時和計數(shù)可以通過以下方式實現(xiàn):1.軟件延時單片機是在一定時鐘下運行的,可以根據(jù)代碼所需的時鐘周期來完成延時操作,軟件延時會導(dǎo)致CPU利用率低。因此主要用于短時間延時,如高速A/D轉(zhuǎn)換器。2.可編程定時/計數(shù)器微控制器中的可編程定時/計數(shù)器可以實現(xiàn)定時和計數(shù)操作,定時/計數(shù)器功能由程序靈活設(shè)置,重復(fù)利用。設(shè)置好后由硬件與CPU并行工作,不占用CPU時間,這樣在軟件的控制下,可以實現(xiàn)多個精密定時/計數(shù)。嵌入式處理器為了適應(yīng)多種應(yīng)用,通常集成多個高性能的定時/計數(shù)器。微控制器中的定時器本質(zhì)上是一個計數(shù)器,可以對內(nèi)部脈沖或外部輸入進行計數(shù),不僅具有基本的延時/計數(shù)功能,還具有輸入捕獲、輸出比較和PWM波形輸出等高級功能。在嵌入式開發(fā)中,充分利用定時器的強大功能,可以顯著提高外設(shè)驅(qū)動的編程效率和CPU利用率,增強系統(tǒng)的實時性。STM32內(nèi)部集成了多個定時/計數(shù)器。根據(jù)型號不同,STM32系列芯片最多包含8個定時/計數(shù)器。其中,TIM6和TIM7為基本定時器,TIM2~TIM5為通用定時器,TIM1和TIM8為高級控制定時器,功能最強。三種定時器具備的功能如表6-1所示。此外,在STM32中還有兩個看門狗定時器和一個系統(tǒng)滴答定時器。表6-1STM32定時器的功能主要功能高級控制定時器通用定時器基本定時器內(nèi)部時鐘源(8MHz)●●●帶16位分頻的計數(shù)單元●●●更新中斷和DMA●●●計數(shù)方向向上、向下、雙向向上、向下、雙向向上外部事件計數(shù)●●○其他定時器觸發(fā)或級聯(lián)●●○4個獨立輸入捕獲、輸出比較通道●●○單脈沖輸出方式●●○正交編碼器輸入●●○霍爾傳感器輸入●●○輸出比較信號死區(qū)產(chǎn)生●○○制動信號輸入●○○STM32F103定時器相比于傳統(tǒng)的51單片機要完善和復(fù)雜得多,它是專為工業(yè)控制應(yīng)用量身定做,具有延時、頻率測量、PWM輸出、電機控制及編碼接口等功能。6.2基本定時器STM32F103基本定時器TIM6和TIM7各包含一個16位自動裝載計數(shù)器,由各自的可編程預(yù)分頻器驅(qū)動。它們可以作為通用定時器提供時間基準,特別是可以為數(shù)模轉(zhuǎn)換器(DAC)提供時鐘。實際上,它們在芯片內(nèi)部直接連接到DAC并通過觸發(fā)輸出直接驅(qū)動DAC,這2個定時器是互相獨立的,不共享任何資源。6.2.1基本定時器簡介TIM6和TIM7定時器的主要功能包括:1)16位自動重裝載累加計數(shù)器。2)16位可編程(可實時修改)預(yù)分額器,用于對輸入的時鐘按系數(shù)為1~65536之間的任意數(shù)值分頻。3)觸發(fā)DAC的同步電路。4)在更新事件(計數(shù)益詢品)時產(chǎn)生中斷/DMA請求。基本定時器內(nèi)部結(jié)構(gòu)如圖6-1所示。6.2.2基本定時器的主要特性圖6-1基本定時器結(jié)構(gòu)框圖1.時基單元這個可編程定時器的主要部分是一個帶有自動重裝錢的16位累加計數(shù)器,計數(shù)器的時鐘通過一個預(yù)分頻器得到。軟件可以讀寫計數(shù)器、自動重裝載寄存器和預(yù)分頻寄存器,即使計數(shù)器運行時也可以操作。時基單元包含:1)計數(shù)器寄存器(TIMx_CNT)。2)預(yù)分頻寄存器(TIMx_PSC)。3)自動重裝載寄存器(TIMx_ARR)。6.2.3基本定時器的功能2.時鐘源從STM32F103基本定時器內(nèi)部結(jié)構(gòu)圖可以看出,基本定時器TIM6和TIM7只有一個時鐘源,即內(nèi)部時鐘CK_INT。對于STM32F103所有的定時器,內(nèi)部時鐘CK_INT都來自RCC的TIMxCLK,但對于不同的定時器,TIMxCLK的來源不同?;径〞r器TIM6和TIM7的TIMxCLK來源于APB1預(yù)分頻器的輸出,系統(tǒng)默認情況下,APB1的時鐘頻率為72MHz。3.預(yù)分頻器預(yù)分頻可以以系數(shù)介于1~65536之間的任意數(shù)值對計數(shù)器時鐘分頻。它是通過一個16位寄存器(TIMx_PSC)的計數(shù)實現(xiàn)分頻。因為TIMx_PSC控制寄存器具有緩沖作用,可以在運行過程中改變它的數(shù)值,新的預(yù)分頻數(shù)值將在下一個更新事件時起作用。圖6-2是在運行過程中改變預(yù)分頻系數(shù)的例子,預(yù)分頻系數(shù)從1變到2。圖6-2預(yù)分頻系數(shù)從1變到2的計數(shù)器時序圖4.計數(shù)模式STM32F103基本定時器只有向上計數(shù)工作模式,其工作過程如圖6-3所示,其中↑表示產(chǎn)生溢出事件。圖6-3向上計數(shù)工作模式基本定時器工作時,脈沖計數(shù)器TIMx_CNT從0累加計數(shù)到自動重裝載數(shù)值(TIMx_ARR寄存器),然后重新從0開始計數(shù)并產(chǎn)生一個計數(shù)器溢出事件。由此可見,如果使用基本定時器進行延時,延時時間可以由以下公式計算:延時時間=(TIMx_ARR+1)*(TIMx_PSC+1)/TIMxCLK當(dāng)發(fā)生一次更新事件時,所有寄存器會被更新并設(shè)置更新標(biāo)志:傳送預(yù)裝載值(TIMx_PSC寄存器的內(nèi)容)至預(yù)分頻器的緩沖區(qū),自動重裝載影子寄存器被更新為預(yù)裝載值(TIMx_ARR)。以下是一些在TIMx_ARR=0x36時不同時鐘頻率下計數(shù)器工作的圖示例子。圖6-4內(nèi)部時鐘分頻系數(shù)為1,圖6-5內(nèi)部時鐘分頻系數(shù)為2。圖6-4計數(shù)器時序圖(內(nèi)部時鐘分頻系數(shù)為1)圖6-5計數(shù)器時序圖(內(nèi)部時鐘分頻系數(shù)為2)現(xiàn)將STM32F103基本定時器相關(guān)寄存器名稱介紹如下,可以用半字(16位)或字(32位)的方式操作這些外設(shè)寄存器,由于是采用庫函數(shù)方式編程,故不作進一步的探討。(1)TIM6和TIM7控制寄存器1(TIMx_CR1)。(2)TIM6和TIM7控制寄存器2(TIMx_CR2)。(3)TIM6和TIM7DMA/中斷使能寄存器(TIMx_DIER)。(4)TIM6和TIM7狀態(tài)寄存器(TIMx_SR)。(5)TIM6和TIM7事件產(chǎn)生寄存器(TIMx_EGR)。(6)TIM6和TIM7計數(shù)器(TIMx_CNT).(7)TIM6和TIM7預(yù)分頻器(TIMx_PSC)。(8)TIM6和TIM7自動重裝載寄存器(TIMx_ARR)。6.2.4基本定時器寄存器6.3通用定時器通用定時器(TIM2、TIM3、TIM4和TIM5)是一個通過可編程預(yù)分頻器驅(qū)動的16位自動裝載計數(shù)器構(gòu)成。它適用于多種場合,包括測量輸入信號的脈沖長度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)。使用定時器預(yù)分頻器和RCC時鐘控制器預(yù)分頻器,脈沖長度和波形周期可以在幾微秒到幾毫秒間調(diào)整。每個定時器都是完全獨立的,沒有互相共享任何資源。它們可以同步操作。6.3.1通用定時器簡介通用TIMx(TIM2、TIM3、TIM4和TIM5)定時器功能包括:1)16位向上、向下、向上/向下自動裝載計數(shù)器。2)16位可編程(可以實時修改)預(yù)分頻器,計數(shù)器時鐘頻率的分頻系數(shù)為1~65536之間的任意數(shù)值。3)4個獨立通道:①輸入捕獲。②輸出比較。③PWM生成(邊緣或中間對齊模式)。④單脈沖模式輸出。4)使用外部信號控制定時器和定時器互連的同步電路。6.3.2通用定時器主要功能5)如下事件發(fā)生時產(chǎn)生中斷/DMA:①更新,計數(shù)器向上溢出/向下溢出,計數(shù)器初始化(通過軟件或者內(nèi)部/外部觸發(fā))。②觸發(fā)事件(計數(shù)器啟動、停止、初始化或者由內(nèi)部/外部觸發(fā)計數(shù))。③輸入捕獲。④輸出比較。6)支持針對定位的增量(正交)編碼器和霍爾傳感器電路。7)觸發(fā)輸入作為外部時鐘或者按周期的電流管理。通用定時器內(nèi)部結(jié)構(gòu)如圖6-6所示。相比于基本定時器其內(nèi)部結(jié)構(gòu)要復(fù)雜得多,其中最顯著的地方就是增加了4個捕獲/比較寄存器TIMx_CCR,這也是通用定時器之所以擁有那么多強大功能的原因。6.3.3通用定時器功能描述圖6-6通用定時器內(nèi)部結(jié)構(gòu)框圖1.時基單元可編程通用定時器的主要部分是一個16位計數(shù)器和與其相關(guān)的自動裝載寄存器。這個計數(shù)器可以向上計數(shù)、向下計數(shù)或者向上向下雙向計數(shù)。此計數(shù)器時鐘由預(yù)分頻器分頻得到。計數(shù)器、自動裝載寄存器和預(yù)分頻器寄存器可以由軟件讀寫,在計數(shù)器運行時仍可以讀寫。時基單元包含:計數(shù)器寄存器(TIMx_CNT)、預(yù)分頻器寄存器(TIMx_PSC)和自動裝載寄存器(TIMx_ARR)。預(yù)分頻器可以將計數(shù)器的時鐘頻率按1~65536之間的任意值分頻。它是基于一個(在TIMx_PSC寄存器中的)16位寄存器控制的16位計數(shù)器。這個控制寄存器帶有緩沖器,它能夠在工作時被改變。新的預(yù)分頻器參數(shù)在下一次更新事件到來時被采用。2.計數(shù)模式1)向上計數(shù)模式向上計數(shù)模式工作過程同基本定時器向上計數(shù)模式,工作過程如圖6-7所示。在向上計數(shù)模式中,計數(shù)器在時鐘CK_CNT的驅(qū)動下從0計數(shù)到自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值,然后重新從0開始計數(shù),并產(chǎn)生一個計數(shù)器溢出事件,可觸發(fā)中斷或DMA請求。當(dāng)發(fā)生一個更新事件時,所有的寄存器都被更新,硬件同時設(shè)置更新標(biāo)志位。對于一個工作在向上計數(shù)模式下的通用定時器,當(dāng)自動重裝載寄存器T1Mx_ARR的值為0x36,內(nèi)部預(yù)分頻系數(shù)為4(預(yù)分頻奇存器TIMx_PSC的值為3)的計數(shù)器時序圖如圖6-7所示。圖6-7計數(shù)器時序圖(內(nèi)部時鐘分頻因子位4)2)向下計數(shù)模式通用定時器向下計數(shù)模式工作過程如圖6-8所示。在向下計數(shù)模式中,計數(shù)器在時鐘CK_CNT的驅(qū)動下從自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值開如向下計數(shù)到0,然后從自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值重新開始計數(shù),并產(chǎn)生一個計數(shù)器溢出事件,可觸發(fā)中斷或DMA請求。當(dāng)發(fā)生一個更新事件時,所有的寄存器都被更新,硬件同時設(shè)置更新標(biāo)志位。圖6-8向下計數(shù)工作模式對于一個工作在向下計數(shù)模式下的通用定時器,當(dāng)自動重裝載寄存器TIMx_ARR的值為0x36,內(nèi)部預(yù)分頻系數(shù)為2(預(yù)分頻寄存器TIMx_PSC的值為1)的計數(shù)器時序圖如圖6-9所示。圖6-9計數(shù)器時序圖(內(nèi)部時鐘分頻因子位4)3)向上/向下計數(shù)模式向上/向下計數(shù)模式又稱為中央對齊模式或雙向計數(shù)模式,其工作過程如圖6-10所示,計數(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)生更新事件,觸發(fā)中斷或DMA請求。圖6-10向上/向下計數(shù)模式對于一個工作在向上/向下計數(shù)模式下的通用定時器,當(dāng)自動重裝載寄存器TIMx_ARR的值為0x06,內(nèi)部預(yù)分頻系數(shù)為1(預(yù)分頻寄存器TIMx_PSC的值為0)的計數(shù)器時序圖如圖6-11所示。圖6-11計數(shù)器時序圖(內(nèi)部時鐘分頻因子為1)3.時鐘選擇相比于基本定時器單一的內(nèi)部時鐘源,STM32F103通用定時器的16位計數(shù)器的時鐘源有多種選擇,可由以下時鐘源提供。1)內(nèi)部時鐘(CK_INT)內(nèi)部時鐘CK_INT來自RCC的TIMxCLK,根據(jù)STM32F103時鐘樹,通用定時器TIM2~TIM5內(nèi)部時鐘CK_INT的來源TIM_CLK,與基本定時器相同,都是來自APB1預(yù)分頻器的輸出,通常情況下,其時鐘頻率是72MHz2)外部輸入捕獲引腳TIx(外部時鐘模式1)外部輸入捕獲引腳TIx(外部時鐘模式1)來自外部輸入捕獲引腳上的邊沿信號。計數(shù)器可以在選定的輸入端(引腳1:TI1FP1或TI1F_ED,引腳2:TI2FP2)的每個上升沿或下降沿計數(shù)。3)外部觸發(fā)輸入引腳ETR(外部時鐘模式2)外部觸發(fā)輸入引腳ETR(外部時鐘模式2)來自外部引腳ETR。計數(shù)器能在外部觸發(fā)輸入ETR的每個上升沿或下降沿計數(shù)。4)內(nèi)部觸發(fā)器輸入ITRx內(nèi)部觸發(fā)輸入ITRx來自芯片內(nèi)部其他定時器的觸發(fā)輸入,使用一個定時器作為另個定時器的預(yù)分頻器,例如,可以配置TIM1作為TIM2的預(yù)分頻器。4.捕獲/比較通道每一個捕獲/比較通道都是圍繞一個捕獲/比較寄存器(包含影子寄存器),包括捕獲的輸入部分(數(shù)字濾波、多路復(fù)用和預(yù)分頻器)和輸出部分(比較器和輸出控制)。輸入部分對相應(yīng)的TIx輸入信號采樣,并產(chǎn)生一個濾波后的信號TIxF。然后,一個帶極性選擇的邊緣檢測器產(chǎn)生一個信號(TIxFPx),它可以作為從模式控制器的輸入觸發(fā)或者作為捕獲控制。該信號通過預(yù)分頻進入捕獲寄存器(ICxPS)。輸出部分產(chǎn)生一個中間波形OCxRef(高有效)作為基準,鏈的末端決定最終輸出信號的極性。1.輸入捕獲模式在輸入捕獲模式下,當(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。6.3.4通用定時器工作模式2.PWM輸入模式該模式是輸入捕獲模式的一個特例,除下列區(qū)別外,操作與輸入捕獲模式相同:1)2個ICx信號被映射至同一個TIx輸入。2)這2個ICx信號為邊沿有效,但是極性相反。3)其中一個TIxFP信號被作為觸發(fā)輸入信號,而從模式控制器被配置成復(fù)位模式。例如,需要測量輸入到TI1上的PWM信號的長度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具體步驟如下(取決于CK_INT的頻率和預(yù)分頻器的值):1)選擇TIMx_CCR1的有效輸入:置TIMx_CCMR1寄存器的CC1S=01(選擇TI1)。2)選擇TI1FP1的有效極性(用來捕獲數(shù)據(jù)到TIMx_CCR1中和清除計數(shù)器):置CC1P=0(上升沿有效)。3)選擇TIMx_CCR2的有效輸入:置TIMx_CCMR1寄存器的CC2S=10(選擇144784)選擇T11FP2的有效極性(捕獲數(shù)據(jù)到TIMx_CCR2):置CC2P=1(下降沿有效)。5)選擇有效的觸發(fā)輸入信號:置TIMx_SMCR寄存器中的TS=101(選擇TI1FP1)。6)配置從模式控制器為復(fù)位模式:置TIMx_SMCR中的SMS=100。7)使能捕獲:置TIMx_CCER寄存器中CC1E=1且CC2E=1。3.強置輸出模式在輸出模式(TIMx_CCMRx寄存器中CCxS=00)下,輸出比較信號(OCxREF和相應(yīng)的OCx)能夠直接由軟件強置為有效或無效狀態(tài),而不依賴于輸出比較寄存器和計數(shù)器間的比較結(jié)果。置TIMx_CCMRx寄存器中相應(yīng)的OCxM=101,即可強置輸出比較信號(OCxREF/OCx)為有效狀態(tài)。這樣OCxREF被強置為高電平(OCxREF始終為高電平有效),同時OCx得到CCxP極性位相反的值。例如,CCxP=0(OCx高電平有效),則OCx被強置為高電平。置TIMx_CCMRx寄存器中的OCxM=100,可強置OCxREF信號為低。該模式下,在TIMx_CCRx影子寄存器和計數(shù)器之間的比較仍然在進行,相應(yīng)的標(biāo)志也會被修改。因此仍然會產(chǎn)生相應(yīng)的中斷和DMA請求。4.輸出比較模式此項功能是用來控制一個輸出波形,或者指示一段給定的的時間已經(jīng)到時。當(dāng)計數(shù)器與捕獲/比較寄存器的內(nèi)容相同時,輸出比較功能做如下操作:1)將輸出比較模式(TIMx_CCMRx寄存器中的OCxM位)和輸出極性(TIMx_CCER寄存器中的CCxP位)定義的值輸出到對應(yīng)的引腳上。在比較匹配時,輸出引腳可以保持它的電平(OCxM=000)、被設(shè)置成有效電平(OCxM=001)、被設(shè)置成無效電平OCxM=010)或進行翻轉(zhuǎn)(OCxM=011)。2)設(shè)置中斷狀態(tài)寄存器中的標(biāo)志位(TIMx_SR寄存器中的CCxIF位)。3)若設(shè)置了相應(yīng)的中斷屏蔽(TIMx_DIER寄存器中的CCxIE位),則產(chǎn)生一個中斷,4)若設(shè)置了相應(yīng)的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存著中的CCDS位選擇DMA請求功能),則產(chǎn)生一個DMA請求。輸出比較模式的配置步驟:①選擇計數(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寄存器能夠在任何時候通過軟件進行更新以控制輸出波形,條件是未使用預(yù)裝載寄存器(OCxPE=0,否則TIMx_CCRx影子寄存器只能在發(fā)生下一次更新事件時被更新)。5.PWM模式PWM輸出模式是一種特殊的輸出模式,在電力、電子和電機控制領(lǐng)域得到廣泛應(yīng)用。1)PWM簡介PWM是PulseWidthModulation的縮寫,中文意思就是脈沖寬度調(diào)制,簡稱脈寬調(diào)制。它是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù),其控制簡單、靈活和動態(tài)響應(yīng)好等優(yōu)點而成為電力、電子技術(shù)最廣泛應(yīng)用的控制方式,其應(yīng)用領(lǐng)域包括測量、通信、功率控制與變換,電動機控制、伺服控制、調(diào)光、開關(guān)電源,甚至某些音頻放大器,因此研究基于PWM技術(shù)的正負脈寬數(shù)控調(diào)制信號發(fā)生器具有十分重要的現(xiàn)實意義,PWM是一種對模擬信號電平進行數(shù)字編碼的方法。通過高分辨率計數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體模擬信號的電平進行編碼。PWM信號仍然是數(shù)字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF),電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加載到模擬負載上去的。通的時候即是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM進行編碼。2)PWM實現(xiàn)目前,在運動控制系統(tǒng)或電動機控制系統(tǒng)中實現(xiàn)PWM的方法主要有傳統(tǒng)的數(shù)字電路、微控制器普通I/O模擬和微控制器的PWM直接輸出等。①傳統(tǒng)的數(shù)字電路方式:用傳統(tǒng)的數(shù)字電路實現(xiàn)PWM(如555定時器),電路設(shè)計較復(fù)雜,體積大,抗干擾能力差,系統(tǒng)的研發(fā)周期較長。②微控制器普通I/O模擬方式:對于微控制器中無PWM輸出功能情況(如51單片機),可以通過CPU操控普通I/O口來實現(xiàn)PWM輸出。但這樣實現(xiàn)PWM將消耗大量的時間,大大降低CPU的效率,而且得到的PWM的信號精度不太高。③微控制器的PWM直接輸出方式:對于具有PWM輸出功能的微控制器,在進行簡單的配置后即可在微控制器的指定引腳上輸出PWM脈沖。這也是目前使用最多的PWM實現(xiàn)方式。STM32F103就是這樣一款具有PWM輸出功能的微控制器,除了基本定時器TIM6和TIM7。其他的定時器都可以用來產(chǎn)生PWM輸出。其中高級定時器TIM1和TIM8可以同時產(chǎn)生多達7路的PWM輸出。而通用定時器也能同時產(chǎn)生多達4路的PWM輸出,STM32最多可以同時產(chǎn)生30路PWM輸出。3)PWM輸出模式的工作過程STM32F103微控制器脈沖寬度調(diào)制模式可以產(chǎn)生一個由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號,其產(chǎn)生原理如圖6-12所示。圖6-12STM32F103微控制器PWM產(chǎn)生原理通用定時器PWM輸出模式的工作過程如下:①若配置脈沖計數(shù)器TIMx_CNT為向上計數(shù)模式,自動重裝載寄存器TIMx_ARR的預(yù)設(shè)為N,則脈沖計數(shù)器TIMx_CNT的當(dāng)前計數(shù)值X在時鐘CK_CNT(通常由TIMACLK經(jīng)TIMx_PSC分頻而得)的驅(qū)動下從0開始不斷累加計數(shù)。②在脈沖計數(shù)器TIMx_CNT隨著時鐘CK_CNT觸發(fā)進行累加計數(shù)的同時,脈沖計數(shù)M_CNT的當(dāng)前計數(shù)值x與抽獲/比較寄存器TIMx_CCR的預(yù)設(shè)值A(chǔ)進行比較;如果X<A,輸出高電平(或低電平);如果X≥A,輸出低電平(或高電平)。③當(dāng)脈沖計數(shù)器TIMx_CNT的計數(shù)值X大于自動重裝載寄存器TIMXARR的m值N時,膚沖計數(shù)器TIMx_CNT的計數(shù)值清零并重新開始計數(shù)。如此循環(huán)往復(fù),得到的PWM的輸出信號周期為(N+1)xTCK_CNT,其中,N為自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值,TCK_CNT為時鐘CK_CNT的周期。PWM輸出信號脈沖寬度為AXTCKCNT,其中,A為捕獲/比較寄存器TIMx_CCR的預(yù)設(shè)值,TCK_CNT為時鐘CK_CNT的周期。PWM輸出信號的占空比為A/(N+1)。下面舉例具體說明,當(dāng)通用定時器被設(shè)置為向上計數(shù),自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值為8,4個捕獲/比較寄存器TIMx_CCRx分別設(shè)為0、4、8和大于8時,通過用定時器的4個PWM通道的輸出時序OCxREF和觸發(fā)中斷時序CCxIF,如圖6-13所示。例如,在TIMx_CCR=4情況下,當(dāng)TIMx_CNT<4時,OCxREF輸出高電平;當(dāng)TIMx_CNT≥4時,OCxREF輸出低電平,并在比較結(jié)果改變時觸發(fā)CCxIF中斷標(biāo)志。此PWM的占空比為4/(8+1)。圖6-13向上計數(shù)模式PWM輸出時序圖需要注意的是,在PWM輸出模式下,脈沖計數(shù)器TIMx_CNT的計數(shù)模式有向上計數(shù)、向下計數(shù)和向上/向下計數(shù)(中央對齊)3種。以上僅介紹其中的向上計數(shù)方式,但是讀者在掌握了通用定時器向上計數(shù)模式的PWM輸出原理后,由此及彼,通用定時器的其他兩種計數(shù)模式的PWM輸出也就容易推出了。現(xiàn)將STM32F103通用定時器相關(guān)寄存器名稱介紹如下,可以用半字(16位)或字(位)的方式操作這些外設(shè)寄存器,由于是采用庫函數(shù)方式編程,故不做進一步的探討。1)控制寄存器1(TIMx_CR1)。2)控制寄存器2(TIMx_CR2)。3)從模式控制寄存器(TIMx_SMCR)。4)DMA/中斷使能寄存器(TIMx_DIER)。5)狀態(tài)寄存器(TIMx_SR)。6)事件產(chǎn)生寄存器(TIMx_EGR)。7)捕獲/比較模式寄存器1(TIMx_CCMR1)。8)捕獲/比較模式寄存器2(TIMx_CCMR2)。9)捕獲/比較使能寄存器(TIMx_CCER)。6.3.5通用定時器寄存器10)計數(shù)器(TIMx_CNT)。11)預(yù)分頻器(TIMx_PSC)。12)自動重裝載寄存器(TIMx_ARR)。13)捕獲/比較寄存器1(TIMx_CCR1)。14)捕獲/比較寄存器2(TIMx_CCR2)。15)捕獲/比較寄存器3(TIMx_CCR3)。16)捕獲/比較寄存器4(TIMx_CCR4)。17)DMA控制寄存器(TIMx_DCR)。18)連續(xù)模式的DMA地址(TIMx_DMAR)。6.4高級定時器高級控制定時器(TIM1和TIM8)由一個16位的自動裝載計數(shù)器組成,它由一個可編程的預(yù)分頻器驅(qū)動,適合多種用途,包含測量輸入信號的脈沖寬度(輸入捕獲),或者產(chǎn)生輸出波形(輸出比較、PWM、嵌入死區(qū)時間的互補PWM等)。使用定時器預(yù)分頻器和RCC時鐘控制預(yù)分頻器,可以實現(xiàn)脈沖寬度和波形周期從幾微秒到幾毫秒的調(diào)節(jié)。高級控制定時器(TIM1和TIM8)和通用定時器(TIMx)是完全獨立的,它們不共享任何資源,可以同步操作。9.4.2高級定時器特性6.4.1高級定時器簡介TIM1和TIM8定時器的功能包括:1)16位向上、向下、向上/下自動裝載計數(shù)器。2)16位可編程(可以實時修改)預(yù)分頻器,計數(shù)器時鐘頻率的分頻系數(shù)為1~65536之間的任意數(shù)值。3)多達4個獨立通道:輸入捕獲、輸出比較、PWM生成(邊緣或中間對齊模式)、單脈沖模式輸出。4)死區(qū)時間可編程的互補輸出。5)使用外部信號控制定時器和定時器互聯(lián)的同步電路。6)允許在指定數(shù)目的計數(shù)器周期之后更新定時器寄存器的重復(fù)計數(shù)器。7)剎車輸入信號可以將定時器輸出信號置于復(fù)位狀態(tài)或者一個已知狀態(tài)。8)如下事件發(fā)生時產(chǎn)生中斷/DMA:①更新,計數(shù)器向上溢出/向下溢出,計數(shù)器初始化。②觸發(fā)事件(計數(shù)器啟動、停止、初始化或者由內(nèi)部/外部觸發(fā)計數(shù))。③輸入捕獲。④輸出比較。⑤剎車信號輸入。9)支持針對定位的增量(正交)編碼器和霍爾傳感器電路。10)觸發(fā)輸入作為外部時鐘或者按周期的電流管理。STM32F103高級定時器的內(nèi)部結(jié)構(gòu)要比通用定時器復(fù)雜一些,但其核心仍然與基本定時器、通用定時器相同,是一個由可編程的預(yù)分頻器驅(qū)動的具有自動重裝載功能的16位計數(shù)器。與通用定時器相比,STM32F103高級定時器主要多了BRK和DTG兩個結(jié)構(gòu),因而具有了死區(qū)時間的控制功能。因為高級定時器的特殊功能,在普通應(yīng)用中一般較少使用,所以不作為本書討論的重點,如需詳細了解可以查閱STM32中文參考手冊。6.4.2高級定時器結(jié)構(gòu)6.5定時器庫函數(shù)TIM固件庫支持72種庫函數(shù),如表6-2所示。為了理解這些函數(shù)的具體使用方法,本節(jié)將對其中的部分庫函數(shù)做詳細介紹。STM32F10x的定時器庫函數(shù)存放在STM32F10x標(biāo)準外設(shè)庫的STM32F10x_tim.h和STM32F10x_tim.c文件中。其中,頭文件STM32F10x_tim.h用來存放定時器相關(guān)結(jié)構(gòu)體和宏定義以及定時器庫函數(shù)聲明,源代碼文件STM32F10x_tim.c用來存放定時器庫函數(shù)定義。函數(shù)名稱功能TIM_DeInit將外設(shè)TIMx寄存器重設(shè)為缺省值TIM_TimeBaseInit根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù),初始化TIMx的時間基數(shù)單位TIM_OCInit根據(jù)TIM_OCInitStruct中指定的參數(shù),初始化外設(shè)TIMxTIM_ICInit根據(jù)TIM_ICInitStruct中指定的參數(shù),初始化外設(shè)TIMxTIM_TimeBaseStructInit把TIM_TimeBaseInitStruct中的每一個參數(shù)按缺省值填入TIM_OCStructInit把TIM_OCInitStruct中的每一個參數(shù)按缺省值填入TIM_ICStructInit把TIM_ICInitStruct中的每一個參數(shù)按缺省值填入TIM_Cmd使能或者失能TIMx外設(shè)TIM_ITConfig使能或者失能指定的TIM中斷TIM_DMAConfig設(shè)置TIMx的DMA接口TIM_DMACmd使能或者失能指定的TIMx的DMA請求TIM_InternalClockConfig設(shè)置TIMx內(nèi)部時鐘TIM_ITRxExternalClockConfig設(shè)置TIMx內(nèi)部觸發(fā)為外部時鐘模式TIM_TIxExternalClockConfig設(shè)置TIMx觸發(fā)為外部時鐘TIM_ETRClockMode1Config配置TIMx外部時鐘模式1TIM_ETRClockMode2Config配置TIMx外部時鐘模式2TIM_ETRConfig配置TIMx外部觸發(fā)TIM_SelectInputTrigger選擇TIMx輸入觸發(fā)源表6-2TIM庫函數(shù)函數(shù)名稱功能TIM_PrescalerConfig設(shè)置TIMx預(yù)分頻TIM_CounterModeConfig設(shè)置TIMx計數(shù)器模式TIM_ForcedOC1Config置TIMx輸出1為活動或者非活動電平TIM_ForcedOC2Config置TIMx輸出2為活動或者非活動電平TIM_ForcedOC3Config置TIMx輸出3為活動或者非活動電平TIM_ForcedOC4Config置TIMx輸出4為活動或者非活動電平TIM_ARRPreloadConfig使能或者失能TIMx在ARR上的預(yù)裝載寄存器TIM_SelectCCDMA選擇TIMx外設(shè)的捕獲比較DMA源TIM_OC1PreloadConfig使能或者失能TIMx在CCR1上的預(yù)裝載寄存器TIM_OC2PreloadConfig使能或者失能TIMx在CCR2上的預(yù)裝載寄存器TIM_OC3PreloadConfig使能或者失能TIMx在CCR3上的預(yù)裝載寄存器TIM_OC4PreloadConfig使能或者失能TIMx在CCR4上的預(yù)裝載寄存器TIM_OC1FastConfig設(shè)置TIMx捕獲/比較1快速特征TIM_OC2FastConfig設(shè)置TIMx捕獲/比較2快速特征TIM_OC3FastConfig設(shè)置TIMx捕獲/比較3快速特征TIM_OC4FastConfig設(shè)置TIMx捕獲/比較4快速特征TIM_ClearOC1Ref在一個外部事件時清除或者保持OCREF1信號TIM_ClearOC2Ref在一個外部事件時清除或者保持OCREF2信號表6-2TIM庫函數(shù)(續(xù)表1)函數(shù)名稱功能TIM_ClearOC3Ref在一個外部事件時清除或者保持OCREF3信號TIM_ClearOC4Ref在一個外部事件時清除或者保持OCREF4信號TIM_UpdateDisableConfig使能或者失能TIMx更新事件TIM_EncoderInterfaceConfig設(shè)置TIMx編碼界面TIM_GenerateEvent設(shè)置TIMx事件由軟件產(chǎn)生TIM_OC1PolarityConfig設(shè)置TIMx通道1極性TIM_OC2PolarityConfig設(shè)置TIMx通道2極性TIM_OC3PolarityConfig設(shè)置TIMx通道3極性TIM_OC4PolarityConfig設(shè)置TIMx通道4極性TIM_UpdateRequestConfig設(shè)置TIMx更新請求源TIM_SelectHallSensor使能或者失能TIMx霍爾傳感器接口TIM_SelectOnePulseMode設(shè)置TIMx單脈沖模式TIM_SelectOutputTrigger選擇TIMx觸發(fā)輸出模式TIM_SelectSlaveMode選擇TIMx從模式TIM_SelectMasterSlaveMode設(shè)置或重置TIMx主/從模式TIM_SetCounter設(shè)置TIMx計數(shù)器寄存器值TIM_SetAutoreload設(shè)置TIMx自動重裝載寄存器值TIM_SetCompare1設(shè)置TIMx捕獲/比較1寄存器值表6-2TIM庫函數(shù)(續(xù)表2)函數(shù)名稱功能TIM_SetCompare2設(shè)置TIMx捕獲/比較2寄存器值TIM_SetCompare3設(shè)置TIMx捕獲/比較3寄存器值TIM_SetCompare4設(shè)置TIMx捕獲/比較4寄存器值TIM_SetIC1Prescaler設(shè)置TIMx輸入捕獲1預(yù)分頻TIM_SetIC2Prescaler設(shè)置TIMx輸入捕獲2預(yù)分頻TIM_SetIC3Prescaler設(shè)置TIMx輸入捕獲3預(yù)分頻TIM_SetIC4Prescaler設(shè)置TIMx輸入捕獲4預(yù)分頻TIM_SetClockDivision設(shè)置TIMx的時鐘分割值TIM_GetCapture1獲得TIMx輸入捕獲1的值TIM_GetCapture2獲得TIMx輸入捕獲2的值TIM_GetCapture3獲得TIMx輸入捕獲3的值TIM_GetCapture4獲得TIMx輸入捕獲4的值TIM_GetCounter獲得TIMx計數(shù)器的值TIM_GetPrescaler獲得TIMx預(yù)分頻值TIM_GetFlagStatus檢查指定的TIM標(biāo)志位設(shè)置與否TIM_ClearFlag清除TIMx的待處理標(biāo)志位TIM_GetITStatus檢查指定的TIM中斷發(fā)生與否TIM_ClearITPendingBit清除TIMx的中斷待處理位表6-2TIM庫函數(shù)(續(xù)表3)1.函數(shù)TIM_DeInit函數(shù)名:TIM_DeInit。函數(shù)原型:voidTIM_DeInit(TIM_TypeDef*TIMx)。功能描述:將外設(shè)TIMx寄存器重設(shè)為缺省值。輸入?yún)?shù):TIMx:x可以是1~8,用來選擇TIM外設(shè)。輸出參數(shù):無。。返回值:無例如:/*ResetstheTIM2*/TIM_DeInit(TIM2);2.函數(shù)TIM_TimeBaseInit函數(shù)名:TIM_TimeBaseInit。函數(shù)原型:voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)。功能描述:根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位。輸入?yún)?shù)1:TIMx:x可以是1~8,用來選擇TIM外設(shè)。輸入?yún)?shù)2:TIMTimeBase_InitStruct:指向結(jié)構(gòu)TIM_TimeBaseInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù):無。返回值:無。例如:TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period=0xFFFF;TIM_TimeBaseStructure.TIM_Prescaler=0xF;TIM_TimeBaseStructure.TIM_ClockDivision=0x0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);3.函數(shù)TIM_OC1Init函數(shù)名:TIM_OC1Init。函數(shù)原型:voidTIM_OC1Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct)。功能描述:根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化TIMx通道1。輸入?yún)?shù)1:TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù):無。返回值:無。例如:/*ConfigurestheTIM1ChannellinPWMMode*/TIM_OCInitTypeDefTIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIMOCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_Pulse=0x7FF;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;TIM_OC1Init(TIM1,&TIM_OCInitStructure);4.函數(shù)TIM_OC2Init函數(shù)名:TIM_OC2Init。函數(shù)原型:voidTIM_OC2Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct)。功能描述:根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化TIMx通道2。輸入?yún)?shù)1:TIMx,x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù):無。返回值:無。5.函數(shù)TIM_OC3Init函數(shù)名:TIM_OC3Init。函數(shù)原型:voidTIM_OC3Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct)。功能描述:根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化TIMx通道3。輸入?yún)?shù)1:TIMx,x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù):無。返回值:無。6.函數(shù)TIM_OC4Init函數(shù)名:TIM_OC4Init。函數(shù)原型:voidTIM_OC4Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct)。功能描述:根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化TIMx通道4。輸入?yún)?shù)1:TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù):無。返回值:無。7.函數(shù)TIM_Cmd函數(shù)名:TIM_Cmd。函數(shù)原型:voidTIM_Cmd(TIM_TypeDef*TIMx,F(xiàn)unctionalStateNewState)。功能描述:使能或者失能TIMx外設(shè)。輸入?yún)?shù)1:TIMx,x可以是1~8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:NewState,外設(shè)TIMx的新狀態(tài)。這個參數(shù)可以取:ENABLE或者DISABLE。輸出參數(shù):無。返回值:無。例如:/*EnablestheTIM2counter*/TIM_Cmd(TIM2,ENABLE);8.函數(shù)TIM_ITConfig函數(shù)名:TIM_ITConfig。函數(shù)原型:voidTIM_ITConfig(TIM_TypeDef*TIMx,u16TIM_IT,F(xiàn)unctionalStateNewState)。功能描述:使能或者失能指定的TIM中斷。輸入?yún)?shù)1:TIMx:x可以是1~8,用來選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_IT:待使能或者失能的TIM中斷源。輸入?yún)?shù)3:NewState:TIMx中斷的新狀態(tài),這個參數(shù)可以?。篍NABLE或者DISABLE。輸出參數(shù):無。返回值:無。例如:/*EnablestheTIM2CaptureComparechannel1Interruptsource*/TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);9.函數(shù)TIM_OC1PreloadConfig函數(shù)名:TIM_OC1PreloadConfig。函數(shù)原型:voidTIM_OC1PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)。功能描述:使能或者失能TIMx在CCR1上的預(yù)裝載寄存器。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCPreload,出比較預(yù)裝載狀態(tài)。輸出參數(shù):無。返回值:無。例如:/*EnablestheTIM2PreloadonCC1Register*/TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);10.函數(shù)TIM_OC2PreloadConfig函數(shù)名:TIM_OC2PreloadConfig。函數(shù)原型:voidTIM_OC2PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)。功能描述:使能或者失能TIMx在CCR2上的預(yù)裝載寄存器。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCPreload,出比較預(yù)裝載狀態(tài)。輸出參數(shù):無。返回值:無。例如:/*EnablestheTIM2PreloadonCC2Register*/TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);11.函數(shù)TIM_OC3PreloadConfig函數(shù)名:TIM_OC3PreloadConfig。函數(shù)原型:voidTIM_OC3PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)。功能描述:使能或者失能TIMx在CCR3上的預(yù)裝載寄存器。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCPreload,出比較預(yù)裝載狀態(tài)。輸出參數(shù):無。返回值:無。例如:/*EnablestheTIM2PreloadonCC3Register*/TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);12.函數(shù)TIM_OC4PreloadConfig函數(shù)名:TIM_OC4PreloadConfig。函數(shù)原型:voidTIM_OC4PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)。功能描述:使能或者失能TIMx在CCR4上的預(yù)裝載寄存器。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_OCPreload,出比較預(yù)裝載狀態(tài)。輸出參數(shù):無,返回值:無,例如:/*EnablestheTIM2PreloadonCC4Register*/TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);13.函數(shù)TIM_GetFlagStatus函數(shù)名:TIM_GetFlagStatus。函數(shù)原型:FlagStatusTIM_GetFlagStatus(TIM_TypeDef*TIMx,u16TIM_FLAG)。功能描述:檢查指定的TIM標(biāo)志位設(shè)置與否。輸入?yún)?shù)1:TIMx,以是1~8,用來選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_FLAG,檢查的TIM標(biāo)志位。輸出參數(shù):無。返回值:TIM_FLAG的新狀態(tài)(SET或者RESET)。例如:/*CheckiftheTIM2CaptureCompare1flagissetorreset*/if(TIM_GetFlagStatus(TIM2,TIM_FLAG_CC1)==SET){
}14.函數(shù)TIM_ClearFlag函數(shù)名:TIM_ClearFlag。函數(shù)原型:voidTIM_ClearFlag(TIM_TypeDef*TIMx,uint16_tTIM_FLAG)。功能描述:清除TIMx的待處理標(biāo)志位。輸入?yún)?shù)1:TIMx,可以是1~8,用來選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_FLAG,清除的TIM標(biāo)志位。輸出參數(shù):無。返回值:無。例如:/*CleartheTIM2CaptureCompare1flag*/TIM_ClearFlag(TIM2,TIM_FLAG_CC1);15.函數(shù)TIM_GetITStatus函數(shù)名:TIM_GetITStatus。函數(shù)原型:ITStatusTIM_GetITStatus(TIM_TypeDef*TIMx,u16TIM_IT)。功能描述:檢查指定的TIM中斷發(fā)生與否。輸入?yún)?shù)1:TIMx,可以是1~8,用來選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_IT,檢查的TIM中斷源。輸出參數(shù):無。返回值:TIM_IT的新狀態(tài)。例如:/*CheckiftheTIN2CaptureCompare1interrupthasoccuredornot*/if(TIM_GetITStatus(TIM2,TIM_IT_CC1)==SET){}16.函數(shù)TIM_ClearITPendingBit函數(shù)名:TIM_ClearITPendingBit。函數(shù)原型:voidTIM_ClearITPendingBit(TIM_TypeDef*TIMx,u16TIM_IT)。功能描述:清除TIMx的中斷待處理位。輸入?yún)?shù)1:TIMx,可以是1~8,用來選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_IT,檢查的TIM中斷待處理位。輸出參數(shù):無。返回值:無。例如:/*CleartheTIM2CaptureCompare1interruptpendingbit*/TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);17.函數(shù)TIM_SetComparel函數(shù)名:TIM_SetCompare1。函數(shù)原型:voidTIM_SetCompare1(TIM_TypeDef*TIMx,u16Compare1)。功能描述:設(shè)置TIMx捕獲比較1寄存器值。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:Compare1,獲比較1寄存器新值。輸出參數(shù):無。返回值:無。例如:/*SetstheTIM2newOutputCompare1value*/u16TIMCompare1=0x7FFF;TIM_SetComparel(TIM2,TIMCompare1);18.函數(shù)TIM_SetCompare2函數(shù)名:TIM_SetCompare2。函數(shù)原型:voidTIM_SetCompare2(TIM_TypeDef*TIMx,u16Compare2)。功能描述:設(shè)置TIMx捕獲比較2寄存器值。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:Compare2,獲比較2寄存器新值。輸出參數(shù):無。返回值:無。19.函數(shù)TIM_SetCompare3函數(shù)名:TIM_SetCompare3。函數(shù)原型:voidTIM_SetCompare3(TIM_TypeDef*TIMx,u16Compare3)。功能描述:設(shè)置TIMx捕獲比較3寄存器值。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:Compare3,獲比較3寄存器新值。輸出參數(shù):無。返回值:無。20.函數(shù)TIM_SetCompare4函數(shù)名:TIM_SetCompare4。函數(shù)原型:voidTIM_SetCompare4(TIM_TypeDef*TIMx,u16Compare4)。功能描述:設(shè)置TIMx捕獲比較4寄存器值。輸入?yún)?shù)1:TIMx,可以是1、2、3、4、5或8,用于選擇TIM外設(shè)。輸入?yún)?shù)2:Compare4,獲比較4寄存器新值。輸出參數(shù):無。返回值:無。6.6定時器應(yīng)用實例通用定時器具有多種功能,但其原理大致相同,但其流程有所區(qū)別,以使用中斷方式為例,主要包括三部分,即NVIC設(shè)置、TIM中新配管、定封器中新服務(wù)程序。1.NVIC設(shè)置NVIC設(shè)置用來完成中斷分組、中斷通道選擇、中斷優(yōu)先級設(shè)置及使能中斷的功能,其流程圖如圖4-5所示。其中,值得注意的是通道的選擇,對于不同的定時器,不同事件發(fā)生時產(chǎn)生不同的中斷請求,針對不同的功能要選擇相應(yīng)的中斷通道。6.6.1通用定時器配置流程2.TIM中斷配置TIM中斷配置用來配置定時器時基及開啟中新。TIM中斷配置流程圖如圖6-14所示。高級控制定時器使用的是APB2總線,基本定時器和通用定時器使用APB1總線采用相應(yīng)函數(shù)開啟時種。預(yù)分頻將輸入時鐘頻率按1~65536之間的值任意分頻。分頻值決定了計數(shù)頻率。計效值為計數(shù)的個數(shù),當(dāng)計數(shù)寄存器的值達到計數(shù)值時,嚴生溢出,發(fā)生中斷。如TIM1系統(tǒng)時鐘為72MHz,若設(shè)定的預(yù)分頻TIM_Prescaler=7200-1。計教值TIM_Period=10000,則計數(shù)時鐘周期(TIM_Pescaler+1)/72MHz=0.1ms,定時器產(chǎn)生10000x0.1ms=1000ms的定時、每1s產(chǎn)生一次中斷。計數(shù)模式可以設(shè)置為向上計數(shù)、向下計數(shù)對向上向下計數(shù),設(shè)置好時基參數(shù)后,調(diào)用函數(shù)TIM_TimeBaseInt()完成時基設(shè)置。為了避免在設(shè)置時進入中斷,這里需要清除中斷標(biāo)志。如設(shè)置為向上計數(shù)模式,則調(diào)用函數(shù)TIM_ClearFlag(TIM1,TIM_FLAG_Update)清除向上溢出中斷標(biāo)志。中斷在使用時必須使能,如向上溢出中斷,則需調(diào)用函數(shù)TIM_ITConfig()。不同的模式其參數(shù)不同,如向上計數(shù)模式時為TIM_ITConfig(TIM1,TIMIT_Update,ENABLE)。在需要的時候使用函數(shù)TIM_CMD()開啟定時器。圖6-14TIM中斷配置流程圖3.定時器中斷處理程序進入定時器中斷后需根據(jù)設(shè)計完成響應(yīng)操作,定時器中斷處理流程如圖6-15所示。在啟動文件中定義了定時器中斷的入口,對于不同的中斷請求要采用相應(yīng)的中斷函數(shù)名,程序代碼如下:DCDTIM1_BRK_IRQHandler;TIM1BreakDCDTIM1_UP_IRQHandler;TIM1UpdateDCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutationDCDTIM1_CC_IRQHandler;TIM1CaptureCompareDCDTIM2_IRQHandler;TIM2DCDTIM3_IRQHandler;TIM3DCDTIM4_IRQHandler;TIM4進入中斷后,首先要檢測中斷請求是否為所需中斷,以防誤操作。如果確實是所需中斷,則進行中斷處理,中斷處理完后清除中斷標(biāo)志位,否則會一直處于中斷中。圖6-15定時器中斷處理程序流程圖本實例利用基本定時器TIM6/7定時1s,1s時間到LED翻轉(zhuǎn)一次。基本定時器是單片機內(nèi)部的資源,沒有外部IO,不需要接外部電路,只需要一個LED燈即可。6.6.2定時器應(yīng)用的硬件設(shè)計編寫兩個定時器驅(qū)動文件bsp_TiMbase.h和bsp_TiMbase.h,用來配置定時器中斷優(yōu)先級和初始化定時器。編程要點:1)開定時器時鐘TIMx_CLK,x[6,7];2)初始化時基初始化結(jié)構(gòu)體;3)使能TIMx,x[6,7]update中斷;4)打開定時器;5)編寫中斷服務(wù)程序。通用定時器和高級定時器的定時編程要點與基本定時器差不多,只是還要再選擇計算第器的計數(shù)模式,是向上還是向下。因為基本定時器只能向上計數(shù),且沒有配置計數(shù)模式的寄存器,默認是向上。6.6.3定時器應(yīng)用的軟件設(shè)計6.7SysTick系統(tǒng)滴答定時器SysTick-系統(tǒng)定時器是屬于CM3內(nèi)核中的一個外設(shè),內(nèi)嵌在NVIC中。系統(tǒng)定時器一個24位的向下遞減的計數(shù)器,計數(shù)器每計數(shù)一次的時間為1/SYSCLK,一般設(shè)置統(tǒng)時鐘SYSCLK等于72MHz。當(dāng)重裝載數(shù)值寄存器的值遞減到0的時候,系統(tǒng)定時器就發(fā)生一次中斷,以此循環(huán)往復(fù)。因為SysTick是屬于CM3內(nèi)核的外設(shè),所以所有基于CM3內(nèi)核的單片機都具有這系統(tǒng)定時器,這使得軟件在CM3單片機中可以很容易被移植。系統(tǒng)定時器一般用于操作系統(tǒng),用于產(chǎn)生時基,維持操作系統(tǒng)的心跳。6.7.1SysTick功能綜述SysTick當(dāng)計到數(shù)器到達0(0并未計完)時,將從RELOAD寄存器中自動重裝載定時初值。只要不把它在SysTick控制及狀態(tài)寄存器中的使能位清除,就永不停息。SysTick工作時序如圖6-16所示。圖6-16SysTick工作時序圖系統(tǒng)時鐘節(jié)拍(SysT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年房屋代購代理協(xié)議
- 2024年新專利保密協(xié)議范本
- 2024年文化藝術(shù)節(jié)組織與推廣合同
- 2024年房屋定金交易合同
- 2024年度技術(shù)研發(fā)合同標(biāo)的研發(fā)內(nèi)容
- 2024年新修訂:商業(yè)用地租賃與開發(fā)協(xié)議
- 2024年房產(chǎn)托管服務(wù)協(xié)議
- DB4107T 494-2022 規(guī)?;半u場疫病防治技術(shù)規(guī)范
- DB4105T 199-2022 鄉(xiāng)(鎮(zhèn))森林防火檢查站設(shè)置與管理規(guī)范
- 2024年攝影化妝配合合同
- 髂動脈潰瘍的健康宣教
- 第一章 結(jié)構(gòu)及其設(shè)計 課件-2023-2024學(xué)年高中通用技術(shù)蘇教版(2019)必修《技術(shù)與設(shè)計2》
- KPI考核表-品質(zhì)部
- Access數(shù)據(jù)庫課程標(biāo)準
- 幼兒園中班語言:《兩只蚊子吹牛皮》 課件
- 臨時用電漏電保護器運行檢測記錄表
- 頭痛的國際分類(第三版)中文
- 音樂ppt課件《小小的船》
- 幼兒園教學(xué)課件語言教育《雪地里的小畫家》
- 結(jié)構(gòu)化面試經(jīng)典100題及答案
- ESG引領(lǐng)下的西部城市再出發(fā)-新型城市競爭力策略研究白皮書
評論
0/150
提交評論