STM32 GPIO的API函數(shù)配置和使用技巧_第1頁
STM32 GPIO的API函數(shù)配置和使用技巧_第2頁
STM32 GPIO的API函數(shù)配置和使用技巧_第3頁
STM32 GPIO的API函數(shù)配置和使用技巧_第4頁
STM32 GPIO的API函數(shù)配置和使用技巧_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

WordSTM32GPIO的API函數(shù)配置和使用技巧

一、前言

本篇開始對(STM32)的GPIO在實際開發(fā)設(shè)計中的使用配置和技巧進(jìn)行探討,可以先去回顧下之前介紹的GPIO的相關(guān)理論基礎(chǔ)知識包括基本結(jié)構(gòu),工作模式和(寄存器)原理。

了解過STM32的GPIO相關(guān)的理論知識,這樣在應(yīng)用GPIO開發(fā)過程中,能更好的理解GPIO的特點,應(yīng)用起來會更加的得心應(yīng)手。

后續(xù)將從以下圖1中所示的幾個方面對G(PI)O應(yīng)用設(shè)計中的步驟展開介紹。本篇先介紹GPIO的基本API函數(shù)定義,配置初始化的流程,以及使用技巧;針對將GPIO的引腳用于外部中斷的功能將作為單獨的一篇進(jìn)行詳細(xì)的討論介紹。

圖1GPIO應(yīng)用設(shè)計

二、API函數(shù)

STM32有多種類型的庫,本節(jié)所介紹的STM32的GPIO函數(shù)接口是STM32標(biāo)準(zhǔn)庫的函數(shù)接口,接口總共分為4種類型,如圖2所示。

圖2GPIO庫函數(shù)接口分類

1、關(guān)鍵參數(shù)

在詳細(xì)介紹各個API函數(shù)接口功能之前,我們需要對函數(shù)接口中使用到的關(guān)鍵的幾個參數(shù)進(jìn)行分析。

(1)、GPIO_TypeDefGPIOx*

這個參數(shù)是用于指定需要具體的GPIO端口號定義,參數(shù)的范圍為GPIOA~GPIOK。

(2)、GPIO_InitTypeDefGPIO_InitStruct*

這個參數(shù)是GPIO端口需要初始化的功能參數(shù)的結(jié)構(gòu)體指針,下面我們看看這個結(jié)構(gòu)體的定義。

typedefstruct{uint32_tGPIO_Pin;//GPIO端口的引腳GPIOMode_TypeDefGPIO_Mode;//GPIO的端口模式GPIOSpeed_TypeDefGPIO_Speed;//GPIO的輸出速度頻率GPIOOType_TypeDefGPIO_OType;//GPIO輸出時的類型GPIOPuPd_TypeDefGPIO_PuPd;//GPIO上下拉電阻設(shè)置}GPIO_InitTypeDef;(a)、GPIO端口的引腳:可選范圍為GPIO_Pin_0~GPIO_Pin_15,也可以選所有引腳GPIO_Pin_All。

(b)、GPIO的端口模式:用于設(shè)置GPIO的端口模式,可選的端口模式如下。

typedefenum{GPIO_Mode_IN=0x00,//普通IO口輸入GPIO_Mode_OUT=0x01,//普通IO口輸出GPIO_Mode_AF=0x02,//管腳復(fù)用功能GPIO_Mode_AN=0x03//(模擬)輸入,用于(ADC)功能}GPIOMode_TypeDef;(c)、GPIO的輸出速度頻率:當(dāng)GPIO引腳用于普通功能輸出或復(fù)用功能輸出時,GPIO的輸出速度頻率,可選的輸出速率如下。

typedefenum{GPIO_Low_Speed=0x00,//GPIO_Speed_2MHzGPIO_Medium_Speed=0x01,//GPIO_Speed_25MHzGPIO_Fast_Speed=0x02,//GPIO_Speed_50MHzGPIO_High_Speed=0x03//GPIO_Speed_100MHz}GPIOSpeed_TypeDef;速度高的IO耗電大、噪聲也大,速度低的IO耗電小、噪聲也小。使用合適的速度可以降低功耗和噪聲。高頻的(驅(qū)動電路),噪聲也高,當(dāng)不需要高的輸出頻率時,請選用低頻驅(qū)動電路,這樣非常有利于提高系統(tǒng)的EMI性能,也可以降低功耗。當(dāng)然如果要輸出較高頻率的(信號),但卻選用了較低頻率的速度,很可能會得到失真的輸出信號。關(guān)鍵是GPIO的引腳速度跟應(yīng)用匹配。

(d)、GPIO輸出時的類型:當(dāng)GPIO引腳用于普通功能輸出或復(fù)用功能輸出時,可選擇設(shè)置的GPIO的輸出結(jié)構(gòu)類型有如下。

typedefenum{GPIO_OType_PP=0x00,//推挽結(jié)構(gòu)GPIO_OType_OD=0x01//開漏結(jié)構(gòu)}GPIOOType_TypeDef;推挽輸出時,可以輸出高或者低電平;開漏輸出時,如果要輸出高電平,則需要在(芯片)內(nèi)部配置上拉電阻(弱上拉)或者在芯片IO外部連接上拉電阻。

(e)、GPIO上下拉電阻設(shè)置:可以為GPIO端口的引腳選擇設(shè)置是否具備帶上拉或下拉電阻功能。

typedefenum{GPIO_PuPd_NOPULL=0x00,//無上拉或者下拉GPIO_PuPd_UP=0x01,//帶上拉電阻GPIO_PuPd_DOWN=0x02//帶下拉電阻}GPIOPuPd_TypeDef;STM32芯片GPIO的上拉電阻和下拉電阻最小值,典型值和最大值如下:

(3)、uint16_tGPIO_PinSource和uint8_tGPIO_AF

這兩個參數(shù)都是GPIO端口引腳需要配置成復(fù)用功能引腳用到的參數(shù)。

GPIO_PinSource:指需配置的復(fù)用功能引腳源,可選范圍GPIO_PinSource0

~GPIO_PinSource15。

GPIO_AF:指該引腳具體需要配置的功能,具體配置功能要看實際應(yīng)用需求,例如需要配置成SPI1功能的引腳,那么就選GPIO_AF_SPI1。

2、函數(shù)接口

下面就對具體的函數(shù)接口進(jìn)行逐個的介紹。由于使用的是STM32的標(biāo)準(zhǔn)庫,GPIO相關(guān)的函數(shù)及配置定義和可以調(diào)用的接口放置在官方提供的標(biāo)準(zhǔn)庫文件stm32fxx_gpio.c和頭文件stm32fxx_gpio.h文件中。

(1)、無效GPIO_DeInit(GPIO_TypeDefGPIOx);*

作用:將GPIO端口設(shè)置成初始的默認(rèn)狀態(tài),相當(dāng)于復(fù)位GPIO端口,默認(rèn)的狀態(tài)為輸入浮空的狀態(tài)。

舉例:GPIO_DeInit(GPIOA),將GPIOA端口所有引腳復(fù)位到默認(rèn)狀態(tài)。

(2)、無效GPIO_Init(GPIO_TypeDefGPIOx,GPIO_InitTypeDefGPIO_InitStruct);**

作用:將GPIO端口引腳進(jìn)行功能狀態(tài)初始化。

舉例:將GPIOA的pin1引腳設(shè)為普通輸出功能,IO驅(qū)動速率可達(dá)50MHz,推挽模式,帶上拉電阻。

gpio_InitStruct.GPIO_Pin=GPIO_Pin_1;gpio_InitStruct.GPIO_Mode=GPIO_Mode_OUT;gpio_InitStruct.GPIO_Speed=GPIO_Fast_Speed;gpio_InitStruct.GPIO_OType=GPIO_OType_PP;gpio_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOA,(3)、無效GPIO_Struc(tI)nit(GPIO_InitTypeDefGPIO_InitStruct);*

作用:獲取GPIO端口的所有引腳的一個默認(rèn)狀態(tài),可應(yīng)用于某個GPIO端口上。該函數(shù)內(nèi)部默認(rèn)的引腳默認(rèn)狀態(tài)如下。

GPIO_InitStruct->GPIO_Pin=GPIO_Pin_All;GPIO_InitStruct->GPIO_Mode=GPIO_Mode_IN;GPIO_InitStruct->GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStruct->GPIO_OType=GPIO_OType_PP;GPIO_InitStruct->GPIO_PuPd=GPIO_PuPd_NOPULL;舉例:使用gpio_InitStruct快速獲取到了引腳的默認(rèn)狀態(tài)值。

GPIO_StructInit((4)、無效GPIO_PinLockConfig(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*

作用:將指定GPIO端口引腳當(dāng)前的配置進(jìn)行鎖定,鎖定后該引腳配置不能被修改,只有等下次(MCU)復(fù)位鎖定才能釋放。

舉例:鎖定GPIOA的管腳pin1配置不被修改。

GPIO_PinLockConfig(GPIOA,GPIO_Pin_1);(5)、uint8_tGPIO_Re(adI)nputDataBit(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*

作用:為當(dāng)GPIO的相應(yīng)管腳配置成輸入時,讀取該GPIO端口下的相應(yīng)引腳輸入電平值。

舉例:讀取GPIOA的pin1引腳輸入電平值。

status=GPIO_Re(ad)InputDataBit(GPIOA,GPIO_Pin_1);(6)、uint16_tGPIO_ReadInputData(GPIO_TypeDefGPIOx);*

作用:為當(dāng)GPIO配置成輸入時,讀取該GPIO端口下的所有引腳輸入電平值。

舉例:讀取GPIOA端口所有引腳的輸入電平值。

status=GPIO_ReadInputData(GPIOA);(7)、uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*

作用:為當(dāng)GPIO的相應(yīng)管腳配置成輸出時,讀取該GPIO端口下的相應(yīng)引腳輸出電平值。

舉例:讀取GPIOA的pin1引腳輸出電平值。

status=GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1);(8)、uint16_tGPIO_ReadOutputData(GPIO_TypeDefGPIOx);*

作用:為當(dāng)GPIO配置成輸出時,讀取該GPIO端口下的所有引腳輸出電平值。

舉例:讀取GPIOA端口所有引腳的輸出電平值。

status=GPIO_ReadOutputData(GPIOA);(9)、無效GPIO_SetBits(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*

作用:置位相應(yīng)GPIO端口引腳的電平值。

舉例:將GPIOA的pin1管腳電平置為1。

GPIO_SetBits(GPIOA,GPIO_Pin_1);也可以用于多個引腳電平的置位,

GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);(10)、無效GPIO_ResetBits(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*

作用:清零相應(yīng)GPIO端口引腳的電平值。

舉例:將GPIOA的pin1管腳電平置為0,

GPIO_ResetBits(GPIOA,GPIO_Pin_1);也可以用于多個引腳電平的清零。

GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);(11)、無效GPIO_Wri(te)Bit(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin,BitActionBitVal);*

作用:將GPIO端口的指定管腳電平置1或置0。

舉例:將GPIOA的pin1管腳電平置為1。

GPIO_WriteBit(GPIOA,GPIO_Pin_1,1);也可以用于多個引腳電平操作。

GPIO_WriteBit(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3,1)(12)、無效GPIO_Write(GPIO_TypeDefGPIOx,uint16_tPortVal);*

作用:將GPIO端口的所有管腳電平置1或置0。

舉例:將GPIOA端口的所有管腳電平置為1。

GPIO_Write(GPIOA,1);(13)、無效GPIO_ToggleBits(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*

作用:翻轉(zhuǎn)指定GPIO引腳的輸出電平,即0變?yōu)?,1變?yōu)?。

舉例:翻轉(zhuǎn)GPIOA的pin1管腳電平值。

GPIO_ToggleBits(GPIOA,GPIO_Pin_1);(14)、無效GPIO_PinAFConfig(GPIO_TypeDefGPIOx,uint16_tGPIO_PinSource,uint8_tGPIO_AF);*

作用:將GPIO的指定管腳配置成復(fù)用功能管腳。

舉例:將GPIOA的pin9管腳配置成串口USART1的功能管腳。

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);三、配置流程

配置流程主要在實際的驅(qū)動配置中對GPIO進(jìn)行初始化的操作,根據(jù)實際項目應(yīng)用開發(fā)中的芯片GPIO引腳的定義,進(jìn)行合理的配置。圖3所示為GPIO的基本配置操作流程。

圖3GPIO配置流程

(1)、使能對應(yīng)GPIO的(時鐘)

在配置GPIO的開始,首先需要將對應(yīng)的GPIO模塊的時鐘打開,這樣才能為GPIO工作提供動力源,因此只有先將GPIO的時鐘打開才能使GPIO正常的工作。

關(guān)于STM32芯片內(nèi)部整體的時鐘系統(tǒng),可以回顧之前明解STM32時鐘系統(tǒng)的文章介紹。STM32的GPIO模塊是掛載在芯片內(nèi)部AHB1總線(AHB:高級高性能總線)上的外設(shè),因此就需要打開GPIO在AHB1總線上對應(yīng)的時鐘。AHB1總線上的外設(shè)時鐘開關(guān)在STM32提供的標(biāo)準(zhǔn)庫函數(shù)中通過函數(shù)RCC_AHB1PeriphClockCmd()來實現(xiàn)的。例如調(diào)用:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);這樣就將GPIOA的時鐘打開,也可以同時打開多個GPIO端口的時鐘:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB,ENABLE);(2)、引腳功能配置

接下來對GPIO引腳的配置是需要根據(jù)實際的項目應(yīng)用要求,根據(jù)各個芯片管腳的定義來對引腳的功能進(jìn)行合理的配置,主要是根據(jù)引腳是使用成普通IO輸出還是輸入,復(fù)用功能還是模擬管腳來調(diào)用GPIO_Init()函數(shù)進(jìn)行配置。舉例說明:

用于普通IO輸出時:

GPIO_WriteBit(GPIOA,GPIO_Pin_1,1);//向引腳輸出0或1電平,在GPIO_Init前調(diào)用GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//設(shè)置使用引腳GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通IO輸出GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//根據(jù)實際應(yīng)用配置輸出結(jié)構(gòu)類型GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//根據(jù)實際應(yīng)用配置輸出速度GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//根據(jù)實際應(yīng)用配置上拉或下拉電阻GPIO_Init(GPIOA,//初始化PA1引腳需要注意的是,初始化輸出電平時,需要先調(diào)用寫引腳電平接口,再做初始化操作,這是因為GPIO_WriteBit是將輸出的值寫入寄存器輸出置位/復(fù)位寄存器BSRR,BSRR寄存器復(fù)位值是0,GPIO_Init相當(dāng)于將GPIO引腳初始化完打開輸出開關(guān)。如果需要輸出的是高電平,GPIO_WriteBit在前,GPIO_Init在后相當(dāng)于在沒打開開關(guān)之前就將1在BSRR中放置好,GPIO_Init將開關(guān)一打開就可以輸出高電平;如果GPIO_Init在前,GPIO_WriteBit在后,GPIO_Init完會將BSRR中的0先輸出,過了一個函數(shù)指令周期后調(diào)用GPIO_WriteBit才輸出高電平,因此若驅(qū)動時序?qū)瘮?shù)指令周期敏感的外圍器件時,可能帶來驅(qū)動時序問題!

用于普通IO輸入時:

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//設(shè)置使用引腳GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//普通IO輸入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//根據(jù)實際應(yīng)用配置輸出速度GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//根據(jù)實際應(yīng)用配置上拉或下拉電阻GPIO_Init(GPIOA,//初始化PA1引腳用于復(fù)用功能時:

在管腳應(yīng)用于復(fù)用功能時,需要調(diào)用GPIO_PinAFConfig()接口來將管腳配置成具體的外設(shè)管腳。

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//PA9復(fù)用為USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10復(fù)用為USART1GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//設(shè)置使用引腳GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//復(fù)用功能GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//根據(jù)實際應(yīng)用配置輸出速度GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//根據(jù)實際應(yīng)用配置輸出結(jié)構(gòu)類型GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//根據(jù)實際應(yīng)用配置上拉或下拉電阻GPIO_Init(GPIOA,//初始化PA9和PA10引腳用于模擬管腳時:

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//PA5通道5GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;//模擬輸入GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不帶上下拉GPIO_Init(GPIOA,//初始化PA5引腳當(dāng)STM32需要進(jìn)行AD(模數(shù))轉(zhuǎn)換采樣時,需要把引腳設(shè)置為模擬輸入模式,模擬輸入模式下,不需要連接上拉和下拉電阻,因為GPIO用于模擬功能時,引腳的上、下拉電阻是不起作用的。這個時候即使在配置了上拉或下拉電阻,也不會影響到模擬信號的輸入。

(3)、對GPIO引腳進(jìn)行操作

在初始化完GPIO引腳的具體配置后,就可以對GPIO引腳進(jìn)行具體的操作使用了。

用于普通IO輸出時:

可以調(diào)用相關(guān)GPIO相關(guān)寫操作接口對引腳進(jìn)行輸出0或者1的操作:GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_ToggleBits。

也可以調(diào)用相關(guān)GPIO讀接口對輸出類型的GPIO進(jìn)行讀取引腳電平的操作GPIO_ReadOutputDataBit。

用于普通IO輸入時:

可以調(diào)用相關(guān)GPIO讀接口對輸入類型的GPIO進(jìn)行讀取引腳電平的操作:GPIO_ReadInputDataBit。

用于復(fù)用功能時:

需要根據(jù)實際使用時的具體外設(shè)配置,接著初始化相應(yīng)的片上外設(shè)后,調(diào)用具體的外設(shè)信號讀或者寫接口進(jìn)行信號的讀寫操作。

用于模擬管腳時:

由于模擬管腳功能是用芯片上的ADC對芯片外部的模擬信號進(jìn)行采樣,因此還需要初始化完ADC外設(shè)后,調(diào)用ADC外設(shè)采樣的接口進(jìn)行信號讀取。

四、使用技巧

在日常程序開發(fā)調(diào)試的過程中,可以簡單有效的利用GPIO驅(qū)動輸出高低電平來進(jìn)行輔助的測試及驗證工

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論