《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 第6章 定時(shí)器_第1頁(yè)
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 第6章 定時(shí)器_第2頁(yè)
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 第6章 定時(shí)器_第3頁(yè)
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 第6章 定時(shí)器_第4頁(yè)
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 第6章 定時(shí)器_第5頁(yè)
已閱讀5頁(yè),還剩96頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章定時(shí)器本章講述了定時(shí)器,包括STM32F103定時(shí)器概述、基本定時(shí)器、通用定時(shí)器、高級(jí)定時(shí)器、定時(shí)器庫(kù)函數(shù)和定時(shí)器應(yīng)用實(shí)例和SysTick系統(tǒng)滴答定時(shí)器。6.1STM32F103定時(shí)器概述定時(shí)與計(jì)數(shù)的應(yīng)用十分廣泛。在實(shí)際生產(chǎn)過(guò)程中,許多場(chǎng)合都需要定時(shí)或者計(jì)數(shù)操作。例如產(chǎn)生精確的時(shí)間,對(duì)流水線上的產(chǎn)品進(jìn)行計(jì)數(shù)等。因此,定時(shí)/計(jì)數(shù)器在嵌入式單片機(jī)應(yīng)用系統(tǒng)中十分重要。定時(shí)和計(jì)數(shù)可以通過(guò)以下方式實(shí)現(xiàn):1.軟件延時(shí)單片機(jī)是在一定時(shí)鐘下運(yùn)行的,可以根據(jù)代碼所需的時(shí)鐘周期來(lái)完成延時(shí)操作,軟件延時(shí)會(huì)導(dǎo)致CPU利用率低。因此主要用于短時(shí)間延時(shí),如高速A/D轉(zhuǎn)換器。2.可編程定時(shí)/計(jì)數(shù)器微控制器中的可編程定時(shí)/計(jì)數(shù)器可以實(shí)現(xiàn)定時(shí)和計(jì)數(shù)操作,定時(shí)/計(jì)數(shù)器功能由程序靈活設(shè)置,重復(fù)利用。設(shè)置好后由硬件與CPU并行工作,不占用CPU時(shí)間,這樣在軟件的控制下,可以實(shí)現(xiàn)多個(gè)精密定時(shí)/計(jì)數(shù)。嵌入式處理器為了適應(yīng)多種應(yīng)用,通常集成多個(gè)高性能的定時(shí)/計(jì)數(shù)器。微控制器中的定時(shí)器本質(zhì)上是一個(gè)計(jì)數(shù)器,可以對(duì)內(nèi)部脈沖或外部輸入進(jìn)行計(jì)數(shù),不僅具有基本的延時(shí)/計(jì)數(shù)功能,還具有輸入捕獲、輸出比較和PWM波形輸出等高級(jí)功能。在嵌入式開(kāi)發(fā)中,充分利用定時(shí)器的強(qiáng)大功能,可以顯著提高外設(shè)驅(qū)動(dòng)的編程效率和CPU利用率,增強(qiáng)系統(tǒng)的實(shí)時(shí)性。STM32內(nèi)部集成了多個(gè)定時(shí)/計(jì)數(shù)器。根據(jù)型號(hào)不同,STM32系列芯片最多包含8個(gè)定時(shí)/計(jì)數(shù)器。其中,TIM6和TIM7為基本定時(shí)器,TIM2~TIM5為通用定時(shí)器,TIM1和TIM8為高級(jí)控制定時(shí)器,功能最強(qiáng)。三種定時(shí)器具備的功能如表6-1所示。此外,在STM32中還有兩個(gè)看門(mén)狗定時(shí)器和一個(gè)系統(tǒng)滴答定時(shí)器。表6-1STM32定時(shí)器的功能主要功能高級(jí)控制定時(shí)器通用定時(shí)器基本定時(shí)器內(nèi)部時(shí)鐘源(8MHz)●●●帶16位分頻的計(jì)數(shù)單元●●●更新中斷和DMA●●●計(jì)數(shù)方向向上、向下、雙向向上、向下、雙向向上外部事件計(jì)數(shù)●●○其他定時(shí)器觸發(fā)或級(jí)聯(lián)●●○4個(gè)獨(dú)立輸入捕獲、輸出比較通道●●○單脈沖輸出方式●●○正交編碼器輸入●●○霍爾傳感器輸入●●○輸出比較信號(hào)死區(qū)產(chǎn)生●○○制動(dòng)信號(hào)輸入●○○STM32F103定時(shí)器相比于傳統(tǒng)的51單片機(jī)要完善和復(fù)雜得多,它是專(zhuān)為工業(yè)控制應(yīng)用量身定做,具有延時(shí)、頻率測(cè)量、PWM輸出、電機(jī)控制及編碼接口等功能。6.2基本定時(shí)器STM32F103基本定時(shí)器TIM6和TIM7各包含一個(gè)16位自動(dòng)裝載計(jì)數(shù)器,由各自的可編程預(yù)分頻器驅(qū)動(dòng)。它們可以作為通用定時(shí)器提供時(shí)間基準(zhǔn),特別是可以為數(shù)模轉(zhuǎn)換器(DAC)提供時(shí)鐘。實(shí)際上,它們?cè)谛酒瑑?nèi)部直接連接到DAC并通過(guò)觸發(fā)輸出直接驅(qū)動(dòng)DAC,這2個(gè)定時(shí)器是互相獨(dú)立的,不共享任何資源。6.2.1基本定時(shí)器簡(jiǎn)介T(mén)IM6和TIM7定時(shí)器的主要功能包括:1)16位自動(dòng)重裝載累加計(jì)數(shù)器。2)16位可編程(可實(shí)時(shí)修改)預(yù)分額器,用于對(duì)輸入的時(shí)鐘按系數(shù)為1~65536之間的任意數(shù)值分頻。3)觸發(fā)DAC的同步電路。4)在更新事件(計(jì)數(shù)益詢品)時(shí)產(chǎn)生中斷/DMA請(qǐng)求?;径〞r(shí)器內(nèi)部結(jié)構(gòu)如圖6-1所示。6.2.2基本定時(shí)器的主要特性圖6-1基本定時(shí)器結(jié)構(gòu)框圖1.時(shí)基單元這個(gè)可編程定時(shí)器的主要部分是一個(gè)帶有自動(dòng)重裝錢(qián)的16位累加計(jì)數(shù)器,計(jì)數(shù)器的時(shí)鐘通過(guò)一個(gè)預(yù)分頻器得到。軟件可以讀寫(xiě)計(jì)數(shù)器、自動(dòng)重裝載寄存器和預(yù)分頻寄存器,即使計(jì)數(shù)器運(yùn)行時(shí)也可以操作。時(shí)基單元包含:1)計(jì)數(shù)器寄存器(TIMx_CNT)。2)預(yù)分頻寄存器(TIMx_PSC)。3)自動(dòng)重裝載寄存器(TIMx_ARR)。6.2.3基本定時(shí)器的功能2.時(shí)鐘源從STM32F103基本定時(shí)器內(nèi)部結(jié)構(gòu)圖可以看出,基本定時(shí)器TIM6和TIM7只有一個(gè)時(shí)鐘源,即內(nèi)部時(shí)鐘CK_INT。對(duì)于STM32F103所有的定時(shí)器,內(nèi)部時(shí)鐘CK_INT都來(lái)自RCC的TIMxCLK,但對(duì)于不同的定時(shí)器,TIMxCLK的來(lái)源不同?;径〞r(shí)器TIM6和TIM7的TIMxCLK來(lái)源于APB1預(yù)分頻器的輸出,系統(tǒng)默認(rèn)情況下,APB1的時(shí)鐘頻率為72MHz。3.預(yù)分頻器預(yù)分頻可以以系數(shù)介于1~65536之間的任意數(shù)值對(duì)計(jì)數(shù)器時(shí)鐘分頻。它是通過(guò)一個(gè)16位寄存器(TIMx_PSC)的計(jì)數(shù)實(shí)現(xiàn)分頻。因?yàn)門(mén)IMx_PSC控制寄存器具有緩沖作用,可以在運(yùn)行過(guò)程中改變它的數(shù)值,新的預(yù)分頻數(shù)值將在下一個(gè)更新事件時(shí)起作用。圖6-2是在運(yùn)行過(guò)程中改變預(yù)分頻系數(shù)的例子,預(yù)分頻系數(shù)從1變到2。圖6-2預(yù)分頻系數(shù)從1變到2的計(jì)數(shù)器時(shí)序圖4.計(jì)數(shù)模式STM32F103基本定時(shí)器只有向上計(jì)數(shù)工作模式,其工作過(guò)程如圖6-3所示,其中↑表示產(chǎn)生溢出事件。圖6-3向上計(jì)數(shù)工作模式基本定時(shí)器工作時(shí),脈沖計(jì)數(shù)器TIMx_CNT從0累加計(jì)數(shù)到自動(dòng)重裝載數(shù)值(TIMx_ARR寄存器),然后重新從0開(kāi)始計(jì)數(shù)并產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件。由此可見(jiàn),如果使用基本定時(shí)器進(jìn)行延時(shí),延時(shí)時(shí)間可以由以下公式計(jì)算:延時(shí)時(shí)間=(TIMx_ARR+1)*(TIMx_PSC+1)/TIMxCLK當(dāng)發(fā)生一次更新事件時(shí),所有寄存器會(huì)被更新并設(shè)置更新標(biāo)志:傳送預(yù)裝載值(TIMx_PSC寄存器的內(nèi)容)至預(yù)分頻器的緩沖區(qū),自動(dòng)重裝載影子寄存器被更新為預(yù)裝載值(TIMx_ARR)。以下是一些在TIMx_ARR=0x36時(shí)不同時(shí)鐘頻率下計(jì)數(shù)器工作的圖示例子。圖6-4內(nèi)部時(shí)鐘分頻系數(shù)為1,圖6-5內(nèi)部時(shí)鐘分頻系數(shù)為2。圖6-4計(jì)數(shù)器時(shí)序圖(內(nèi)部時(shí)鐘分頻系數(shù)為1)圖6-5計(jì)數(shù)器時(shí)序圖(內(nèi)部時(shí)鐘分頻系數(shù)為2)現(xiàn)將STM32F103基本定時(shí)器相關(guān)寄存器名稱(chēng)介紹如下,可以用半字(16位)或字(32位)的方式操作這些外設(shè)寄存器,由于是采用庫(kù)函數(shù)方式編程,故不作進(jìn)一步的探討。(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計(jì)數(shù)器(TIMx_CNT).(7)TIM6和TIM7預(yù)分頻器(TIMx_PSC)。(8)TIM6和TIM7自動(dòng)重裝載寄存器(TIMx_ARR)。6.2.4基本定時(shí)器寄存器6.3通用定時(shí)器通用定時(shí)器(TIM2、TIM3、TIM4和TIM5)是一個(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)度和波形周期可以在幾微秒到幾毫秒間調(diào)整。每個(gè)定時(shí)器都是完全獨(dú)立的,沒(méi)有互相共享任何資源。它們可以同步操作。6.3.1通用定時(shí)器簡(jiǎn)介通用TIMx(TIM2、TIM3、TIM4和TIM5)定時(shí)器功能包括:1)16位向上、向下、向上/向下自動(dòng)裝載計(jì)數(shù)器。2)16位可編程(可以實(shí)時(shí)修改)預(yù)分頻器,計(jì)數(shù)器時(shí)鐘頻率的分頻系數(shù)為1~65536之間的任意數(shù)值。3)4個(gè)獨(dú)立通道:①輸入捕獲。②輸出比較。③PWM生成(邊緣或中間對(duì)齊模式)。④單脈沖模式輸出。4)使用外部信號(hào)控制定時(shí)器和定時(shí)器互連的同步電路。6.3.2通用定時(shí)器主要功能5)如下事件發(fā)生時(shí)產(chǎn)生中斷/DMA:①更新,計(jì)數(shù)器向上溢出/向下溢出,計(jì)數(shù)器初始化(通過(guò)軟件或者內(nèi)部/外部觸發(fā))。②觸發(fā)事件(計(jì)數(shù)器啟動(dòng)、停止、初始化或者由內(nèi)部/外部觸發(fā)計(jì)數(shù))。③輸入捕獲。④輸出比較。6)支持針對(duì)定位的增量(正交)編碼器和霍爾傳感器電路。7)觸發(fā)輸入作為外部時(shí)鐘或者按周期的電流管理。通用定時(shí)器內(nèi)部結(jié)構(gòu)如圖6-6所示。相比于基本定時(shí)器其內(nèi)部結(jié)構(gòu)要復(fù)雜得多,其中最顯著的地方就是增加了4個(gè)捕獲/比較寄存器TIMx_CCR,這也是通用定時(shí)器之所以擁有那么多強(qiáng)大功能的原因。6.3.3通用定時(shí)器功能描述圖6-6通用定時(shí)器內(nèi)部結(jié)構(gòu)框圖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)。預(yù)分頻器可以將計(jì)數(shù)器的時(shí)鐘頻率按1~65536之間的任意值分頻。它是基于一個(gè)(在TIMx_PSC寄存器中的)16位寄存器控制的16位計(jì)數(shù)器。這個(gè)控制寄存器帶有緩沖器,它能夠在工作時(shí)被改變。新的預(yù)分頻器參數(shù)在下一次更新事件到來(lái)時(shí)被采用。2.計(jì)數(shù)模式1)向上計(jì)數(shù)模式向上計(jì)數(shù)模式工作過(guò)程同基本定時(shí)器向上計(jì)數(shù)模式,工作過(guò)程如圖6-7所示。在向上計(jì)數(shù)模式中,計(jì)數(shù)器在時(shí)鐘CK_CNT的驅(qū)動(dòng)下從0計(jì)數(shù)到自動(dòng)重裝載寄存器TIMx_ARR的預(yù)設(shè)值,然后重新從0開(kāi)始計(jì)數(shù),并產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,可觸發(fā)中斷或DMA請(qǐng)求。當(dāng)發(fā)生一個(gè)更新事件時(shí),所有的寄存器都被更新,硬件同時(shí)設(shè)置更新標(biāo)志位。對(duì)于一個(gè)工作在向上計(jì)數(shù)模式下的通用定時(shí)器,當(dāng)自動(dòng)重裝載寄存器T1Mx_ARR的值為0x36,內(nèi)部預(yù)分頻系數(shù)為4(預(yù)分頻奇存器TIMx_PSC的值為3)的計(jì)數(shù)器時(shí)序圖如圖6-7所示。圖6-7計(jì)數(shù)器時(shí)序圖(內(nèi)部時(shí)鐘分頻因子位4)2)向下計(jì)數(shù)模式通用定時(shí)器向下計(jì)數(shù)模式工作過(guò)程如圖6-8所示。在向下計(jì)數(shù)模式中,計(jì)數(shù)器在時(shí)鐘CK_CNT的驅(qū)動(dòng)下從自動(dòng)重裝載寄存器TIMx_ARR的預(yù)設(shè)值開(kāi)如向下計(jì)數(shù)到0,然后從自動(dòng)重裝載寄存器TIMx_ARR的預(yù)設(shè)值重新開(kāi)始計(jì)數(shù),并產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,可觸發(fā)中斷或DMA請(qǐng)求。當(dāng)發(fā)生一個(gè)更新事件時(shí),所有的寄存器都被更新,硬件同時(shí)設(shè)置更新標(biāo)志位。圖6-8向下計(jì)數(shù)工作模式對(duì)于一個(gè)工作在向下計(jì)數(shù)模式下的通用定時(shí)器,當(dāng)自動(dòng)重裝載寄存器TIMx_ARR的值為0x36,內(nèi)部預(yù)分頻系數(shù)為2(預(yù)分頻寄存器TIMx_PSC的值為1)的計(jì)數(shù)器時(shí)序圖如圖6-9所示。圖6-9計(jì)數(shù)器時(shí)序圖(內(nèi)部時(shí)鐘分頻因子位4)3)向上/向下計(jì)數(shù)模式向上/向下計(jì)數(shù)模式又稱(chēng)為中央對(duì)齊模式或雙向計(jì)數(shù)模式,其工作過(guò)程如圖6-10所示,計(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)生更新事件,觸發(fā)中斷或DMA請(qǐng)求。圖6-10向上/向下計(jì)數(shù)模式對(duì)于一個(gè)工作在向上/向下計(jì)數(shù)模式下的通用定時(shí)器,當(dāng)自動(dòng)重裝載寄存器TIMx_ARR的值為0x06,內(nèi)部預(yù)分頻系數(shù)為1(預(yù)分頻寄存器TIMx_PSC的值為0)的計(jì)數(shù)器時(shí)序圖如圖6-11所示。圖6-11計(jì)數(shù)器時(shí)序圖(內(nèi)部時(shí)鐘分頻因子為1)3.時(shí)鐘選擇相比于基本定時(shí)器單一的內(nèi)部時(shí)鐘源,STM32F103通用定時(shí)器的16位計(jì)數(shù)器的時(shí)鐘源有多種選擇,可由以下時(shí)鐘源提供。1)內(nèi)部時(shí)鐘(CK_INT)內(nèi)部時(shí)鐘CK_INT來(lái)自RCC的TIMxCLK,根據(jù)STM32F103時(shí)鐘樹(shù),通用定時(shí)器TIM2~TIM5內(nèi)部時(shí)鐘CK_INT的來(lái)源TIM_CLK,與基本定時(shí)器相同,都是來(lái)自APB1預(yù)分頻器的輸出,通常情況下,其時(shí)鐘頻率是72MHz2)外部輸入捕獲引腳TIx(外部時(shí)鐘模式1)外部輸入捕獲引腳TIx(外部時(shí)鐘模式1)來(lái)自外部輸入捕獲引腳上的邊沿信號(hào)。計(jì)數(shù)器可以在選定的輸入端(引腳1:TI1FP1或TI1F_ED,引腳2:TI2FP2)的每個(gè)上升沿或下降沿計(jì)數(shù)。3)外部觸發(fā)輸入引腳ETR(外部時(shí)鐘模式2)外部觸發(fā)輸入引腳ETR(外部時(shí)鐘模式2)來(lái)自外部引腳ETR。計(jì)數(shù)器能在外部觸發(fā)輸入ETR的每個(gè)上升沿或下降沿計(jì)數(shù)。4)內(nèi)部觸發(fā)器輸入ITRx內(nèi)部觸發(fā)輸入ITRx來(lái)自芯片內(nèi)部其他定時(shí)器的觸發(fā)輸入,使用一個(gè)定時(shí)器作為另個(gè)定時(shí)器的預(yù)分頻器,例如,可以配置TIM1作為T(mén)IM2的預(yù)分頻器。4.捕獲/比較通道每一個(gè)捕獲/比較通道都是圍繞一個(gè)捕獲/比較寄存器(包含影子寄存器),包括捕獲的輸入部分(數(shù)字濾波、多路復(fù)用和預(yù)分頻器)和輸出部分(比較器和輸出控制)。輸入部分對(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)。輸出部分產(chǎn)生一個(gè)中間波形OCxRef(高有效)作為基準(zhǔn),鏈的末端決定最終輸出信號(hào)的極性。1.輸入捕獲模式在輸入捕獲模式下,當(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。6.3.4通用定時(shí)器工作模式2.PWM輸入模式該模式是輸入捕獲模式的一個(gè)特例,除下列區(qū)別外,操作與輸入捕獲模式相同:1)2個(gè)ICx信號(hào)被映射至同一個(gè)TIx輸入。2)這2個(gè)ICx信號(hào)為邊沿有效,但是極性相反。3)其中一個(gè)TIxFP信號(hào)被作為觸發(fā)輸入信號(hào),而從模式控制器被配置成復(fù)位模式。例如,需要測(cè)量輸入到TI1上的PWM信號(hào)的長(zhǎng)度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具體步驟如下(取決于CK_INT的頻率和預(yù)分頻器的值):1)選擇TIMx_CCR1的有效輸入:置TIMx_CCMR1寄存器的CC1S=01(選擇TI1)。2)選擇TI1FP1的有效極性(用來(lái)捕獲數(shù)據(jù)到TIMx_CCR1中和清除計(jì)數(shù)器):置CC1P=0(上升沿有效)。3)選擇TIMx_CCR2的有效輸入:置TIMx_CCMR1寄存器的CC2S=10(選擇144784)選擇T11FP2的有效極性(捕獲數(shù)據(jù)到TIMx_CCR2):置CC2P=1(下降沿有效)。5)選擇有效的觸發(fā)輸入信號(hào):置TIMx_SMCR寄存器中的TS=101(選擇TI1FP1)。6)配置從模式控制器為復(fù)位模式:置TIMx_SMCR中的SMS=100。7)使能捕獲:置TIMx_CCER寄存器中CC1E=1且CC2E=1。3.強(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)求。4.輸出比較模式此項(xiàng)功能是用來(lái)控制一個(gè)輸出波形,或者指示一段給定的的時(shí)間已經(jīng)到時(shí)。當(dāng)計(jì)數(shù)器與捕獲/比較寄存器的內(nèi)容相同時(shí),輸出比較功能做如下操作:1)將輸出比較模式(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)。2)設(shè)置中斷狀態(tài)寄存器中的標(biāo)志位(TIMx_SR寄存器中的CCxIF位)。3)若設(shè)置了相應(yīng)的中斷屏蔽(TIMx_DIER寄存器中的CCxIE位),則產(chǎn)生一個(gè)中斷,4)若設(shè)置了相應(yīng)的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存著中的CCDS位選擇DMA請(qǐng)求功能),則產(chǎn)生一個(gè)DMA請(qǐng)求。輸出比較模式的配置步驟:①選擇計(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í)被更新)。5.PWM模式PWM輸出模式是一種特殊的輸出模式,在電力、電子和電機(jī)控制領(lǐng)域得到廣泛應(yīng)用。1)PWM簡(jiǎn)介PWM是PulseWidthModulation的縮寫(xiě),中文意思就是脈沖寬度調(diào)制,簡(jiǎn)稱(chēng)脈寬調(diào)制。它是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù),其控制簡(jiǎn)單、靈活和動(dòng)態(tài)響應(yīng)好等優(yōu)點(diǎn)而成為電力、電子技術(shù)最廣泛應(yīng)用的控制方式,其應(yīng)用領(lǐng)域包括測(cè)量、通信、功率控制與變換,電動(dòng)機(jī)控制、伺服控制、調(diào)光、開(kāi)關(guān)電源,甚至某些音頻放大器,因此研究基于PWM技術(shù)的正負(fù)脈寬數(shù)控調(diào)制信號(hào)發(fā)生器具有十分重要的現(xiàn)實(shí)意義,PWM是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過(guò)高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來(lái)對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。PWM信號(hào)仍然是數(shù)字的,因?yàn)樵诮o定的任何時(shí)刻,滿幅值的直流供電要么完全有(ON),要么完全無(wú)(OFF),電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加載到模擬負(fù)載上去的。通的時(shí)候即是直流供電被加到負(fù)載上的時(shí)候,斷的時(shí)候即是供電被斷開(kāi)的時(shí)候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。2)PWM實(shí)現(xiàn)目前,在運(yùn)動(dòng)控制系統(tǒng)或電動(dòng)機(jī)控制系統(tǒng)中實(shí)現(xiàn)PWM的方法主要有傳統(tǒng)的數(shù)字電路、微控制器普通I/O模擬和微控制器的PWM直接輸出等。①傳統(tǒng)的數(shù)字電路方式:用傳統(tǒng)的數(shù)字電路實(shí)現(xiàn)PWM(如555定時(shí)器),電路設(shè)計(jì)較復(fù)雜,體積大,抗干擾能力差,系統(tǒng)的研發(fā)周期較長(zhǎng)。②微控制器普通I/O模擬方式:對(duì)于微控制器中無(wú)PWM輸出功能情況(如51單片機(jī)),可以通過(guò)CPU操控普通I/O口來(lái)實(shí)現(xiàn)PWM輸出。但這樣實(shí)現(xiàn)PWM將消耗大量的時(shí)間,大大降低CPU的效率,而且得到的PWM的信號(hào)精度不太高。③微控制器的PWM直接輸出方式:對(duì)于具有PWM輸出功能的微控制器,在進(jìn)行簡(jiǎn)單的配置后即可在微控制器的指定引腳上輸出PWM脈沖。這也是目前使用最多的PWM實(shí)現(xiàn)方式。STM32F103就是這樣一款具有PWM輸出功能的微控制器,除了基本定時(shí)器TIM6和TIM7。其他的定時(shí)器都可以用來(lái)產(chǎn)生PWM輸出。其中高級(jí)定時(shí)器TIM1和TIM8可以同時(shí)產(chǎn)生多達(dá)7路的PWM輸出。而通用定時(shí)器也能同時(shí)產(chǎn)生多達(dá)4路的PWM輸出,STM32最多可以同時(shí)產(chǎn)生30路PWM輸出。3)PWM輸出模式的工作過(guò)程STM32F103微控制器脈沖寬度調(diào)制模式可以產(chǎn)生一個(gè)由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號(hào),其產(chǎn)生原理如圖6-12所示。圖6-12STM32F103微控制器PWM產(chǎn)生原理通用定時(shí)器PWM輸出模式的工作過(guò)程如下:①若配置脈沖計(jì)數(shù)器TIMx_CNT為向上計(jì)數(shù)模式,自動(dòng)重裝載寄存器TIMx_ARR的預(yù)設(shè)為N,則脈沖計(jì)數(shù)器TIMx_CNT的當(dāng)前計(jì)數(shù)值X在時(shí)鐘CK_CNT(通常由TIMACLK經(jīng)TIMx_PSC分頻而得)的驅(qū)動(dòng)下從0開(kāi)始不斷累加計(jì)數(shù)。②在脈沖計(jì)數(shù)器TIMx_CNT隨著時(shí)鐘CK_CNT觸發(fā)進(jìn)行累加計(jì)數(shù)的同時(shí),脈沖計(jì)數(shù)M_CNT的當(dāng)前計(jì)數(shù)值x與抽獲/比較寄存器TIMx_CCR的預(yù)設(shè)值A(chǔ)進(jìn)行比較;如果X<A,輸出高電平(或低電平);如果X≥A,輸出低電平(或高電平)。③當(dāng)脈沖計(jì)數(shù)器TIMx_CNT的計(jì)數(shù)值X大于自動(dòng)重裝載寄存器TIMXARR的m值N時(shí),膚沖計(jì)數(shù)器TIMx_CNT的計(jì)數(shù)值清零并重新開(kāi)始計(jì)數(shù)。如此循環(huán)往復(fù),得到的PWM的輸出信號(hào)周期為(N+1)xTCK_CNT,其中,N為自動(dòng)重裝載寄存器TIMx_ARR的預(yù)設(shè)值,TCK_CNT為時(shí)鐘CK_CNT的周期。PWM輸出信號(hào)脈沖寬度為AXTCKCNT,其中,A為捕獲/比較寄存器TIMx_CCR的預(yù)設(shè)值,TCK_CNT為時(shí)鐘CK_CNT的周期。PWM輸出信號(hào)的占空比為A/(N+1)。下面舉例具體說(shuō)明,當(dāng)通用定時(shí)器被設(shè)置為向上計(jì)數(shù),自動(dòng)重裝載寄存器TIMx_ARR的預(yù)設(shè)值為8,4個(gè)捕獲/比較寄存器TIMx_CCRx分別設(shè)為0、4、8和大于8時(shí),通過(guò)用定時(shí)器的4個(gè)PWM通道的輸出時(shí)序OCxREF和觸發(fā)中斷時(shí)序CCxIF,如圖6-13所示。例如,在TIMx_CCR=4情況下,當(dāng)TIMx_CNT<4時(shí),OCxREF輸出高電平;當(dāng)TIMx_CNT≥4時(shí),OCxREF輸出低電平,并在比較結(jié)果改變時(shí)觸發(fā)CCxIF中斷標(biāo)志。此PWM的占空比為4/(8+1)。圖6-13向上計(jì)數(shù)模式PWM輸出時(shí)序圖需要注意的是,在PWM輸出模式下,脈沖計(jì)數(shù)器TIMx_CNT的計(jì)數(shù)模式有向上計(jì)數(shù)、向下計(jì)數(shù)和向上/向下計(jì)數(shù)(中央對(duì)齊)3種。以上僅介紹其中的向上計(jì)數(shù)方式,但是讀者在掌握了通用定時(shí)器向上計(jì)數(shù)模式的PWM輸出原理后,由此及彼,通用定時(shí)器的其他兩種計(jì)數(shù)模式的PWM輸出也就容易推出了。現(xiàn)將STM32F103通用定時(shí)器相關(guān)寄存器名稱(chēng)介紹如下,可以用半字(16位)或字(位)的方式操作這些外設(shè)寄存器,由于是采用庫(kù)函數(shù)方式編程,故不做進(jìn)一步的探討。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通用定時(shí)器寄存器10)計(jì)數(shù)器(TIMx_CNT)。11)預(yù)分頻器(TIMx_PSC)。12)自動(dòng)重裝載寄存器(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高級(jí)定時(shí)器高級(jí)控制定時(shí)器(TIM1和TIM8)由一個(gè)16位的自動(dòng)裝載計(jì)數(shù)器組成,它由一個(gè)可編程的預(yù)分頻器驅(qū)動(dòng),適合多種用途,包含測(cè)量輸入信號(hào)的脈沖寬度(輸入捕獲),或者產(chǎn)生輸出波形(輸出比較、PWM、嵌入死區(qū)時(shí)間的互補(bǔ)PWM等)。使用定時(shí)器預(yù)分頻器和RCC時(shí)鐘控制預(yù)分頻器,可以實(shí)現(xiàn)脈沖寬度和波形周期從幾微秒到幾毫秒的調(diào)節(jié)。高級(jí)控制定時(shí)器(TIM1和TIM8)和通用定時(shí)器(TIMx)是完全獨(dú)立的,它們不共享任何資源,可以同步操作。9.4.2高級(jí)定時(shí)器特性6.4.1高級(jí)定時(shí)器簡(jiǎn)介T(mén)IM1和TIM8定時(shí)器的功能包括:1)16位向上、向下、向上/下自動(dòng)裝載計(jì)數(shù)器。2)16位可編程(可以實(shí)時(shí)修改)預(yù)分頻器,計(jì)數(shù)器時(shí)鐘頻率的分頻系數(shù)為1~65536之間的任意數(shù)值。3)多達(dá)4個(gè)獨(dú)立通道:輸入捕獲、輸出比較、PWM生成(邊緣或中間對(duì)齊模式)、單脈沖模式輸出。4)死區(qū)時(shí)間可編程的互補(bǔ)輸出。5)使用外部信號(hào)控制定時(shí)器和定時(shí)器互聯(lián)的同步電路。6)允許在指定數(shù)目的計(jì)數(shù)器周期之后更新定時(shí)器寄存器的重復(fù)計(jì)數(shù)器。7)剎車(chē)輸入信號(hào)可以將定時(shí)器輸出信號(hào)置于復(fù)位狀態(tài)或者一個(gè)已知狀態(tài)。8)如下事件發(fā)生時(shí)產(chǎn)生中斷/DMA:①更新,計(jì)數(shù)器向上溢出/向下溢出,計(jì)數(shù)器初始化。②觸發(fā)事件(計(jì)數(shù)器啟動(dòng)、停止、初始化或者由內(nèi)部/外部觸發(fā)計(jì)數(shù))。③輸入捕獲。④輸出比較。⑤剎車(chē)信號(hào)輸入。9)支持針對(duì)定位的增量(正交)編碼器和霍爾傳感器電路。10)觸發(fā)輸入作為外部時(shí)鐘或者按周期的電流管理。STM32F103高級(jí)定時(shí)器的內(nèi)部結(jié)構(gòu)要比通用定時(shí)器復(fù)雜一些,但其核心仍然與基本定時(shí)器、通用定時(shí)器相同,是一個(gè)由可編程的預(yù)分頻器驅(qū)動(dòng)的具有自動(dòng)重裝載功能的16位計(jì)數(shù)器。與通用定時(shí)器相比,STM32F103高級(jí)定時(shí)器主要多了BRK和DTG兩個(gè)結(jié)構(gòu),因而具有了死區(qū)時(shí)間的控制功能。因?yàn)楦呒?jí)定時(shí)器的特殊功能,在普通應(yīng)用中一般較少使用,所以不作為本書(shū)討論的重點(diǎn),如需詳細(xì)了解可以查閱STM32中文參考手冊(cè)。6.4.2高級(jí)定時(shí)器結(jié)構(gòu)6.5定時(shí)器庫(kù)函數(shù)TIM固件庫(kù)支持72種庫(kù)函數(shù),如表6-2所示。為了理解這些函數(shù)的具體使用方法,本節(jié)將對(duì)其中的部分庫(kù)函數(shù)做詳細(xì)介紹。STM32F10x的定時(shí)器庫(kù)函數(shù)存放在STM32F10x標(biāo)準(zhǔn)外設(shè)庫(kù)的STM32F10x_tim.h和STM32F10x_tim.c文件中。其中,頭文件STM32F10x_tim.h用來(lái)存放定時(shí)器相關(guān)結(jié)構(gòu)體和宏定義以及定時(shí)器庫(kù)函數(shù)聲明,源代碼文件STM32F10x_tim.c用來(lái)存放定時(shí)器庫(kù)函數(shù)定義。函數(shù)名稱(chēng)功能TIM_DeInit將外設(shè)TIMx寄存器重設(shè)為缺省值TIM_TimeBaseInit根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù),初始化TIMx的時(shí)間基數(shù)單位TIM_OCInit根據(jù)TIM_OCInitStruct中指定的參數(shù),初始化外設(shè)TIMxTIM_ICInit根據(jù)TIM_ICInitStruct中指定的參數(shù),初始化外設(shè)TIMxTIM_TimeBaseStructInit把TIM_TimeBaseInitStruct中的每一個(gè)參數(shù)按缺省值填入TIM_OCStructInit把TIM_OCInitStruct中的每一個(gè)參數(shù)按缺省值填入TIM_ICStructInit把TIM_ICInitStruct中的每一個(gè)參數(shù)按缺省值填入TIM_Cmd使能或者失能TIMx外設(shè)TIM_ITConfig使能或者失能指定的TIM中斷TIM_DMAConfig設(shè)置TIMx的DMA接口TIM_DMACmd使能或者失能指定的TIMx的DMA請(qǐng)求TIM_InternalClockConfig設(shè)置TIMx內(nèi)部時(shí)鐘TIM_ITRxExternalClockConfig設(shè)置TIMx內(nèi)部觸發(fā)為外部時(shí)鐘模式TIM_TIxExternalClockConfig設(shè)置TIMx觸發(fā)為外部時(shí)鐘TIM_ETRClockMode1Config配置TIMx外部時(shí)鐘模式1TIM_ETRClockMode2Config配置TIMx外部時(shí)鐘模式2TIM_ETRConfig配置TIMx外部觸發(fā)TIM_SelectInputTrigger選擇TIMx輸入觸發(fā)源表6-2TIM庫(kù)函數(shù)函數(shù)名稱(chēng)功能TIM_PrescalerConfig設(shè)置TIMx預(yù)分頻TIM_CounterModeConfig設(shè)置TIMx計(jì)數(shù)器模式TIM_ForcedOC1Config置TIMx輸出1為活動(dòng)或者非活動(dòng)電平TIM_ForcedOC2Config置TIMx輸出2為活動(dòng)或者非活動(dòng)電平TIM_ForcedOC3Config置TIMx輸出3為活動(dòng)或者非活動(dòng)電平TIM_ForcedOC4Config置TIMx輸出4為活動(dòng)或者非活動(dòng)電平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在一個(gè)外部事件時(shí)清除或者保持OCREF1信號(hào)TIM_ClearOC2Ref在一個(gè)外部事件時(shí)清除或者保持OCREF2信號(hào)表6-2TIM庫(kù)函數(shù)(續(xù)表1)函數(shù)名稱(chēng)功能TIM_ClearOC3Ref在一個(gè)外部事件時(shí)清除或者保持OCREF3信號(hào)TIM_ClearOC4Ref在一個(gè)外部事件時(shí)清除或者保持OCREF4信號(hào)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更新請(qǐng)求源TIM_SelectHallSensor使能或者失能TIMx霍爾傳感器接口TIM_SelectOnePulseMode設(shè)置TIMx單脈沖模式TIM_SelectOutputTrigger選擇TIMx觸發(fā)輸出模式TIM_SelectSlaveMode選擇TIMx從模式TIM_SelectMasterSlaveMode設(shè)置或重置TIMx主/從模式TIM_SetCounter設(shè)置TIMx計(jì)數(shù)器寄存器值TIM_SetAutoreload設(shè)置TIMx自動(dòng)重裝載寄存器值TIM_SetCompare1設(shè)置TIMx捕獲/比較1寄存器值表6-2TIM庫(kù)函數(shù)(續(xù)表2)函數(shù)名稱(chēng)功能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的時(shí)鐘分割值TIM_GetCapture1獲得TIMx輸入捕獲1的值TIM_GetCapture2獲得TIMx輸入捕獲2的值TIM_GetCapture3獲得TIMx輸入捕獲3的值TIM_GetCapture4獲得TIMx輸入捕獲4的值TIM_GetCounter獲得TIMx計(jì)數(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庫(kù)函數(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,用來(lái)選擇TIM外設(shè)。輸出參數(shù):無(wú)。。返回值:無(wú)例如:/*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í)間基數(shù)單位。輸入?yún)?shù)1:TIMx:x可以是1~8,用來(lái)選擇TIM外設(shè)。輸入?yún)?shù)2:TIMTimeBase_InitStruct:指向結(jié)構(gòu)TIM_TimeBaseInitTypeDef的指針,包含了TIMx時(shí)間基數(shù)單位的配置信息。輸出參數(shù):無(wú)。返回值:無(wú)。例如: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ù)單位的配置信息。輸出參數(shù):無(wú)。返回值:無(wú)。例如:/*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ù)單位的配置信息。輸出參數(shù):無(wú)。返回值:無(wú)。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ù)單位的配置信息。輸出參數(shù):無(wú)。返回值:無(wú)。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ù)單位的配置信息。輸出參數(shù):無(wú)。返回值:無(wú)。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īng)顟B(tài)。這個(gè)參數(shù)可以取:ENABLE或者DISABLE。輸出參數(shù):無(wú)。返回值:無(wú)。例如:/*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,用來(lái)選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_IT:待使能或者失能的TIM中斷源。輸入?yún)?shù)3:NewState:TIMx中斷的新?tīng)顟B(tài),這個(gè)參數(shù)可以?。篍NABLE或者DISABLE。輸出參數(shù):無(wú)。返回值:無(wú)。例如:/*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ù):無(wú)。返回值:無(wú)。例如:/*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ù):無(wú)。返回值:無(wú)。例如:/*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ù):無(wú)。返回值:無(wú)。例如:/*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ù):無(wú),返回值:無(wú),例如:/*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,用來(lái)選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_FLAG,檢查的TIM標(biāo)志位。輸出參數(shù):無(wú)。返回值:TIM_FLAG的新?tīng)顟B(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,用來(lái)選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_FLAG,清除的TIM標(biāo)志位。輸出參數(shù):無(wú)。返回值:無(wú)。例如:/*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,用來(lái)選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_IT,檢查的TIM中斷源。輸出參數(shù):無(wú)。返回值:TIM_IT的新?tīng)顟B(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,用來(lái)選擇TIM外設(shè)。輸入?yún)?shù)2:TIM_IT,檢查的TIM中斷待處理位。輸出參數(shù):無(wú)。返回值:無(wú)。例如:/*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ù):無(wú)。返回值:無(wú)。例如:/*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ù):無(wú)。返回值:無(wú)。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ù):無(wú)。返回值:無(wú)。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ù):無(wú)。返回值:無(wú)。6.6定時(shí)器應(yīng)用實(shí)例通用定時(shí)器具有多種功能,但其原理大致相同,但其流程有所區(qū)別,以使用中斷方式為例,主要包括三部分,即NVIC設(shè)置、TIM中新配管、定封器中新服務(wù)程序。1.NVIC設(shè)置NVIC設(shè)置用來(lái)完成中斷分組、中斷通道選擇、中斷優(yōu)先級(jí)設(shè)置及使能中斷的功能,其流程圖如圖4-5所示。其中,值得注意的是通道的選擇,對(duì)于不同的定時(shí)器,不同事件發(fā)生時(shí)產(chǎn)生不同的中斷請(qǐng)求,針對(duì)不同的功能要選擇相應(yīng)的中斷通道。6.6.1通用定時(shí)器配置流程2.TIM中斷配置TIM中斷配置用來(lái)配置定時(shí)器時(shí)基及開(kāi)啟中新。TIM中斷配置流程圖如圖6-14所示。高級(jí)控制定時(shí)器使用的是APB2總線,基本定時(shí)器和通用定時(shí)器使用APB1總線采用相應(yīng)函數(shù)開(kāi)啟時(shí)種。預(yù)分頻將輸入時(shí)鐘頻率按1~65536之間的值任意分頻。分頻值決定了計(jì)數(shù)頻率。計(jì)效值為計(jì)數(shù)的個(gè)數(shù),當(dāng)計(jì)數(shù)寄存器的值達(dá)到計(jì)數(shù)值時(shí),嚴(yán)生溢出,發(fā)生中斷。如TIM1系統(tǒng)時(shí)鐘為72MHz,若設(shè)定的預(yù)分頻TIM_Prescaler=7200-1。計(jì)教值TIM_Period=10000,則計(jì)數(shù)時(shí)鐘周期(TIM_Pescaler+1)/72MHz=0.1ms,定時(shí)器產(chǎn)生10000x0.1ms=1000ms的定時(shí)、每1s產(chǎn)生一次中斷。計(jì)數(shù)模式可以設(shè)置為向上計(jì)數(shù)、向下計(jì)數(shù)對(duì)向上向下計(jì)數(shù),設(shè)置好時(shí)基參數(shù)后,調(diào)用函數(shù)TIM_TimeBaseInt()完成時(shí)基設(shè)置。為了避免在設(shè)置時(shí)進(jìn)入中斷,這里需要清除中斷標(biāo)志。如設(shè)置為向上計(jì)數(shù)模式,則調(diào)用函數(shù)TIM_ClearFlag(TIM1,TIM_FLAG_Update)清除向上溢出中斷標(biāo)志。中斷在使用時(shí)必須使能,如向上溢出中斷,則需調(diào)用函數(shù)TIM_ITConfig()。不同的模式其參數(shù)不同,如向上計(jì)數(shù)模式時(shí)為T(mén)IM_ITConfig(TIM1,TIMIT_Update,ENABLE)。在需要的時(shí)候使用函數(shù)TIM_CMD()開(kāi)啟定時(shí)器。圖6-14TIM中斷配置流程圖3.定時(shí)器中斷處理程序進(jìn)入定時(shí)器中斷后需根據(jù)設(shè)計(jì)完成響應(yīng)操作,定時(shí)器中斷處理流程如圖6-15所示。在啟動(dòng)文件中定義了定時(shí)器中斷的入口,對(duì)于不同的中斷請(qǐng)求要采用相應(yīng)的中斷函數(shù)名,程序代碼如下:DCDTIM1_BRK_IRQHandler;TIM1BreakDCDTIM1_UP_IRQHandler;TIM1UpdateDCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutationDCDTIM1_CC_IRQHandler;TIM1CaptureCompareDCDTIM2_IRQHandler;TIM2DCDTIM3_IRQHandler;TIM3DCDTIM4_IRQHandler;TIM4進(jìn)入中斷后,首先要檢測(cè)中斷請(qǐng)求是否為所需中斷,以防誤操作。如果確實(shí)是所需中斷,則進(jìn)行中斷處理,中斷處理完后清除中斷標(biāo)志位,否則會(huì)一直處于中斷中。圖6-15定時(shí)器中斷處理程序流程圖本實(shí)例利用基本定時(shí)器TIM6/7定時(shí)1s,1s時(shí)間到LED翻轉(zhuǎn)一次。基本定時(shí)器是單片機(jī)內(nèi)部的資源,沒(méi)有外部IO,不需要接外部電路,只需要一個(gè)LED燈即可。6.6.2定時(shí)器應(yīng)用的硬件設(shè)計(jì)編寫(xiě)兩個(gè)定時(shí)器驅(qū)動(dòng)文件bsp_TiMbase.h和bsp_TiMbase.h,用來(lái)配置定時(shí)器中斷優(yōu)先級(jí)和初始化定時(shí)器。編程要點(diǎn):1)開(kāi)定時(shí)器時(shí)鐘TIMx_CLK,x[6,7];2)初始化時(shí)基初始化結(jié)構(gòu)體;3)使能TIMx,x[6,7]update中斷;4)打開(kāi)定時(shí)器;5)編寫(xiě)中斷服務(wù)程序。通用定時(shí)器和高級(jí)定時(shí)器的定時(shí)編程要點(diǎn)與基本定時(shí)器差不多,只是還要再選擇計(jì)算第器的計(jì)數(shù)模式,是向上還是向下。因?yàn)榛径〞r(shí)器只能向上計(jì)數(shù),且沒(méi)有配置計(jì)數(shù)模式的寄存器,默認(rèn)是向上。6.6.3定時(shí)器應(yīng)用的軟件設(shè)計(jì)6.7SysTick系統(tǒng)滴答定時(shí)器SysTick-系統(tǒng)定時(shí)器是屬于CM3內(nèi)核中的一個(gè)外設(shè),內(nèi)嵌在NVIC中。系統(tǒng)定時(shí)器一個(gè)24位的向下遞減的計(jì)數(shù)器,計(jì)數(shù)器每計(jì)數(shù)一次的時(shí)間為1/SYSCLK,一般設(shè)置統(tǒng)時(shí)鐘SYSCLK等于72MHz。當(dāng)重裝載數(shù)值寄存器的值遞減到0的時(shí)候,系統(tǒng)定時(shí)器就發(fā)生一次中斷,以此循環(huán)往復(fù)。因?yàn)镾ysTick是屬于CM3內(nèi)核的外設(shè),所以所有基于CM3內(nèi)核的單片機(jī)都具有這系統(tǒng)定時(shí)器,這使得軟件在CM3單片機(jī)中可以很容易被移植。系統(tǒng)定時(shí)器一般用于操作系統(tǒng),用于產(chǎn)生時(shí)基,維持操作系統(tǒng)的心跳。6.7.1SysTick功能綜述SysTick當(dāng)計(jì)到數(shù)器到達(dá)0(0并未計(jì)完)時(shí),將從RELOAD寄存器中自動(dòng)重裝載定時(shí)初值。只要不把它在SysTick控制及狀態(tài)寄存器中的使能位清除,就永不停息。SysTick工作時(shí)序如圖6-16所示。圖6-16SysTick工作時(shí)序圖系統(tǒng)時(shí)鐘節(jié)拍(SysT

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論