版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第09章
定時器與
脈沖寬度調(diào)制作者:黃克亞2025年5月本章概要CONTENTSSTM32F103定時器概述通用定時器定時器秒計時項目實施定時器相關(guān)庫函數(shù)基本定時器高級定時器PWM呼吸燈項目實施9.1STM32F103定時器概述微控制器中的定時器本質(zhì)上是一個計數(shù)器,可以對內(nèi)部脈沖或外部輸入進(jìn)行計數(shù),不僅具有基本的延時/計數(shù)功能,還具有輸入捕獲、輸出比較和PWM波形輸出等高級功能。9.1STM32F103定時器概述定時器概述STM32F103定時器相比于傳統(tǒng)的51單片機(jī)要完善和復(fù)雜得多,具有延時、頻率測量、PWM輸出、電機(jī)控制及編碼接口等功能。基本定時器通用定時器高級定時器STM32F103微控制器內(nèi)部集成了多個可編程定時器,可以分為基本定時器(TIM6和TIM7)、通用定時器(TIM2~TIM5)和高級定時器(TIM1、TIM8)3種類型。9.1STM32F103定時器概述定時器概述STM32F103定時器功能查詢表主要特點基本定時器通用定時器高級定時器內(nèi)部時鐘CK_INT來源APB1分頻器APB1分頻器APB2分頻器內(nèi)部預(yù)分頻器的位數(shù)(分頻范圍)16位(1~65536)16位(1~65536)16位(1~65536)內(nèi)部計數(shù)器的位數(shù)(計數(shù)范圍)16位(1~65536)16位(1~65536)16位(1~65536)更新中斷和DMA√√√計數(shù)方向↑↑、↓、↑↓↑、↓、↑↓外部事件計數(shù)x√√定時器觸發(fā)或級聯(lián)x√√4個獨立捕獲/比較通道x√√單脈沖輸出方式x√√正交編碼器輸入x√√霍爾傳感器輸入x√√剎車信號輸入xx√帶死區(qū)的PWM互補輸出xx√9.2基本定時器基本定時器只有定時一個功能,結(jié)構(gòu)簡單、使用方便。9.2基本定時器9.2.1基本定時器簡介STM32F103基本定時器TIM6和TIM7各包含一個16位自動裝載計數(shù)器,由各自的可編程預(yù)分頻器驅(qū)動。它們可以為通用定時器提供時間基準(zhǔn),特別地可以為數(shù)模轉(zhuǎn)換器(DAC)提供時鐘。9.2.2基本定時器的主要特性TIM6和TIM7定時器的主要功能包括:■
16位自動重裝載累加計數(shù)器■16位可編程(可實時修改)預(yù)分頻器,即用于輸入的時鐘按系數(shù)為1~65536之間的任意數(shù)值分頻。■
觸發(fā)DAC的同步電路■
在更新事件(計數(shù)器溢出)時產(chǎn)生中斷/DMA請求9.2基本定時器基本定時器結(jié)構(gòu)框圖9.2基本定時器9.2.3基本定時器的功能這個可編程定時器的主要部分是一個帶有自動重裝載的16位累加計數(shù)器,計數(shù)器的時鐘通過一個預(yù)分頻器得到。軟件可以讀寫計數(shù)器(TIMx_CNT)、自動重裝載寄存器(TIMx_ARR)和預(yù)分頻寄存器(TIMx_PSC),即使計數(shù)器運行時也可以操作。1.時基單元從STM32F103基本定時器內(nèi)部結(jié)構(gòu)圖可以看出,基本定時器TIM6和TIM7只有一個時鐘源,即內(nèi)部時鐘CK_INT。基本定時器TIM6和TIM7的TIMxCLK來源于APB1預(yù)分頻器的輸出,系統(tǒng)默認(rèn)情況下,APB1的時鐘頻率為36MHz,而掛接在APB1總線的TIMxCLK的頻率是APB1總線頻率的2倍,即72MHz。2.時鐘源9.2基本定時器9.2.3基本定時器的功能預(yù)分頻可以以系數(shù)介于1至65536之間的任意數(shù)值對計數(shù)器時鐘分頻。它是通過一個16位寄存器(TIMx_PSC)的計數(shù)實現(xiàn)分頻。因為TIMx_PSC控制預(yù)分頻寄存器具有緩沖作用,可以在運行過程中改變它的數(shù)值,新的預(yù)分頻數(shù)值將在下一個更新事件中起作用。3.預(yù)分頻器預(yù)分頻系數(shù)從1變到2的計數(shù)器時序圖9.2基本定時器9.2.3基本定時器的功能STM32F103基本定時器只有向上計數(shù)工作模式,其工作過程如圖所示,其中↑表示產(chǎn)生溢出事件。4.計數(shù)模式向上計數(shù)模式基本定時器工作時,脈沖計數(shù)器TIMx_CNT從0累加計數(shù)到自動重裝載數(shù)值(TIMx_ARR寄存器),然后重新從0開始計數(shù)并產(chǎn)生一個計數(shù)器溢出事件。由此可見,如果使用基本定時器進(jìn)行延時,延時時間可以由以下公式計算:延時時間=(TIMx_ARR+1)X(TIMx_PSC+1)/TIMxCLK9.2基本定時器9.2.3基本定時器的功能計數(shù)器時序圖(內(nèi)部時鐘分頻系數(shù)為1)計數(shù)器時序圖(內(nèi)部時鐘分頻系數(shù)為2)延時時間計算公式:延時時間=(TIMx_ARR+1)×(TIMx_PSC+1)/TIMxCLK9.2基本定時器9.2.4基本定時器寄存器現(xiàn)將STM32F103基本定時器相關(guān)寄存器名稱介紹如下,可以用半字(16位)或字(32位)的方式操作這些外設(shè)寄存器,由于我們是采用庫函數(shù)方式編程,故不作進(jìn)一步的探討。■TIM6和TIM7控制寄存器1(TIMx_CR1)■TIM6和TIM7控制寄存器2(TIMx_CR2)■TIM6和TIM7DMA/中斷使能寄存器(TIMx_DIER)■TIM6和TIM7狀態(tài)寄存器(TIMx_SR)■TIM6和TIM7事件產(chǎn)生寄存器(TIMx_EGR)■TIM6和TIM7計數(shù)器(TIMx_CNT)■TIM6和TIM7預(yù)分頻器(TIMx_PSC)■TIM6和TIM7自動重裝載寄存器(TIMx_ARR)9.3通用定時器與基本定時器相比,STM32F103微控制器通用定時器數(shù)量多,功能強,除具備基本的定時功能外,還可用于測量輸入脈沖的頻率和脈沖寬度以及輸出PWM波形等場合,還具有編碼器接口。9.3通用定時器9.3.1通用定時器簡介通用定時器(TIM2、TIM3、TIM4和TIM5)是一個通過可編程預(yù)分頻器驅(qū)動的16位自動裝載計數(shù)器構(gòu)成。它適用于多種場合,包括測量輸入信號的脈沖長度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)。使用定時器預(yù)分頻器和RCC時鐘控制器預(yù)分頻器,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調(diào)整。每個定時器都是完全獨立的,沒有互相共享任何資源。它們可以一起同步操作。9.3通用定時器9.3.2通用定時器主要功能通用TIMx(TIM2、TIM3、TIM4和TIM5)定時器功能包括:■16位向上、向下、向上/向下自動裝載計數(shù)器。■16位可編程(可以實時修改)預(yù)分頻器。■4個獨立通道:◆
輸入捕獲◆
輸出比較◆
PWM生成◆
單脈沖模式輸出■
使用外部信號控制定時器和定時器互連的同步電路。■
如下事件發(fā)生時產(chǎn)生中斷/DMA:◆
更新:◆
觸發(fā)事件◆
輸入捕獲◆
輸出比較■
支持針對定位的增量(正交)編碼器和霍爾傳感器電路。■
觸發(fā)輸入作為外部時鐘或者按周期的電流管理。9.3通用定時器9.3.3通用定時器功能描述通用定時器內(nèi)部結(jié)構(gòu)如圖所示,相比于基本定時器其內(nèi)部結(jié)構(gòu)要復(fù)雜多,其中最顯著的地方就是增加了4個捕獲/比較寄存器TIMx_CCR,這也是通用定時器之所以擁有那么多強大功能的原因。9.3通用定時器9.3.3通用定時器功能描述可編程通用定時器的主要部分是一個16位計數(shù)器和與其相關(guān)的自動裝載寄存器。這個計數(shù)器可以向上計數(shù)、向下計數(shù)或者向上向下雙向計數(shù)。時基單元包含:計數(shù)器寄存器(TIMx_CNT)、預(yù)分頻器寄存器(TIMx_PSC)和自動裝載寄存器(TIMx_ARR)。1.時基單元PSC預(yù)分頻器可以將計數(shù)器的時鐘頻率按1~65536之間的任意值分頻。它是基于一個(在TIMx_PSC寄存器中的)16位寄存器控制的16位計數(shù)器。具有緩沖作用,可以在運行過程中改變它的數(shù)值,新的預(yù)分頻數(shù)值將在下一個更新事件中起作用。9.3通用定時器9.3.3通用定時器功能描述向上計數(shù)模式
計數(shù)器在時鐘CK_CNT的驅(qū)動下從0計數(shù)到自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值,然后重新從0開始計數(shù),并產(chǎn)生一個計數(shù)器溢出事件,可觸發(fā)中斷或DMA請求。當(dāng)發(fā)生一個更新事件時,所有的寄存器都被更新,硬件同時設(shè)置更新標(biāo)志位。2.計數(shù)模式工作在向上計數(shù)模式下的通用定時器,當(dāng)自動重裝載寄存器TIMx_ARR的值為0x36,內(nèi)部預(yù)分頻系數(shù)為4(預(yù)分頻寄存器TIMx_PSC的值為3)的計數(shù)器時序圖。9.3通用定時器9.3.3通用定時器功能描述向下計數(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)志位。2.計數(shù)模式工作在向下計數(shù)模式下,自動重裝載寄存器值為0x36,內(nèi)部預(yù)分頻系數(shù)為2的計數(shù)器時序圖。9.3通用定時器9.3.3通用定時器功能描述向上/向下計數(shù)模式(又稱中央對齊模式或雙向計數(shù)模式)向上/向下計數(shù)模式又稱為中央對齊模式或雙向計數(shù)模式,其工作過程如圖所示,計數(shù)器從0開始計數(shù)到自動加載的值(TIMx_ARR寄存器)-1,產(chǎn)生一個計數(shù)器溢出事件,然后向下計數(shù)到1并且產(chǎn)生一個計數(shù)器下溢事件;然后再從0開始重新計數(shù)。2.計數(shù)模式工作在向上/向下計數(shù)模式下的通用定時器,當(dāng)自動重裝載寄存器TIMx_ARR的值為0x06,內(nèi)部預(yù)分頻系數(shù)為1(預(yù)分頻寄存器TIMx_PSC的值為0)的計數(shù)器時序圖9.3通用定時器9.3.3通用定時器功能描述內(nèi)部時鐘CK_INT來自RCC的TIMxCLK,根據(jù)STM32F103時鐘樹,通用定時器TIM2~TIM5內(nèi)部時鐘CK_INT的來源TIM_CLK,與基本定時器相同,都是來自APB1預(yù)分頻器的輸出,通常情況下,其時鐘頻率是72MHz。內(nèi)部時鐘(CK_INT)外部輸入捕獲引腳TIx(外部時鐘模式1)來自外部輸入捕獲引腳上的邊沿信號。計數(shù)器可以在選定的輸入端(引腳1:TI1FP1或TI1F_ED,引腳2:TI2FP2)的每個上升沿或下降沿計數(shù)外部時鐘模式1:外部輸入捕獲引腳(TIx)外部觸發(fā)輸入引腳ETR(外部時鐘模式2)來自外部引腳ETR。計數(shù)器能在外部觸發(fā)輸入ETR的每個上升沿或下降沿計數(shù)。外部時鐘模式2:外部觸發(fā)輸入(ETR)使用一個定時器作為另一個定時器的預(yù)分頻器。內(nèi)部觸發(fā)輸入ITRx來自芯片內(nèi)部其他定時器的觸發(fā)輸入,使用一個定時器作為另一個定時器的預(yù)分頻器,例如,可以配置TIM1作為TIM2的預(yù)分頻器。內(nèi)部觸發(fā)輸入(ITRx):相比于基本定時器單一的內(nèi)部時鐘源,STM32F103通用定時器的16位計數(shù)器的時鐘源有多種選擇,可由以下時鐘源提供。3.時鐘選擇9.3通用定時器9.3.3通用定時器功能描述每一個捕獲/比較通道都是圍繞著一個捕獲/比較寄存器(包含影子寄存器),包括捕獲的輸入部分(數(shù)字濾波、多路復(fù)用和預(yù)分頻器)和輸出部分(比較器和輸出控制)。輸入部分對相應(yīng)的TIx輸入信號采樣,并產(chǎn)生一個濾波后的信號TIxF。然后,一個帶極性選擇的邊緣檢測器產(chǎn)生一個信號(TIxFPx),它可以作為從模式控制器的輸入觸發(fā)或者作為捕獲控制。該信號通過預(yù)分頻進(jìn)入捕獲寄存器(ICxPS)。輸出部分產(chǎn)生一個中間波形OCxRef(高有效)作為基準(zhǔn),鏈的末端決定最終輸出信號的極性。4.捕獲/比較通道9.3通用定時器9.3.4通用定時器工作模式1輸入捕獲模式2PWM輸入模式3強置輸出模式4輸出比較模式5PWM模式√9.3通用定時器PWM模式PWM簡介01PWM
是PulseWidthModulation的縮寫,中文意思就是脈沖寬度調(diào)制,簡稱脈寬調(diào)制。它是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù),其控制簡單、靈活和動態(tài)響應(yīng)好等優(yōu)點而成為電力電子技術(shù)最廣泛應(yīng)用的控制方式,其應(yīng)用領(lǐng)域包括測量、通信、功率控制與變換,電動機(jī)控制、伺服控制、調(diào)光、開關(guān)電源,甚至某些音頻放大器,因此研究基于PWM技術(shù)的正負(fù)脈寬數(shù)控調(diào)制信號發(fā)生器具有十分重要的現(xiàn)實意義。PWM是一種對模擬信號電平進(jìn)行數(shù)字編碼的方法。通過高分辨率計數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體模擬信號的電平進(jìn)行編碼。用PWM波代替正弦半波
9.3通用定時器PWM模式PWM實現(xiàn)02實現(xiàn)PWM的方法主要有傳統(tǒng)的數(shù)字電路、微控制器普通I/O模擬和微控制器的PWM直接輸出等。■傳統(tǒng)的數(shù)字電路方式:用傳統(tǒng)的數(shù)字電路實現(xiàn)PWM(如555定時器)。■微控制器普通I/O模擬方式:對于微控制器中無PWM輸出功能情況(如51單片機(jī)),可以通過CPU操控普通I/O口來實現(xiàn)PWM輸出。■微控制器的PWM直接輸出方式:對于具有PWM輸出功能的微控制器,在進(jìn)行簡單的配置后即可在微控制器的指定引腳上輸出PWM脈沖。9.3通用定時器PWM模式PWM輸出模式的工作過程03STM32F103微控制器脈沖寬度調(diào)制模式可以產(chǎn)生一個由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號,其產(chǎn)生原理如圖所示。STM32F103微控制器PWM產(chǎn)生原理9.3通用定時器PWM模式PWM輸出模式的工作過程031)若配置脈沖計數(shù)器TIMx_CNT為向上計數(shù)模式,自動重裝載寄存器TIMx_ARR的預(yù)設(shè)為N,則脈沖計數(shù)器TIMx_CNT的當(dāng)前計數(shù)值X在時鐘CK_CNT(通常由TIMxCLK經(jīng)TIMx_PSC分頻而得)的驅(qū)動下從0開始不斷累加計數(shù)。2)在脈沖計數(shù)器TIMx_CNT隨著時鐘CK_CNT觸發(fā)進(jìn)行累加計數(shù)的同時,脈沖計數(shù)器TIMx_CNT的當(dāng)前計數(shù)值X與捕獲/比較寄存器TIMx_CCR的預(yù)設(shè)值A(chǔ)進(jìn)行比較;如果X<A,輸出高電平(或低電平);如果X≥A,輸出低電平(或高電平)。9.3通用定時器PWM模式PWM輸出模式的工作過程033)當(dāng)脈沖計數(shù)器TIMx_CNT的計數(shù)值X大于自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值N時,脈沖計數(shù)器TIMx_CNT的計數(shù)值清零并重新開始計數(shù)。如此循環(huán)往復(fù),得到的PWM的輸出信號周期為(N+1)×TCK_CNT。(其中,N為自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值,TCK_CNT為時鐘CK_CNT的周期。PWM輸出信號脈沖寬度為A×TCK_CNT,其中,A為捕獲/比較寄存器TIMx_CCR的預(yù)設(shè)值,TCK_CNT為時鐘CK_CNT的周期。)PWM輸出信號的占空比為A/(N+1).自動重裝載寄存器TIMx_ARR的預(yù)設(shè)值為8,4個捕獲/比較寄存器TIMx_CCRx分別設(shè)為0、4、8和大于8時,通過用定時器的4個PWM通道的輸出時序OCxREF和觸發(fā)中斷時序CCxIF如圖所示。例如,在TIMx_CCR=4情況下,當(dāng)TIMx_CNT<4時,OCxREF輸出高電平;當(dāng)TIMx_CNT≥4時,OCxREF輸出低電平,并在比較結(jié)果改變時觸發(fā)CCxIF中斷標(biāo)志。此PWM的占空比為4/(8+1)。9.4高級定時器高級定時器主要用于電機(jī)控制、相位鎖定回路等特殊應(yīng)用場合,本章僅作簡單介紹。9.4高級定時器9.4.1高級定時器簡介高級控制定時器(TIM1和TIM8)由一個16位的自動裝載計數(shù)器組成,它由一個可編程的預(yù)分頻器驅(qū)動。它適合多種用途,包含測量輸入信號的脈沖寬度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較、PWM、嵌入死區(qū)時間的互補PWM等)。使用定時器預(yù)分頻器和RCC時鐘控制預(yù)分頻器,可以實現(xiàn)脈沖寬度和波形周期從幾個微秒到幾個毫秒的調(diào)節(jié)。高級控制定時器(TIM1和TIM8)和通用定時器(TIMx)是完全獨立的,它們不共享任何資源,可以同步操作。因為高級定時器的特殊功能,在普通應(yīng)用中一般較少使用,所以不作為本書討論的重點,如需詳細(xì)了解可以查閱STM32中文參考手冊。9.5定時器相關(guān)庫函數(shù)頭文件STM32F10x_tim.h用來存放定時器相關(guān)結(jié)構(gòu)體和宏定義以及定時器庫函數(shù)聲明,源代碼文件STM32F10x_tim.c用來存放定時器庫函數(shù)定義9.5定時器相關(guān)庫函數(shù)9.5.1函數(shù)TIM_DeInit例:/*ResetstheTIM2*/TIM_DeInit(TIM2);函數(shù)名TIM_DeInit函數(shù)原形voidTIM_DeInit(TIM_TypeDef*TIMx)功能描述將外設(shè)TIMx寄存器重設(shè)為缺省值輸入?yún)?shù)TIMx:x可以是1~8,來選擇TIM外設(shè)輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)RCC_APB1PeriphClockCmd().9.5定時器相關(guān)庫函數(shù)9.5.2函數(shù)TIM_TimeBaseInittypedefstruct{uint16_tTIM_Prescaler;uint16_tTIM_CounterMode;uint16_tTIM_Period;uint16_tTIM_ClockDivision;uint8_tTIM_RepetitionCounter;//僅高級定時器TIM1和TIM8有效}TIM_TimeBaseInitTypeDef;函數(shù)名TIM_TimeBaseInit函數(shù)原形voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)功能描述根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位輸入?yún)?shù)1TIMx:x可以是1~8,來選擇TIM外設(shè)輸入?yún)?shù)2TIMTimeBase_InitStruct:指向結(jié)構(gòu)TIM_TimeBaseInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.2函數(shù)TIM_TimeBaseInitTIM_Period:設(shè)置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間。TIM_Prescaler:設(shè)置了用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值。它的取值必須在0x0000和0xFFFF之間。TIM_ClockDivision:設(shè)置了時鐘分割。該參數(shù)取值見下表。TIM_ClockDivision描述TIM_CKD_DIV1TDTS=Tck_timTIM_CKD_DIV2TDTS=2Tck_timTIM_CKD_DIV4TDTS=4Tck_timTIM_CounterMode:選擇了計數(shù)器模式。該參數(shù)取值見下表。TIM_CounterMode描述TIM_CounterMode_UpTIM向上計數(shù)模式TIM_CounterMode_DownTIM向下計數(shù)模式TIM_CounterMode_CenterAligned1TIM中央對齊模式1計數(shù)模式TIM_CounterMode_CenterAligned2TIM中央對齊模式2計數(shù)模式TIM_CounterMode_CenterAligned3TIM中央對齊模式3計數(shù)模式9.5定時器相關(guān)庫函數(shù)9.5.3函數(shù)TIM_OC1InitTIM_OCMode:選擇定時器模式函數(shù)名TIM_OC1Init函數(shù)原形voidTIM_OC1Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct)功能描述根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化TIMx通道1輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無NVIC_PriorityGroup描述NVIC_PriorityGroup_0先占優(yōu)先級0位
從優(yōu)先級4位NVIC_PriorityGroup_1先占優(yōu)先級1位
從優(yōu)先級3位NVIC_PriorityGroup_2先占優(yōu)先級2位
從優(yōu)先級2位NVIC_PriorityGroup_3先占優(yōu)先級3位
從優(yōu)先級1位NVIC_PriorityGroup_4先占優(yōu)先級4位
從優(yōu)先級0位9.5定時器相關(guān)庫函數(shù)9.5.3函數(shù)TIM_OC1InitTIM_OutputState:選擇輸出比較狀態(tài)TIM_Pulse:
設(shè)置了待裝入捕獲比較寄存器的脈沖值。它的取值必須在0x0000和0xFFFF之間。TIM_OCPolarity:輸出極性。TIM_OutputNState:選擇互補輸出比較狀態(tài)TIM_OutputState描述TIM_OutputState_Disable失能輸出比較狀態(tài)TIM_OutputState_Enable使能輸出比較狀態(tài)TIM_OutputNState描述TIM_OutputState_Disable失能輸出比較
N狀態(tài)TIM_OutputState_Enable使能輸出比較
N狀態(tài)TIM_OCPolarity描述TIM_OCPolarity_HighTIM輸出比較極性高TIM_OCPolarity_LowTIM輸出比較極性低9.5定時器相關(guān)庫函數(shù)9.5.3函數(shù)TIM_OC1InitTIM_OCNIdleState:選擇空閑狀態(tài)下的非工作狀態(tài)TIM_OutputNState:選擇互補輸出比較狀態(tài)TIM_OCIdleState描述TIM_OCIdleState_Set當(dāng)
MOE=0設(shè)置TIM輸出比較空閑狀態(tài)TIM_OCIdleState_Reset當(dāng)
MOE=0重置TIM輸出比較空閑狀態(tài)TIM_OCNIdleState描述TIM_OCNIdleState_Set當(dāng)
MOE=0設(shè)置TIM輸出比較N空閑狀態(tài)TIM_OCNIdleState_Reset當(dāng)
MOE=0重置TIM輸出比較N空閑狀態(tài)例:/*ConfigurestheTIM1Channel1inPWMMode*/TIM_OCInitTypeDefTIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.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);9.5定時器相關(guān)庫函數(shù)9.5.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ù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5.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ù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.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ù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCInitStruct:指向結(jié)構(gòu)TIM_OCInitTypeDef的指針,包含了TIMx時間基數(shù)單位的配置信息。輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5.7函數(shù)TIM_Cmd函數(shù)名TIM_Cmd函數(shù)原形voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState)功能描述使能或者失能TIMx外設(shè)輸入?yún)?shù)1TIMx:x可以是1~8,用于選擇TIM外設(shè)輸入?yún)?shù)2NewState:外設(shè)TIMx的新狀態(tài)
這個參數(shù)可以取:ENABLE或者DISABLE輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.8函數(shù)TIM_ITConfig函數(shù)名TIM_ITConfig函數(shù)原形voidTIM_ITConfig(TIM_TypeDef*TIMx,u16TIM_IT,FunctionalStateNewState)功能描述使能或者失能指定的TIM中斷輸入?yún)?shù)1TIMx:x可以是1~8,來選擇TIM外設(shè)輸入?yún)?shù)2TIM_IT:待使能或者失能的TIM中斷源參閱Section:TIM_IT查閱更多該參數(shù)允許取值范圍輸入?yún)?shù)3NewState:TIMx中斷的新狀態(tài)這個參數(shù)可以取:ENABLE或者DISABLE輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無TIM_IT:輸入?yún)?shù)TIM_IT使能或者失能TIM的中斷。可以取下表的一個或者多個取值的組合作為該參數(shù)的值。TIM_IT描述TIM_IT_UpdateTIM中斷源TIM_IT_CC1TIM捕獲/比較1中斷源TIM_IT_CC2TIM捕獲/比較2中斷源TIM_IT_CC3TIM捕獲/比較3中斷源TIM_IT_CC4TIM捕獲/比較4中斷源TIM_IT_TriggerTIM觸發(fā)中斷源9.5定時器相關(guān)庫函數(shù)9.5.9函數(shù)TIM_OC1PreloadConfig函數(shù)名TIM_OC1PreloadConfig函數(shù)原形voidTIM_OC1PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)功能描述使能或者失能TIMx在CCR1上的預(yù)裝載寄存器輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCPreload:輸出比較預(yù)裝載狀態(tài)參閱Section:TIM_OCPreload查閱更多該參數(shù)允許取值范圍輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無TIM_OCPreload:輸出比較預(yù)裝載狀態(tài)可以使能或者失能如下表。TIM_OCPreload描述TIM_OCPreload_EnableTIMx在CCR1上的預(yù)裝載寄存器使能TIM_OCPreload_DisableTIMx在CCR1上的預(yù)裝載寄存器失能9.5定時器相關(guān)庫函數(shù)9.5.10函數(shù)TIM_OC2PreloadConfig函數(shù)名TIM_OC2PreloadConfig函數(shù)原形voidTIM_OC2PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)功能描述使能或者失能TIMx在CCR2上的預(yù)裝載寄存器輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCPreload:輸出比較預(yù)裝載狀態(tài)輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5.11函數(shù)TIM_OC3PreloadConfig函數(shù)名TIM_OC3PreloadConfig函數(shù)原形voidTIM_OC3PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)功能描述使能或者失能TIMx在CCR3上的預(yù)裝載寄存器輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCPreload:輸出比較預(yù)裝載狀態(tài)輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.12函數(shù)TIM_OC4PreloadConfig函數(shù)名TIM_OC4PreloadConfig函數(shù)原形voidTIM_OC4PreloadConfig(TIM_TypeDef*TIMx,u16TIM_OCPreload)功能描述使能或者失能TIMx在CCR4上的預(yù)裝載寄存器輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2TIM_OCPreload:輸出比較預(yù)裝載狀態(tài)輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.13函數(shù)TIM_GetFlagStatus函數(shù)名TIM_GetFlagStatus函數(shù)原形FlagStatusTIM_GetFlagStatus(TIM_TypeDef*TIMx,u16TIM_FLAG)功能描述檢查指定的TIM標(biāo)志位設(shè)置與否輸入?yún)?shù)1TIMx:x可以是1~8,來選擇TIM外設(shè)輸入?yún)?shù)2TIM_FLAG:待檢查的TIM標(biāo)志位參閱Section:TIM_FLAG查閱更多該參數(shù)允許取值范圍輸出參數(shù)無返回值TIM_FLAG的新狀態(tài)(SET或者RESET)先決條件無被調(diào)用函數(shù)無TIM_FLAG:下表給出了所有可以被函數(shù)TIM_GetFlagStatus檢查的標(biāo)志位列表TIM_FLAG描述TIM_FLAG_UpdateTIM更新標(biāo)志位TIM_FLAG_CC1TIM捕獲/比較1標(biāo)志位TIM_FLAG_CC2TIM捕獲/比較2標(biāo)志位TIM_FLAG_CC3TIM捕獲/比較3標(biāo)志位TIM_FLAG_CC4TIM捕獲/比較4標(biāo)志位TIM_FLAG_TriggerTIM觸發(fā)標(biāo)志位TIM_FLAG_CC1OFTIM捕獲/比較1溢出標(biāo)志位TIM_FLAG_CC2OFTIM捕獲/比較2溢出標(biāo)志位TIM_FLAG_CC3OFTIM捕獲/比較3溢出標(biāo)志位TIM_FLAG_CC4OFTIM捕獲/比較4溢出標(biāo)志位9.5定時器相關(guān)庫函數(shù)9.5.14函數(shù)TIM_ClearFlag函數(shù)名TIM_ClearFlag函數(shù)原形voidTIM_ClearFlag(TIM_TypeDef*TIMx,uint16_tTIM_FLAG)功能描述清除TIMx的待處理標(biāo)志位輸入?yún)?shù)1TIMx:x可以是1~8,來選擇TIM外設(shè)輸入?yún)?shù)2TIM_FLAG:待清除的TIM標(biāo)志位輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5.15函數(shù)TIM_GetITStatus函數(shù)名TIM_GetITStatus函數(shù)原形ITStatusTIM_GetITStatus(TIM_TypeDef*TIMx,u16TIM_IT)功能描述檢查指定的TIM中斷發(fā)生與否輸入?yún)?shù)1TIMx:x可以是1~8,來選擇TIM外設(shè)輸入?yún)?shù)2TIM_IT:待檢查的TIM中斷源輸出參數(shù)無返回值TIM_IT的新狀態(tài)先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.16函數(shù)TIM_ClearITPendingBit函數(shù)名TIM_ClearITPendingBit函數(shù)原形voidTIM_ClearITPendingBit(TIM_TypeDef*TIMx,u16TIM_IT)功能描述清除TIMx的中斷待處理位輸入?yún)?shù)1TIMx:x可以是1~8,來選擇TIM外設(shè)輸入?yún)?shù)2TIM_IT:待檢查的TIM中斷待處理位輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5.17函數(shù)TIM_SetCompare1函數(shù)名TIM_SetCompare1函數(shù)原形voidTIM_SetCompare1(TIM_TypeDef*TIMx,u16Compare1)功能描述設(shè)置TIMx捕獲比較1寄存器值輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2Compare1:捕獲比較1寄存器新值輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.18函數(shù)TIM_SetCompare2函數(shù)名TIM_SetCompare2函數(shù)原形voidTIM_SetCompare2(TIM_TypeDef*TIMx,u16Compare2)功能描述設(shè)置TIMx捕獲比較2寄存器值輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2Compare2:捕獲比較2寄存器新值輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5.19函數(shù)TIM_SetCompare3函數(shù)名TIM_SetCompare3函數(shù)原形voidTIM_SetCompare3(TIM_TypeDef*TIMx,u16Compare3)功能描述設(shè)置TIMx捕獲比較3寄存器值輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2Compare3:捕獲比較3寄存器新值輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.5定時器相關(guān)庫函數(shù)9.5.20函數(shù)TIM_SetCompare4函數(shù)名TIM_SetCompare4函數(shù)原形voidTIM_SetCompare4(TIM_TypeDef*TIMx,u16Compare4)功能描述設(shè)置TIMx捕獲比較4寄存器值輸入?yún)?shù)1TIMx:x可以是1、2、3、4、5或8,用于選擇TIM外設(shè)輸入?yún)?shù)2Compare4:捕獲比較4寄存器新值輸出參數(shù)無返回值無先決條件無被調(diào)用函數(shù)無9.6項目實例本章將介紹兩個項目一個是,定時器基本應(yīng)用項目實例:數(shù)字電子鐘,另一個是PWM輸出基本應(yīng)用:PWM呼吸燈。9.6項目實例9.6.1定時器項目定時器初始化主要步驟包括打開定時器所掛接的時鐘定時器進(jìn)行初始化啟動定時器清除中斷標(biāo)志位配置定時器中斷0102030405項目分析核心功能是實現(xiàn)精確的一秒的定時設(shè)置中斷優(yōu)先級069.6項目實例第一步:復(fù)制第8章創(chuàng)建工程模板文件夾到桌面,并將文件夾改名為“7Timer”,將原工程模板編譯一下,直到?jīng)]有錯誤和警告為止。項目實施6EXTI7Timer第二步:為工程模板的“ST_Driver”項目組添加定時器源文件“stm32f10x_tim.c”,文件位于“..\Libraries\STM32F10x_StdPeriph_Driver\src”目錄下。9.6項目實例項目實施第三步:點擊“File/New”新建兩個文件,將其改名為timer.c和timer.h并保存到工程模板下的APP文件夾中。并將timer.c文件添加到APP項目組下。第四步:在timer.h文件中輸入如下源程序,其中條件編譯格式不變,只要更改一下預(yù)定義變量名稱即可,需要將我們剛定義函數(shù)的聲明加到頭文件當(dāng)中。參考代碼如下:#ifndef_TIMER_H#define_TIMER_H#include"stm32f10x.h"voidTIM6Init(void);#endif9.6EXTI項目實例第五步:在timer.c文件中輸入如下源程序,在程序中首先包含timer.h頭文件,然后創(chuàng)建TIM6Init()定時器初始化程序,其中包括定時器初始化,中斷設(shè)置,啟動定時器和開中斷等操作。項目實施#include"timer.h"voidTIM6Init(){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//打開TIM6的APB1時鐘TIM_TimeBaseStructure.TIM_Period=36000-1;//設(shè)置自動重裝載寄存器周期的值寄存器的值為周期值-1TIM_TimeBaseStructure.TIM_Prescaler=2000-1;//設(shè)置預(yù)分頻系數(shù)預(yù)分頻寄存器的值為分頻系數(shù)-1TIM_TimeBaseStructure.TIM_ClockDivision=0;//設(shè)置時鐘分割TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//
TIM向上計數(shù)模式TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);//初始化TIM6定時器TIM_ClearFlag(TIM6,TIM_FLAG_Update);//清除TIMx的中斷待處理位TIMx中斷源TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);/*設(shè)置中斷參數(shù)并打開中斷*/TIM_Cmd(TIM6,ENABLE);//使能或者失能TIMx外設(shè)
/*設(shè)置NVIC參數(shù)設(shè)優(yōu)先級開中斷*/NVIC_InitStructure.NVIC_IRQChannel=TIM6_IRQn;//指定中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//配置搶占式優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//配置響應(yīng)式優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//中斷使能NVIC_Init(&NVIC_InitStructure); }
參考程序代碼9.6項目實例項目實施第六步:在main.h文件的中間部分添加#include"timer.h"語句,即包含timer.h頭文件,任何時候程序中需要使用某一源文件中函數(shù),必須先包含其頭文件,否則編譯是不能通過的。第七步:在main.c文件中輸入如下源程序,在main函數(shù)中,首先對時間變量賦初值,然后分別對數(shù)碼管管腳和外部中斷進(jìn)行初始化,最后應(yīng)用無限循環(huán)結(jié)構(gòu)顯示時間,并等待中斷發(fā)生。第六步參考代碼如下:#ifndef_MAIN_H#define_MAIN_H#include"stm32f10x.h"#include"LED.h"#include"beepkey.h"#include"dsgshow.h"#include"EXTI.H“#include"timer.h"#endif第七步參考代碼如下:#include"main.h"u8hour,minute,second;intmain(){ hour=9; minute=6;second=18; DsgShowInit(); EXTIInti(); TIM6Init(); while(1) { DsgShowTime(); } }9.6項目實例項目實施第八步:在Keil-MDK軟件操作界面打開“User”項目組下面的“stm32f10x_it.c”文件,并在“stm32f10x_it.c”文件的最下面編寫4個中斷服務(wù)程序,其中前3個是上一章的外部中斷服務(wù)程序,在最下面添加一個定時器中斷服務(wù)程序,主要功能是實現(xiàn)時間調(diào)整第八步參考代碼如下:voidTIM6_IRQHandler(void){ TIM_ClearFlag(TIM6,TIM_IT_Update); if(++second==60) { second=0; if(++minute==60) { minute=0; if(++hour==24)hour=0; } } }第九步:編譯工程,如沒有錯誤,則會在MDK文件夾中Objects文件夾生成“Template.hex”文件,如有錯誤則修改源程序直至沒有錯誤為止。第十步:將生成的目標(biāo)文件通過ISP軟件下載到開發(fā)板微控制器的FLASH存儲器當(dāng)中,復(fù)位運行,檢查實驗效果。9.6項目實例9.6.2PWM項目本項目將利用TIM3的通道1和通道2,把兩個通道完全重映射到PC6和PC7引腳,產(chǎn)生兩路PWM方波來控制開發(fā)板L7和L8指示燈的亮度。通過修改PWM波的占空比,就可以控制L7和L8燈由亮到暗,再由暗到亮,實現(xiàn)PWM呼吸燈效果。9.6項目實例9.6.2PWM項目項目分析01開啟TIM3時鐘以及復(fù)用功能時鐘,配置PC6和PC7為復(fù)用輸出。02設(shè)置TIM3_CH1和TIM3_CH2重映射到PC6和PC7上。將TIM3_CH1和TIM3_CH2通道將重映射到PC6和PC7上,此時,PC6和PC7屬于復(fù)用功能輸出。庫函數(shù)使能TIM3時鐘的方法是:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出需要設(shè)置TIM3_REMAP為完全重映射(通過AFIO_MAPR配置),讓TIM3_CH1重映射到PC6上面以及TIM3_CH2重映射到PC7上面。在庫函數(shù)里面設(shè)置重映射的函數(shù)是:voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalStateNewState);STM32重映射只能重映射到特定的端口。第一個入口參數(shù)可以理解為設(shè)置重映射的類型,比如TIM3完全重映射入口參數(shù)為GPIO_FullRemap_TIM3,所以TIM3完全重映射的庫函數(shù)實現(xiàn)方法是:GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);9.6項目實例9.6.2PWM項目項目分析03初始化TIM3,設(shè)置TIM3的ARR和PSC。在開啟了TIM3的時鐘之后,我們要設(shè)置ARR和PSC兩個寄存器的值來控制輸出PWM的周期。當(dāng)PWM頻率太慢(低于50Hz)的時候,我們就會明顯感覺到閃爍了。因此,PWM頻率在這里不宜設(shè)置的太小。//TIM3定時器初始化TIM_TimeBaseInitStructure.TIM_Period=900-1;//不分頻,PWM頻率=72000kHz/900=80kHz//設(shè)置自動重裝載寄存器周期的值TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;//設(shè)置用來作為TIMx時鐘頻率預(yù)分頻值,此處分頻系數(shù)為1,即不分頻TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//設(shè)置時鐘分割:TDTS=Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上計數(shù)模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);9.6項目實例9.6.2PWM項目項目分析04設(shè)置TIM3_CH1和TIM3_CH2的PWM模式,使能TIM3的CH1和CH2輸出設(shè)置TIM3_CH1和TIM3_CH2為PWM模式(默認(rèn)是凍結(jié)的),因為我們的LED是低電平亮,而我們希望當(dāng)CCR1和CCR2的值小的時候,LED就暗,CCR1和CCR2值大的時候,LED就亮,所以我們要通過配置TIM3_CCMRx的相關(guān)位來控制TIM3_CHx的模式。在庫函數(shù)中,PWM通道設(shè)置是通過函數(shù)TIM_OC1Init()~TIM_OC4Init()來設(shè)置的,不同的通道的設(shè)置函數(shù)不一樣,這里我們使用的是通道1和通道2,所以使用的函數(shù)是TIM_OC1Init()和TIM_OC2Init()。voidTIM_OC1Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct);voidTIM_OC2Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct);這里我們介紹一下TIM_OCInitStruc結(jié)構(gòu)體幾個重要成員。參數(shù)TIM_OCMode設(shè)置模式是PWM還是輸出比較,這里我們是PWM模式。參數(shù)TIM_OutputState用來設(shè)置比較輸出使能,也就是使能PWM輸出到端口。參數(shù)TIM_OCPolarity用來設(shè)置極性是高還是低。要實現(xiàn)項目控制要求,需要如下代碼初始化TIM3。TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OC1Init(TIM3,&TIM_OCInitStructure);TIM_OC2Init(TIM3,&TIM_OCInitStructure);9.6項目實例9.6.2PWM項目項目分析05使能TIM306修改TIM3_CCR1和TIM3_CCR2來控制占空比需要使能TIM3:TIM_Cmd(TIM3,ENABLE);//使能TIM3在經(jīng)過以上設(shè)置之后,PWM其實已經(jīng)開始輸出了,只是其占空比和頻率都是固定的,需要通過修改TIM3_CCR1和TIM3_CCR2則可以控制CH1和CH2的輸出占空比。繼而控制L7和L8的亮度。在庫函數(shù)中,修改TIM3_CCR1和TIM3_CCR2占空比的函數(shù)是:voidTIM_SetCompare1(TIM_TypeDef*TIMx,uint16_tCompare1);voidTIM_SetCompare2(TIM_TypeDef*TIMx,uint16_tCompare2);9.6項目實例9.6.2PWM項目項目實施第一步:復(fù)制上一節(jié)創(chuàng)建工程模板文件夾到桌面,并將文件夾改名為“8PWM”,將原工程模板編譯一下,直到?jīng)]有錯誤和警告為止。第二步:點擊“File/New”新建兩個文件,將其改名為PWM.C和PWM.H并保存到工程模板下的APP文件夾中。并將PWM.C文件添加到APP項目組下。7Timer8PWM9.6項目實例9.6.2PWM項目項目實施第三步:在PWM.H文件中輸入如下源程序,其中條件編譯格式不變,只要更改一下預(yù)定義變量名稱即可,需要將我們剛定義函數(shù)的聲明加到頭文件當(dāng)中。第四步:在PWM.C文件中輸入如下源程序,在程序中首先包含PWM.H頭文件,然后創(chuàng)建TIM3_PWMInit()初始化程序,其中包括打開外設(shè)時鐘,GPIO初始化、定時器初始化、PWM初始化,管腳重映射,使能預(yù)裝值寄存器,啟動定時器等程序。參考代碼如下:#ifndef_PWM_H#define_PWM_H#include"stm32f10x.h"voidTIM3_PWMInit(void);#endif#include"PWM.H"voidTIM3_PWMInit(){ GPIO_InitTypeDefGPIO_InitStructure;//聲明一個結(jié)構(gòu)體變量,用來初始化GPIO TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;//聲明一個結(jié)構(gòu)體變量,用來初始化定時器
TIM_OCInitTypeDefTIM_OCInitStructure;//根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化外設(shè)TIMx
9.6項目實例9.6.2PWM項目項目實施/*開啟時鐘*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /*配置GPIO的模式和IO口*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; G
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- TOD項目風(fēng)管法蘭連接施工方案-專項施工方案
- 2026年消毒競賽試題及答案
- 檢驗科糞常規(guī)檢驗操作規(guī)范
- 裝修施工方案與技術(shù)措施
- 保利廣場項目高大模板支撐體系專家論證施工方案
- 升壓站施工組織設(shè)計方案
- 噴泉施工方案范本
- 初中化學(xué)重難點復(fù)習(xí)專題:酸、堿、鹽知識點總結(jié)
- 中外歷史綱要(下) 選擇性必修1 第16單元 第43講 第2課時 近代西方的法律與教化
- 第一單元自測練習(xí)卷-2026-2027學(xué)年語文六年級上冊統(tǒng)編版
- 施工機(jī)械設(shè)備應(yīng)急搶修保障措施
- Vensim中文學(xué)習(xí)手冊
- 中國電信2024年燎原計劃跨省聯(lián)訓(xùn)(AI專業(yè))考試含答案
- 人教精通版小學(xué)英語3-6年級單詞詞匯表
- 做最勇敢的自己
- 球囊面罩通氣術(shù)講解
- DAM全固態(tài)中波發(fā)射機(jī)
- 第八章排泄護(hù)理排尿護(hù)理學(xué)基礎(chǔ)講解
- 企業(yè)法務(wù)培訓(xùn)課件
- 《臨床護(hù)理路徑在頸椎前路手術(shù)病人護(hù)理中的效果實證探究》2300字(論文)
- 2024年《315消費者權(quán)益保護(hù)法》知識競賽題庫及答案
評論
0/150
提交評論