《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 李正軍 第5、6章 輸入輸出接口GPIO、定時器_第1頁
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 李正軍 第5、6章 輸入輸出接口GPIO、定時器_第2頁
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 李正軍 第5、6章 輸入輸出接口GPIO、定時器_第3頁
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 李正軍 第5、6章 輸入輸出接口GPIO、定時器_第4頁
《STM32嵌入式單片機(jī)原理與應(yīng)用》 課件 李正軍 第5、6章 輸入輸出接口GPIO、定時器_第5頁
已閱讀5頁,還剩158頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章通用輸入/輸出

接口GPIO本章講述了通用輸入/輸出接口GPIO,包括通用輸入/輸出接口概述、GPIO的功能、GPIO常用庫函數(shù)、GPIO使用流程、GPIO輸出應(yīng)用實例和GPIO輸入應(yīng)用實例。幾乎在所有的嵌入式系統(tǒng)應(yīng)用中,都涉及開關(guān)量的輸入和輸出功能,例如狀態(tài)指示、報警輸出、繼電器閉合和斷開、按鈕狀態(tài)讀入、開關(guān)量報警信息的輸入等。這些開關(guān)量的輸入和控制輸出都可以通過通用輸入/輸出接口實現(xiàn)。STM32F103VET6有80根多功能雙向能承受5V電壓的快速I/O口線。每16根口線分為一組,分別為PA、PB、PC、PD、PE。每個GPIO端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR),一個32位置位/復(fù)位寄存器(GPIOx_BSRR),一個16位復(fù)位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。5.1通用輸入/輸出接口概述GPIO端口的每個位都可以由軟件分別配置成以下模式。1)輸入浮空:浮空(floating)就是邏輯器件的輸入引腳既不接高電平,也不接低電平。由于邏輯器件的內(nèi)部結(jié)構(gòu),當(dāng)它輸入引腳懸空時,相當(dāng)于該引腳接了高電平。一般實際運(yùn)用時,引腳不建議懸空,易受干擾。2)輸入上拉:上拉就是把電壓拉高,比如拉到Vcc。上拉就是將不確定的信號通過一個電阻嵌位在高電平。電阻同時起限流作用。弱強(qiáng)只是上拉電阻的阻值不同,沒有什么嚴(yán)格區(qū)分。3)輸入下拉:就是把電壓拉低,拉到GND。與上拉原理相似。4)模擬輸入:模擬輸入是指傳統(tǒng)方式的模擬量輸入。數(shù)字輸入是輸入數(shù)字信號,即0和1的二進(jìn)制數(shù)字信號。5)開漏輸出:輸出端相當(dāng)于三極管的集電極。要得到高電平狀態(tài)需要上拉電阻才行。適合于做電流型的驅(qū)動,其吸收電流的能力相對強(qiáng)(一般20mA以內(nèi))。6)推挽式輸出:可以輸出高低電平,連接數(shù)字器件;推挽結(jié)構(gòu)一般是指兩個三極管分別受兩個互補(bǔ)信號的控制,總是在一個三極管導(dǎo)通的時候另一個截止。7)推挽式復(fù)用功能。8)開漏復(fù)用功能。復(fù)用功能可以理解為GPIO口被用作第二功能時的配置情況(即并非作為通用I/O口使用)。每個I/O可以自由編程,而I/O口寄存器必須按32位字訪問(不允許半字或字節(jié)訪問)。GPIOx_BSRR和GPIOxBRR寄存器允許對任何GPIO寄存器的讀/更改的獨立訪問,這樣,在讀和更改訪問之間產(chǎn)生中斷(IRQ)時不會發(fā)生危險。一個I/O口的基本結(jié)構(gòu)如圖5-1所示。圖5-1一個I/O口位的基本結(jié)構(gòu)I/O口位的基本結(jié)構(gòu)包括以下幾部分。包括輸入數(shù)據(jù)寄存器和輸入驅(qū)動器。在接近I/O引腳處連接了兩只保護(hù)二極管,假設(shè)保護(hù)二極管的導(dǎo)通電壓降為Vd,則輸入到輸入驅(qū)動器的信號電壓范圍被鉗位在:Vss-Vd<Vin<Vdd+Vd

由于Vd的導(dǎo)通壓降不會超過0.7V,若電源電壓Vdd為3.3V,則輸入到輸入驅(qū)動器的信號最低不會低于-0.7V,最高不會高于4V,起到了保護(hù)作用。5.1.1輸入通道輸出通道中包括位設(shè)置/清除寄存器、輸出數(shù)據(jù)寄存器、輸出驅(qū)動器。要輸出的開關(guān)量數(shù)據(jù)首先寫入到位設(shè)置/清除存器,通過讀寫命令進(jìn)入輸出數(shù)據(jù)寄存器,然后進(jìn)入輸出驅(qū)動的輸出控制模塊。輸出控制模塊可以接收開關(guān)量的輸出和復(fù)用功能輸出。輸出的信號通過由P-MOS和N-MOS場效應(yīng)管電路輸出到引腳。通過軟件設(shè)置,由P-MOS和N-MOS場效應(yīng)管電路可以構(gòu)成推挽方式、開漏方式或者關(guān)閉。5.1.2輸出通道5.2GPIO的功能復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O口被配置成浮空輸入模式。復(fù)位后,JTAG引腳被置于輸入上拉或下拉模式。1)PA13:JTMS置于上拉模式。2)PA14:JTCK置于下拉模式。3)PA15:JTDI置于上拉模式。4)PB4:JNTRST置于上拉模式。當(dāng)作為輸出配置時,寫到輸出數(shù)據(jù)寄存器(GPIOx_ODR)上的值輸出到相應(yīng)的I/O引腳??梢砸酝仆炷J交蜷_漏模式(當(dāng)輸出0時,只有N-MOS被打開)使用輸出驅(qū)動器。5.2.1普通I/O功能輸入數(shù)據(jù)寄存器(GPIOx_IDR)在每個APB2時鐘周期捕捉I/O引腳上的數(shù)據(jù)。所有GPIO引腳有一個內(nèi)部弱上拉和弱下拉,當(dāng)配置為輸入時,它們可以被激活也可以被斷開。5.2.2單獨的位設(shè)置或位清除當(dāng)對GPIOx_ODR的個別位編程時,軟件不需要禁止中斷:在單次APB2寫操作中,可以只更改一個或多個位。這是通過對“置位/復(fù)位寄存器”(GPIOx_BSRR,復(fù)位是GPIOx_BRR)中想要更改的位寫1來實現(xiàn)的。沒被選擇的位將不被更改。所有端口都有外部中斷能力。為了使用外部中斷線,端口必須配置成輸入模式。5.2.3外部中斷/喚醒線5.2.4復(fù)用功能(AF)使用默認(rèn)復(fù)用功能前必須對端口位配置寄存器編程。1)對于復(fù)用輸入功能,端口必須配置成輸入模式(浮空、上拉或下拉)且輸入引腳必須由外部驅(qū)動。2)對于復(fù)用輸出功能,端口必須配置成復(fù)用功能輸出模式(推挽或開漏)。3)對于雙向復(fù)用功能,端口位必須配置復(fù)用功能輸出模式(推挽或開漏)。此時,輸入驅(qū)動器被配置成浮空輸入模式。如果把端口配置成復(fù)用輸出功能,則引腳和輸出寄存器斷開,并和片上外設(shè)的輸出信號連接。如果軟件把一個GPIO腳配置成復(fù)用輸出功能,但是外設(shè)沒有被激活,那么它的輸出將不確定。5.2.5軟件重新映射I/O復(fù)用功能為了使不同封裝器件的外設(shè)I/O功能的數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些引腳上。這可以通過軟件配置AFIO寄存器來完成,這時,復(fù)用功能就不再映射到它們的原始引腳上了。5.2.6GPIO鎖定機(jī)制鎖定機(jī)制允許凍結(jié)I/O配置。當(dāng)在一個端口位上執(zhí)行了鎖定(LOCK)程序,在下一次復(fù)位之前,將不能再更改端口位的配置。這個功能主要用于一些關(guān)鍵引腳的配置,防止程序跑飛引起災(zāi)難性后果。5.2.7輸入配置當(dāng)I/O口配置為輸入時:1)輸出緩沖器被禁止。2)施密特觸發(fā)輸入被激活。3)根據(jù)輸入配置(上拉,下拉或浮動)的不同,弱上拉和下拉電阻被連接。4)出現(xiàn)在I/O引腳上的數(shù)據(jù)在每個APB2時鐘被采樣到輸入數(shù)據(jù)寄存器。5)對輸入數(shù)據(jù)寄存器的讀訪問可得到I/O狀態(tài)。I/O口位的輸入配置如圖5-2所示。圖5-2輸入浮空/上拉/下拉配置5.2.8輸出配置當(dāng)I/O口被配置為輸出時:1)輸出緩沖器被激活。①開漏模式:輸出寄存器上的0激活N-MOS,而輸出寄存器上的1將端口置于高阻狀態(tài)(P-MOS從不被激活)。②推挽模式:輸出寄存器上的0激活N-MOS,而輸出寄存器上的1將激活P-MOS。2)施密特觸發(fā)輸入被激活。3)弱上拉和下拉電阻被禁止。4)出現(xiàn)在I/O引腳上的數(shù)據(jù)在每個APB2時鐘被采樣到輸入數(shù)據(jù)寄存器。5)在開漏模式時,對輸入數(shù)據(jù)寄存器的讀訪問可得到I/O狀態(tài)。6)在推挽式模式時,對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的值。I/O口位的輸出配置如圖5-3所示。圖5-3輸出配置5.2.9復(fù)用功能配置當(dāng)I/O口被配置為復(fù)用功能時:1)在開漏或推挽式配置中,輸出緩沖器被打開。2)內(nèi)置外設(shè)的信號驅(qū)動輸出緩沖器(復(fù)用功能輸出)3)施密特觸發(fā)輸入被激活。4)弱上拉和下拉電阻被禁止。5)在每個APB2時鐘周期,出現(xiàn)在I/O引腳上的數(shù)據(jù)被采樣到輸入數(shù)據(jù)寄存器。6)開漏模式時,讀輸入數(shù)據(jù)寄存器時可得到I/O口狀態(tài)7)在推挽模式時,讀輸出數(shù)據(jù)寄存器時可得到最后一次寫的值。一組復(fù)用功能I/O寄存器允許用戶把一些復(fù)用功能重新映像到不同的引腳。I/O口位的復(fù)用功能配置如圖5-4所示。圖5-4復(fù)用功能配置I/O口位的復(fù)用功能配置如圖5-4所示。5.2.10模擬輸入配置當(dāng)I/O口被配置為模擬輸入配置時:1)輸出緩沖器被禁止。2)禁止施密特觸發(fā)輸入,實現(xiàn)了每個模擬I/O引腳上的零消耗。施密特觸發(fā)輸出值被強(qiáng)置為0。3)弱上拉和下拉電阻被禁止。4)讀取輸入數(shù)據(jù)寄存器時數(shù)值為0。I/O口位的高阻抗模擬輸入配置如圖5-5所示。圖5-5高阻抗的模擬輸入配置5.3GPIO常用庫函數(shù)STM32標(biāo)準(zhǔn)庫中提供了幾乎覆蓋所有GPIO操作的函數(shù),如表5-1所示。為了理解這些函數(shù)的具體使用方法,下面對標(biāo)準(zhǔn)庫中的函數(shù)做詳細(xì)介紹。GPIO操作的函數(shù)一共有17個,這些函數(shù)都被定義在stm32f10x_gpio.c中,使用stm32f10x_gpio.h頭文件。表5-1GPIO函數(shù)庫主要功能高級控制定時器GPIO_DeInit將外設(shè)GPIOx寄存器重設(shè)為缺省值GPIO_AFIODeInit將復(fù)用功能(重映射事件控制和EXTI設(shè)置)重設(shè)為缺省值GPIO_Init根據(jù)GPIO_InitStruct中指定的參數(shù)初始化外設(shè)GPIOx寄存器GPIO_StructInit把GPIO_InitStruct中的每一個參數(shù)按缺省值填入GPIO_ReadInputDataBit讀取指定端口引腳的輸入GPIO_ReadInputData讀取指定的GPIO端口輸入GPIO_ReadOutputDataBit讀取指定端口引腳的輸出GPIO_ReadOutputData讀取指定的GPIO端口輸出主要功能高級控制定時器GPIO_SetBits設(shè)置指定的數(shù)據(jù)端口位GPIO_ResetBits清除指定的數(shù)據(jù)端口位GPIO_WriteBit設(shè)置或清除指定的數(shù)據(jù)端口位GPIO_Write向指定GPIO數(shù)據(jù)端口寫入數(shù)據(jù)GPIO_PinLockConfig鎖定GPIO引腳設(shè)置寄存器GPIO_EventOutputConfig選擇GPIO引腳用作事件輸出GPIO_EventOutputCmd使能或者失能事件輸出GPIO_PinRemapConfig改變指定引腳的映射GPIO_EXTILineConfig選擇GPIO引腳用作外部中斷線路表5-1GPIO函數(shù)庫(續(xù)表)1.GPIO_Delnit函數(shù)函數(shù)名:GPIO_DeInit。函數(shù)原型:voidGPIO_DeInit(GPIO_TypeDef*GPIOx)。功能描述:將GPIOx外設(shè)寄存器重設(shè)為它們的默認(rèn)值。輸入?yún)?shù):GPIOx:x可以是(A..G)來選擇GPIO外設(shè)。輸出參數(shù):無。返回值:無。例如:/*重置GPIOA外設(shè)寄存器為默認(rèn)值*/GPIO_DeInit(GPIOA);2.GPIO_AFIODelnit函數(shù)函數(shù)名:GPIO_AFIODeInit。函數(shù)原型:voidGPIO_AFIODeInit(void)。功能描述:將復(fù)用功能(重映射時間控制和EXTI配置)重設(shè)為默認(rèn)值。輸入?yún)?shù):無。輸出參數(shù):無。返回值:無。例如:/*復(fù)用功能寄存器復(fù)位為默認(rèn)值*/GPIO_AFIODeInit();3.GPIO_Init函數(shù)函數(shù)名:GPIO_Init。函數(shù)原型:voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)。功能描述:根據(jù)GPIOInitStruct中指定已賦值初始化外設(shè)GPIOx寄存器。輸入?yún)?shù)1:GPIOx,x可以是(A..G)來選擇外設(shè)。輸入?yún)?shù)2:GPIO_InitStruct,指向結(jié)構(gòu)GPIO_InitTypeDef的指針,包含了外設(shè)GPIO的配置信息。輸出參數(shù):無。返回值:無。例如:/*配置所有的GPIOA引腳為輸入浮動模式*/GPIO_InitTypeDef

GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_ALL;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);其中,GPIO_InitTypeDef是結(jié)構(gòu)體。GPIO_InitTypeDef定義于文件stm32f10x_gpio.h:

typedef

struct{uint16_tGPIO_Pin;GPIOSpeed_TypeDef

GPIO_Speed;GPIOMode_TypeDef

GPIO_Mode;}GPIO_InitTypeDef;GPIO_Pin參數(shù)用于選擇待設(shè)置的GPIO引腳,使用操作符“∣”可以一次選中多個引腳。可以使用下面的任意組合。GPIO_Pin定義于文件stm32f10x_gpio.h:#defineGPIO_Pin_0((uint16_t)0x0001)/*!<PinOselected*/#defineGPIO_Pin_1((uint16_t)0x0002)/*!<Pin1selected*/#defineGPIO_Pin_2((uint16_t)0x0004)/*!<Pin2selected*/#defineGPIO_Pin_3((uint16_t)0x0008)/*!<Pin3selected*/#defineGPIO_Pin_4((uint16_t)0x0010)/*!<Pin4selected*/#defineGPIO_Pin_5((uint16_t)0x0020)/*!<Pin5selected*/#defineGPIO_Pin_6((uint16_t)0x0040)/*!<Pin6selected*/#defineGPIO_Pin_7((uint16_t)0x0080)/*!<Pin7selected*/#defineGPIO_Pin_8((uint16_t)0x0100)/*!<Pin8selected*/#defineGPIO_Pin_9((uint16_t)0x0200)/*!<Pin9selected*/#defineGPIO_Pin_10((uint16_t)0x0400)/*!<Pin10selected*/#defineGPIO_Pin_11((uint16_t)0x0800)/*!<Pin11selected*/#defineGPIO_Pin_12((uint16_t)0x1000)/*!<Pin12selected*/#defineGPIO_Pin_13((uint16_t)0x2000)/*!<Pin13selected*/#defineGPIO_Pin_14((uint16_t)0x4000)/*!<Pin14selected*/#defineGPIO_Pin_15((uint16_t)0x8000)/*!<Pin15selected*/#defineGPIO_Pin_A11((uint16_t)0xFFEF)/*!<Allpinsselected*/GPIO_Speed用于設(shè)置選中引腳的速率。typedefenum{GPIO_Speed_10MHz=1,/*最高輸出速率10MHz*/GPIO_Speed_2MHz,/*最高輸出速率2MHz*/GPIO_Speed_50MHz/*最高輸出速率50MHz*/}GPIOSpeed_TypeDef;GPIO_M(jìn)ode用于設(shè)置選中引腳的工作狀態(tài)。typedefenun{GPIO_Mode_AIN=0x0,/*模擬輸入*/GPIO_Mode_IN_FLOATING=0x04,/*浮空輸入*/GPIO_Mode_IPD=0x28,/*下拉輸入*/GPIO_Mode_IPU=0x48,/*上拉輸入*/GPIO_Mode_Out_OD=0x14,/*開漏輸出*/GPIO_Mode_Out_PP=0x10,/*推挽輸出*/GPIO_Mode_AF_OD=0x1C,/*復(fù)用開漏輸出*/GPIO_Mode_AF_PP=0x18/*復(fù)用推挽輸出*/}GPIOMode_TypeDef;4.GPIO_Structlnit函數(shù)函數(shù)名:GPIO_StructInit。函數(shù)原型:voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct)。功能描述:把GPIO_InitStruct中成員設(shè)置為它的默認(rèn)值。輸入?yún)?shù):GPIO_InitStruct,一個GPIO_InitTypeDef結(jié)構(gòu)體指針,指向待初始化的GPIO_InitTypeDef結(jié)構(gòu)體。輸出參數(shù):無。返回值:無。例如:/*使GPIO的參數(shù)設(shè)置為初始化參數(shù)初始化結(jié)構(gòu)*/GPIO_InitTypeDefGPIOInitStructure;GPIO_StructInit(&GPIO_InitStructure);其中,GPIO_InitStruct默認(rèn)值為:GPIO_Pin

GPIO_Pin_ALLGPIO_SpeedGPIO_Speed_2MHzGPIO_Mode

GPIO_Mode_IN_FLOATING5.GPIO_ReadinputDataBit

函數(shù)函數(shù)名:GPIO_ReadInputDataBit。函數(shù)原型:u8GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin)。功能描述:讀取指定端口引腳的輸入。輸入?yún)?shù)1:GPIOx,x可以是(A..G),來選擇外設(shè)。輸入?yún)?shù)2:GPIO_Pin,讀取指定的端口位,這個參數(shù)的值是GPIO_Pin_x,其中x是(0..15)。輸出參數(shù):無。返回值:輸入端口引腳值。例如:/*讀出PB5的輸入數(shù)據(jù)并將它存儲在變量ReadValue中*/u8ReadValue;ReadValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);6.GPIO_ReadlnputData

函數(shù)函數(shù)名:GPIO_ReadInputData。函數(shù)原型:u16GPIO_ReadInputData(GPIO_TypeDef*GPIOx)。功能描述:讀取指定端口的輸入值。輸入?yún)?shù):GPIOx,x可以是(A..G),來選擇外設(shè)。輸出參數(shù):無。返回值:GPIO端口輸入值。例如:/*讀出GPIOB端口的輸入數(shù)據(jù)并將它存儲在變量ReadValue中*/u16ReadValue;ReadValue=GPIO_ReadInputData(GPIOB);7.GPIO_ReadOutputDataBit函數(shù)函數(shù)名:GPIO_ReadOutputDataBit。函數(shù)原型:u8GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin)。功能描述:讀取指定端口引腳的輸出。輸入?yún)?shù)1:GPIOx:x可以是(A..G),來選擇外設(shè)。輸入?yún)?shù)2:GPIO_Pin:讀取指定的端口位,這個參數(shù)的值是GPIO_Pin_x,其中x是(0..15)。輸出參數(shù):無。返回值:輸出端口引腳值。例如:/*讀出PB5的輸出數(shù)據(jù)并將它存儲在變量ReadValue中*/u8ReadValue;ReadValue=GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);8.GPIO_ReadOutputData函數(shù)函數(shù)名:GPIO_ReadOutputData。函數(shù)原型:u16GPIO_ReadOutputData(GPIO_TypeDef*GPIOx)。功能描述:讀取指定GPIO端口的輸出值。輸入?yún)?shù):GPIOx,x可以是(A..G),來選擇外設(shè)。輸出參數(shù):無。返回值:GPIO端口輸出值。例如:/*讀出GPIOB的輸出數(shù)據(jù)并將它存儲在變量ReadValue中*/u16ReadValue;ReadValue=GPIO_ReadOutputData(GPIOB);9.GPIO_SetBits函數(shù)函數(shù)名:GPIO_SetBits。函數(shù)原型:voidGPIO_SetBits(GPIO_TypeDef*GPIOx,u16GPIO_Pin)。功能描述:設(shè)置指定的GPIO端口位。輸入?yún)?shù)1:GPIOx,x可以是(A..G),來選擇外設(shè)。輸入?yún)?shù)2:GPIO_Pin,待設(shè)置的端口位,這個參數(shù)的值是GPIO_Pin_x,其中x是(0..15)。輸出參數(shù):無。返回值:無。例如:/*設(shè)置GPIOB端口的PB5和PB9引腳*/GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);10.GPIO_ResetBits

函數(shù)函數(shù)名:GPIO_ResetBits。函數(shù)原型:voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,u16GPIO_Pin)。功能描述:清除指定的GPIO端口位。輸入?yún)?shù)1:GPIOx,x可以是(A..G),來選擇外設(shè)。輸入?yún)?shù)2:GPIO_Pin,待清除的端口位,這個參數(shù)的值是GPIO_Pin_x,其中x是(0..15)。輸出參數(shù):無。返回值:無。例如:/*清除GPIOB端口的PB5和PB9引腳*/GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);11.GPIO_WriteBit

函數(shù)函數(shù)名:GPIO_WriteBit。函數(shù)原型:voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin,BitAction

BitVal)。功能描述:設(shè)置或清除指定的GPIO端口位。輸入?yún)?shù)1:GPIOx,x可以是(A..G),來選擇外設(shè)。輸入?yún)?shù)2:GPIO_Pin,待設(shè)置或清除的端口位,這個參數(shù)的值是GPIO_Pin_x,其中x是(0..15)。輸入?yún)?shù)3:BitVal,指定待寫入的值,該參數(shù)是BitAction枚舉類型,取值必須是:BitRESET,清除端口位,或者Bit_SET,設(shè)置端口位。輸出參數(shù):無。返回值:無。例如:/*設(shè)置GPIOB端口的PB5引腳*/GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);12.GPIO_Write

函數(shù)函數(shù)名:GPIO_Write。函數(shù)原型:voidGPIO_Write(GPIO_TypeDef*GPIOx,u16PortVal)。功能描述:向指定的GPIO端口寫入值。輸入?yún)?shù)1:GPIOx,x可以是(A..G),來選擇外設(shè)。輸入?yún)?shù)2:PortVal,待寫入指定端口的值。輸出參數(shù):無。返回值:無。例如:/*將數(shù)據(jù)寫入GPIOB數(shù)據(jù)端口*/GPIO_Write(GPIOB,0x1101);13.GPIO_PinLockConfig

函數(shù)函數(shù)名:GPIO_PinLockConfig。函數(shù)原型:voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,u16GPIO_Pin)。功能描述:鎖定GPIO端口引腳的寄存器設(shè)置。輸入?yún)?shù)1:GPIOx,x可以是(A..G),來選擇外設(shè)。輸入?yún)?shù)2:GPIO_Pin,待鎖定的端口位,這個參數(shù)的值是GPIO_Pin_x,其中x是(0..15)。輸出參數(shù):無。返回值:無。例如:/*鎖定GPIOB端口PB5和PB9引腳的值*/GPIO_PinLockConf

ig(GPIOB,GPIO_Pin_5|GPIO_Pin_9);14.GPIO_EventOutputConfig

函數(shù)函數(shù)名:GPIO_EventOutputConfig。函數(shù)原型:voidGPIO_EventOutputConfig(u8GPIO_PortSource,u8GPIO_PinSource)。功能描述:選擇GPIO端口引腳用于事件輸出。輸入?yún)?shù)1:GPIO_PortSource,選擇用于事件輸出的端口。輸入?yún)?shù)2:GPIO_PinSource,選擇事件輸出的引腳。輸出參數(shù):無。返回值:無。例如:/*選擇GPIOB的PB5引腳作為事件輸出的引腳*/GPIO_EventOutputConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);15.GPIO_EventOutputCmd函數(shù)函數(shù)名:GPIO_EventOutputCmd,函數(shù)原型:voidGPIO_EventOutputCmd(FunctionalState

NewState)。功能描述:使能或禁止事件輸出。輸入?yún)?shù):NewState,事件輸出狀態(tài)。必須是下面其中一個值:ENABLE或DISABLE。輸出參數(shù):無。返回值:無。例如:/*使能GPIOB的PB10的事件輸出*/例如:/*使能GPIOB的PB10的事件輸出*/GPIO_InitStructure,GPIO_Pin

=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure,GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_EventOutputConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10);GPIO_EventOutputCmd(ENABLE);16.GPIO_PinRemapConfig

函數(shù)函數(shù)名:GPIO_PinRemapConfig。函數(shù)原型:voidGPIO_PinRemapConfig(u32GPIO_Remap,F(xiàn)unctionalState

NewState)。功能描述:改變指定引腳的映射。輸入?yún)?shù)1:GPIO_Remap,選擇重映射的引腳。輸入?yún)?shù)2:NewStat,:事件輸出狀態(tài)。必須是下面其中一個值:ENABLE或DISABLE。輸出參數(shù):無。返回值:無。例如:/*I2C1_SCL映射到PB8,I2C1_SDA映射到PB9*/GPIO_PinRenapConfig(GPIO_Remap_I2C1,ENABLE);GPIO_Remap用于選擇用作事件輸出的GPIO端口。17.GPIO_EXTILineConfig

函數(shù)函數(shù)名:GPIO_EXTILineConfig。函數(shù)原型:voidGPIO_EXTILineConfig(u8GPIO_PortSource,u8GPIO_PinSource)。功能描述:選擇GPIO引腳用作外部中斷線。輸入?yún)?shù)1:GPIO_PortSource,選擇用作外部中斷線源的GPIO端口。輸入?yún)?shù)2:GPIO_PinSource,待設(shè)置的指定中斷線。輸出參數(shù):無。返回值:無。例如:/*選擇GPIOB的PB8引腳為EXTI的8號線*/GPIO_EXTILineConfig(GPIO_PortSource_GPIOB,GPIO_PinSource8);5.4GPIO使用流程根據(jù)IO端口的特定硬件特征,IO端口的每個引腳都可以由軟件配置成多種工作模式。在運(yùn)行程序之前必須對每個用到的引腳功能進(jìn)行配置。1)如果某些引腳的復(fù)用功能沒有使用,可以先配置為通用輸入輸出GPIO。2)如果某些引腳的復(fù)用功能被使用,需要對復(fù)用的IO端口進(jìn)行配置。3)IO具有鎖定機(jī)制,允許凍結(jié)IO。當(dāng)在一個端口位上執(zhí)行了鎖定(LOCK)程序后,在下一次復(fù)位之前,將不能再更改端口位的配置。5.4.1普通GPIO配置GPIO是最基本的應(yīng)用,其基本配置方法為:1)配置GPIO時鐘,完成初始化。2)利用函數(shù)GPIO_Init配置引腳,包括引腳名稱、引腳傳輸速率、引腳工作模式。3)完成GPIO_Init的設(shè)置。5.4.2IO復(fù)用功能AFIO配置IO功能AFIO常對應(yīng)到外設(shè)的輸入輸出功能。使用時,需要先配置I0為復(fù)用功能,打開AFIO時鐘,然后再根據(jù)不同的復(fù)用功能進(jìn)行配置。對應(yīng)外設(shè)的輸入輸出功能有下述3情況:1)外設(shè)對應(yīng)的引腳為輸出:需要根據(jù)外圍電路的配置選擇對應(yīng)的引腳為復(fù)用功能的推挽輸出或復(fù)用功能的開漏輸出。2)外設(shè)對應(yīng)的引腳為輸入:根據(jù)外圍電路的配置可以選擇浮空輸入、帶上拉輸入或帶下拉輸入。3)ADC對應(yīng)的引腳:配置引腳為模擬輸入。5.5GPIO輸出應(yīng)用實例STM32F103與LED的連接如圖5-6所示。這是一個RGBLED燈,由紅藍(lán)綠3個LED燈構(gòu)成,使用PWM控制時可以混合成256種不同的顏色。5.5.1GPIO輸出應(yīng)用的硬件設(shè)計GPIO輸出應(yīng)用實例是使用固件庫點亮LED燈。圖5-6LED燈硬件電路這些LED的陰極都連接到STM32F103的GPIO引腳,只要控制GPIO引腳的電平輸出狀態(tài),即可控制LED的亮滅。如果使用的開發(fā)板中LED的連接方式或引腳不一樣,只需修改程序的相關(guān)引腳即可,程序的控制原理相同。5.5.2GPIO輸出應(yīng)用的軟件設(shè)計為了使工程更加有條理,把LED控制相關(guān)的代碼獨立分開存儲,方便以后移植。在“工程模板”之上新建bsp_led.c及bsp_led.h文件,其中的bsp即BoardSupportPacket的縮寫(板級支持包)。編程要點:1)使能GPIO端口時鐘;2)初始化GPIO目標(biāo)引腳為推挽輸出模式;3)編寫簡單測試程序,控制GPIO引腳輸出高、低電平。5.6

GPIO輸入應(yīng)用實例按鍵的硬件設(shè)計同外部中斷設(shè)計實例的硬件設(shè)計,如圖4-8所示。5.6.1

硬件設(shè)計GPIO輸入應(yīng)用實例是使用固件庫的按鍵檢測。5.6.2軟件設(shè)計為了使工程更加有條理,把與按鍵相關(guān)的代碼獨立分開存儲,方便以后移植。在“工程模板”之上新建bsp_key.c及bsp_key.h文件。編程要點:1)使能GPIO端口時鐘;2)初始化GPIO目標(biāo)引腳為輸入模式(浮空輸入);3)編寫簡單測試程序,檢測按鍵的狀態(tài),實現(xiàn)按鍵控制LED。

第6章定時器本章講述了定時器,包括STM32F103定時器概述、基本定時器、通用定時器、高級定時器、定時器庫函數(shù)和定時器應(yīng)用實例和SysTick系統(tǒng)滴答定時器。6.1STM32F103定時器概述定時與計數(shù)的應(yīng)用十分廣泛。在實際生產(chǎn)過程中,許多場合都需要定時或者計數(shù)操作。例如產(chǎn)生精確的時間,對流水線上的產(chǎn)品進(jìn)行計數(shù)等。因此,定時/計數(shù)器在嵌入式單片機(jī)應(yīng)用系統(tǒng)中十分重要。定時和計數(shù)可以通過以下方式實現(xiàn):1.軟件延時單片機(jī)是在一定時鐘下運(yùn)行的,可以根據(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)部脈沖或外部輸入進(jìn)行計數(shù),不僅具有基本的延時/計數(shù)功能,還具有輸入捕獲、輸出比較和PWM波形輸出等高級功能。在嵌入式開發(fā)中,充分利用定時器的強(qiáng)大功能,可以顯著提高外設(shè)驅(qū)動的編程效率和CPU利用率,增強(qiáng)系統(tǒng)的實時性。STM32內(nèi)部集成了多個定時/計數(shù)器。根據(jù)型號不同,STM32系列芯片最多包含8個定時/計數(shù)器。其中,TIM6和TIM7為基本定時器,TIM2~TIM5為通用定時器,TIM1和TIM8為高級控制定時器,功能最強(qiáng)。三種定時器具備的功能如表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單片機(jī)要完善和復(fù)雜得多,它是專為工業(yè)控制應(yīng)用量身定做,具有延時、頻率測量、PWM輸出、電機(jī)控制及編碼接口等功能。6.2基本定時器STM32F103基本定時器TIM6和TIM7各包含一個16位自動裝載計數(shù)器,由各自的可編程預(yù)分頻器驅(qū)動。它們可以作為通用定時器提供時間基準(zhǔn),特別是可以為數(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請求?;径〞r器內(nèi)部結(jié)構(gòu)如圖6-1所示。6.2.2基本定時器的主要特性圖6-1基本定時器結(jié)構(gòu)框圖1.時基單元這個可編程定時器的主要部分是一個帶有自動重裝錢的16位累加計數(shù)器,計數(shù)器的時鐘通過一個預(yù)分頻器得到。軟件可以讀寫計數(shù)器、自動重裝載寄存器和預(yù)分頻寄存器,即使計數(shù)器運(yùn)行時也可以操作。時基單元包含: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)默認(rèn)情況下,APB1的時鐘頻率為72MHz。3.預(yù)分頻器預(yù)分頻可以以系數(shù)介于1~65536之間的任意數(shù)值對計數(shù)器時鐘分頻。它是通過一個16位寄存器(TIMx_PSC)的計數(shù)實現(xiàn)分頻。因為TIMx_PSC控制寄存器具有緩沖作用,可以在運(yùn)行過程中改變它的數(shù)值,新的預(yù)分頻數(shù)值將在下一個更新事件時起作用。圖6-2是在運(yùn)行過程中改變預(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ù)器溢出事件。由此可見,如果使用基本定時器進(jìn)行延時,延時時間可以由以下公式計算:延時時間=(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ù)方式編程,故不作進(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計數(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,這也是通用定時器之所以擁有那么多強(qiáng)大功能的原因。6.3.3通用定時器功能描述圖6-6通用定時器內(nèi)部結(jié)構(gòu)框圖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ù)分頻器可以將計數(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ù)分頻進(jìn)入捕獲寄存器(ICxPS)。輸出部分產(chǎn)生一個中間波形OCxRef(高有效)作為基準(zhǔn),鏈的末端決定最終輸出信號的極性。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.強(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請求。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)或進(jìn)行翻轉(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寄存器能夠在任何時候通過軟件進(jìn)行更新以控制輸出波形,條件是未使用預(yù)裝載寄存器(OCxPE=0,否則TIMx_CCRx影子寄存器只能在發(fā)生下一次更新事件時被更新)。5.PWM模式PWM輸出模式是一種特殊的輸出模式,在電力、電子和電機(jī)控制領(lǐng)域得到廣泛應(yīng)用。1)PWM簡介PWM是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信號仍然是數(shù)字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF),電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加載到模擬負(fù)載上去的。通的時候即是直流供電被加到負(fù)載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。2)PWM實現(xiàn)目前,在運(yùn)動控制系統(tǒng)或電動機(jī)控制系統(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單片機(jī)),可以通過CPU操控普通I/O口來實現(xiàn)PWM輸出。但這樣實現(xiàn)PWM將消耗大量的時間,大大降低CPU的效率,而且得到的PWM的信號精度不太高。③微控制器的PWM直接輸出方式:對于具有PWM輸出功能的微控制器,在進(jìn)行簡單的配置后即可在微控制器的指定引腳上輸出PWM脈沖。這也是目前使用最多的PWM實現(xiàn)方式。STM32F103就是這樣一款具有PWM輸出功能的微控制器,除了基本定時器TIM6和TIM7。其他的定時器都可以用來產(chǎn)生PWM輸出。其中高級定時器TIM1和TIM8可以同時產(chǎn)生多達(dá)7路的PWM輸出。而通用定時器也能同時產(chǎn)生多達(dá)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ā)進(jìn)行累加計數(shù)的同時,脈沖計數(shù)M_CNT的當(dāng)前計數(shù)值x與抽獲/比較寄存器TIMx_CCR的預(yù)設(shè)值A(chǔ)進(jìn)行比較;如果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ù)方式編程,故不做進(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通用定時器寄存器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ū)時間的互補(bǔ)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)多達(dá)4個獨立通道:輸入捕獲、輸出比較、PWM生成(邊緣或中間對齊模式)、單脈沖模式輸出。4)死區(qū)時間可編程的互補(bǔ)輸出。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)用中一般較少使用,所以不作為本書討論的重點,如需詳細(xì)了解可以查閱STM32中文參考手冊。6.4.2高級定時器結(jié)構(gòu)6.5定時器庫函數(shù)TIM固件庫支持72種庫函數(shù),如表6-2所示。為了理解這些函數(shù)的具體使用方法,本節(jié)將對其中的部分庫函數(shù)做詳細(xì)介紹。STM32F10x的定時器庫函數(shù)存放在STM32F10x標(biāo)準(zhǔn)外設(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ā)TI

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論