1 GPIO概述
1.1 功能描述
STM32的GPIO端口相對(duì)比較復(fù)雜,所以使用起來(lái)也困難許多超升,STM32的GPIO端口的每一位都可以由軟件配置成多種模式牵舱。
4種輸入模式:
- 輸入浮空;
- 輸入上拉聚凹;
- 輸入下拉;
- 模擬輸入齐帚;
4種輸出模式:
- 開(kāi)漏輸出妒牙;
- 推免輸出;
- 推免式復(fù)用功能对妄;
- 開(kāi)漏復(fù)用功能湘今。
每個(gè)I/O可以自由編程,然而必須按照32位字訪問(wèn)I/O端口寄存器(不允許半字或字節(jié)訪問(wèn))剪菱。每個(gè)I/O端口有兩個(gè)32位配置寄存器(GPIOx_CRL摩瞎, GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR)孝常,一個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR)旗们,一個(gè)16位復(fù)位寄存器(GPIOx_BRR)和一個(gè)32位鎖定寄存器(GPIOx_LCKR)。下圖給出了一個(gè)I/O端口位的基本結(jié)構(gòu):
1.2 特點(diǎn)
- 專(zhuān)門(mén)的寄存器(GPIOx_BSRR和GPIOx_BRR)實(shí)現(xiàn)對(duì)GPIO口的原子操作构灸,即回避了直接設(shè)置或清除I/O端口時(shí)的“讀-修改-寫(xiě)”操作上渴,使得設(shè)置或清除I/O端口的操作不會(huì)被中斷處理打斷而造成誤動(dòng)作。
- I/O端口的輸出模式有3種速度可選喜颁,分別為2MHz稠氮、10MHz和50MHz,這有利于噪聲控制洛巢。這個(gè)速度是指I/O端口驅(qū)動(dòng)電路的響應(yīng)速度而不是輸出信號(hào)的速度括袒,輸出信號(hào)的速度與程序有關(guān)。用戶(hù)可以根據(jù)自己的需要選擇合適的驅(qū)動(dòng)電路稿茉,通過(guò)選擇速度來(lái)選擇不同的輸出驅(qū)動(dòng)(芯片內(nèi)部在I/O口的輸出部分安排了多個(gè)響應(yīng)速度不同的輸出驅(qū)動(dòng)電路)模塊锹锰,達(dá)到最佳的噪聲控制和降低功耗的目的。高頻的驅(qū)動(dòng)電路漓库,噪聲也高恃慧,當(dāng)不需要高的輸出頻率時(shí),請(qǐng)選用低頻驅(qū)動(dòng)電路渺蒿,這樣非常有利于提高系統(tǒng)的抗電磁干擾(EMI)能力痢士,當(dāng)然如果要輸出較高頻率的信號(hào),但卻選用了較低頻率的驅(qū)動(dòng)模塊茂装,很可能會(huì)得到失真的輸出信號(hào)怠蹂。
- GPIO端口設(shè)為輸入時(shí)善延,輸出驅(qū)動(dòng)電路與端口是斷開(kāi),所以輸出速度配置無(wú)意義城侧。
- 在復(fù)位期間和剛復(fù)位后易遣,復(fù)用功能未開(kāi)啟,I/O端口被配置成浮空輸入模式嫌佑。
- 所有I/O端口都有外部中斷能力豆茫,可以作為外部中斷的輸入,便于系統(tǒng)靈活設(shè)計(jì)屋摇,為了使用外部中斷線(xiàn)揩魂,端口必須配置成輸入模式。
- GPIO端口的配置具有上鎖功能炮温,當(dāng)配置好GPIO端口后火脉,可以通過(guò)程序鎖住配置組合,直到 下次芯片復(fù)位才能解鎖茅特。此功能非常有利于在程序跑飛的情況下保護(hù)系統(tǒng)中其他的設(shè)備忘分,不會(huì)因?yàn)槟承㊣/O端口的配置被改變而損壞棋枕,如一個(gè)輸入端口變成輸出端口并輸出電流白修。
- 所有I/O端口兼容CMOS和TTL,多數(shù)I/O端口兼容5V電平重斑,這些IO端口在與5V 電平的外設(shè)連接的時(shí)候具有優(yōu)勢(shì)兵睛,具體哪些 I/O端口是5V 兼容的,可以從該芯片的數(shù)據(jù)手冊(cè)管腳描述章節(jié)查到( I/O Level 標(biāo) FT 的就是 5V 電平兼容的)窥浪。
- 具有獨(dú)立的喚醒I/O端口祖很。
- 很多I/O口的復(fù)用功能,可以重新映射漾脂。
2 端口復(fù)用和重映射
2.1 定義
在STM32中假颇,有許多通用I/O端口,同時(shí)也內(nèi)置了許多外設(shè)骨稿,如USART笨鸡、CAN、SPI坦冠、ADC等等形耗,為了節(jié)儉引出管腳,這些內(nèi)置外設(shè)引出管腳是與通用I/O管腳共用的辙浑,當(dāng)I/O管腳作為這些外設(shè)模塊的功能引腳時(shí)就叫端口復(fù)用功能激涤。同時(shí),在STM32中判呕,每個(gè)內(nèi)置外設(shè)都有若干個(gè)輸入輸出引腳倦踢,一般這些外設(shè)的輸出引腳都有默認(rèn)I/O端口送滞,為了讓設(shè)計(jì)工程師擁有更大的靈活性以便可以更好地安排外設(shè)引腳功能,在 STM32中引入了外設(shè)引腳重映射(remap)的概念辱挥,即一個(gè)外設(shè)的引腳除了具有默認(rèn)的引腳位外累澡,還可以通過(guò)配置重映射寄存器的方式,把這個(gè)外設(shè)的引腳映射到其它的引腳位般贼。以下是STM32F103xC愧哟,STM32F103xD和STM32F103xE數(shù)據(jù)手冊(cè)中有關(guān)USART3引腳的摘要。
...
...
從以上管腳定義摘要中這里可以看出哼蛆,管腳PB10除了可以用作通用I/O功能外還可以復(fù)用作I2C2_SCL或USART3_TX蕊梧,還可以重映射為T(mén)IM2_CH3,管腳PB11除了可以用作標(biāo)準(zhǔn)I/O功能外還可以復(fù)用作I2C2_SDA或USART3_RX腮介,還可以重映射為T(mén)IM2_CH4肥矢。USART3_TX的默認(rèn)引出腳是PB10,USART3_RX的默認(rèn)引出腳是PB11叠洗,但經(jīng)過(guò)重映射后甘改,可以變更USART3_TX的引出腳為PD8,變更USART3_RX的引出腳為PD9灭抑。
2.2 端口復(fù)用輸出
一個(gè)外設(shè)的功能引腳不管是從默認(rèn)的腳位引出還是從重映射的引腳引出十艾,都需要通過(guò)GPIO端口實(shí)現(xiàn),相應(yīng)的GPIO端口必須配置為輸入(對(duì)應(yīng)模塊的輸入功能腾节,如USART的RX)或復(fù)用輸出(對(duì)應(yīng)模塊的輸出功能忘嫉,如USART的TX),對(duì)于輸出引腳案腺,可以按照需要配置為推挽復(fù)用輸出或開(kāi)漏復(fù)用輸出庆冕。
從圖中可以看出,配置為復(fù)用輸出時(shí)劈榨,該端口對(duì)應(yīng)的GPIO普通輸出功能將不起作用访递,例如當(dāng)配置PB10對(duì)應(yīng)的引腳為復(fù)用輸出功能時(shí),操作PB10對(duì)應(yīng)的輸出寄存器將不影響引腳上的信號(hào)同辣。通用I/O端口輸入功能與復(fù)用的輸入功能的配置方式?jīng)]有分別拷姿,這意味著在使用引腳的復(fù)用輸入功能時(shí),可以在這個(gè)引腳的輸入寄存器上讀出引腳上的信號(hào)邑闺。例如在使能了USART3模塊時(shí)跌前,可以讀GPIOB_IDR寄存器,得到PB11信號(hào)線(xiàn)上的當(dāng)前狀態(tài)陡舅。
2.3 端口重映射
在STM32中抵乓,有很多內(nèi)置外設(shè)都具有重映射的功能,比如USART、TIM灾炭、CAN茎芋、SPI、I2C等蜈出,詳細(xì)請(qǐng)看STM32參考手冊(cè)和所選芯片的數(shù)據(jù)手冊(cè)田弥。有些內(nèi)置外設(shè)的重映射功能還可以有多種選擇,下面是STM32F10x參考手冊(cè)上有關(guān)USART3輸入輸出引腳的重映射功能表:
從這個(gè)表中可以看出铡原,USART3的TX和RX的默認(rèn)引腳時(shí)PB10和PB11偷厦,但是可以根據(jù)重映射寄存器的配置,它們可以重映射到PC10和PC11燕刻,還可以重映射到PD8和PD9只泼。
2.4 端口復(fù)用功能選擇
在STM32中,有不少引腳上可以作為多個(gè)模塊的復(fù)用功能引出腳卵洗,如圖1的PB10请唱,默認(rèn)復(fù)用功能就有I2C2_SCL和USART3_TX兩個(gè)功能,TIM2重映射后过蹂,TIM2_CH3也使用PB10的復(fù)用功能十绑。在使用引腳的復(fù)用功能時(shí),需要注意酷勺,在軟件上只可以使能一個(gè)外設(shè)模塊本橙,否則在引出腳上可能產(chǎn)生信號(hào)沖突。例如鸥印,如果使能了USART3模塊勋功,且沒(méi)有對(duì)USART3進(jìn)行重映射配置,則不可以使能I2C2模塊库说;同理如果需要使用I2C2模塊,則不能使能USART3模塊片择。但是如果重映射USART3潜的,則USART3的TX和RX信號(hào)將從PC10和PC11,或PD8和PD9引出字管,避開(kāi)了I2C2使用的PB10和PB11啰挪,這時(shí)就可以同時(shí)使用 I2C2模塊和USART3模塊了。
在STM32中嘲叔,重映射是對(duì)所有信號(hào)管腳同時(shí)有效亡呵,從表1中可以看出,重映射是對(duì)所有信號(hào)同時(shí)有效硫戈。有的外設(shè)的部分信號(hào)引腳是可以獨(dú)立開(kāi)關(guān)的锰什,例如USART3模塊共有5個(gè)信號(hào),分別為T(mén)X、RX汁胆、CK梭姓、CTS和RTS,在這5個(gè)信號(hào)中嫩码,在使能了USART3模塊后誉尖,只有TX和RX是始終與對(duì)應(yīng)的引出腳相連,而其它3個(gè)信號(hào)分別有獨(dú)立的控制位铸题,控制它們是否與外部引腳相連铡恕,如果程序中不使用某個(gè)信號(hào)的功能,則可以關(guān)閉這個(gè)信號(hào)的功能丢间,對(duì)應(yīng)的引腳可以做為其它功能的引出腳没咙,比如,當(dāng)關(guān)閉了USART3的CK千劈、CTS和 RTS功能并且沒(méi)有重映射USART3時(shí)祭刚,PB12、PB13和PB14 可以作為通用輸入輸出端口使用墙牌,也可以作為其它模塊的復(fù)用功能引出腳涡驮。
3 外設(shè)端口配置
3.1 外設(shè)端口模式配置
不同的外設(shè)、工作模式喜滨、引腳所對(duì)應(yīng)的GPIO模式配置也不會(huì)不同捉捅,以下列出了所有外設(shè)的端口配置。
3.2 外設(shè)端口重映射
為了優(yōu)化64腳或100腳封裝的外設(shè)數(shù)目虽风,可以把一些復(fù)用功能重新映射到其他引腳上棒口,通過(guò)設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)實(shí)現(xiàn)引腳的重新映射,這時(shí)辜膝,復(fù)用功能不再映射到它們的原始分配上无牵。
3.2.1 OSC32_IN/OSC32_OUT
當(dāng) LSE 振 蕩 器 關(guān) 閉 時(shí) , LSE 振 蕩 器 引 腳 OSC32_IN/OSC32_OUT 可 以 分 別 用 做 GPIO 的PC14/PC15厂抖, LSE功能始終優(yōu)先于通用I/O口的功能茎毁。
3.2.2 OSC_IN/OSC_OUT
外部振蕩器引腳OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通過(guò)設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)實(shí)現(xiàn)忱辅。這個(gè)重映射只適用于36七蜘、 48和64腳的封裝(100腳和144腳的封裝上有單獨(dú)的PD0和PD1的引腳,不必重映射)墙懂。
3.2.3 CAN1復(fù)用功能重映射
CAN信號(hào)可以被映射到端口A橡卤、端口B或端口D上,如下表所示损搬。對(duì)于端口D碧库,在36柜与、 48和64腳的封裝上沒(méi)有重映射功能。
3.2.4 CAN2 復(fù)用功能重映射
3.2.5 JTAG/SWD復(fù)用功能重映射
調(diào)試接口信號(hào)被映射到GPIO端口上谈为,如下表所示:
為了在調(diào)試期間可以使用更多GPIO端口旅挤,通過(guò)設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位,可以改變上述重映射配置伞鲫,參見(jiàn)下表粘茄。
3.2.6 ADC復(fù)用功能重映射
3.2.7 定時(shí)器復(fù)用功能重映射
3.2.8 USART復(fù)用功能重映射
3.2.9 I2C1復(fù)用功能重映射
SPI1映射不適用于36腳封裝。
3.2.10 SPI1復(fù)用功能重映射
3.2.11 SPI3復(fù)用功能重映射
SPI3映射只適用于互聯(lián)網(wǎng)型產(chǎn)品秕脓。
3.2.12 以太網(wǎng)復(fù)用功能重映射
以太網(wǎng)映射只出現(xiàn)在互聯(lián)型產(chǎn)品柒瓣。
4 GPIO函數(shù)庫(kù)
4.1 初始化數(shù)據(jù)結(jié)構(gòu)定義
typedef struct
{
uint16_t GPIO_Pin; /*!< 指定被配置的GPIO管腳 */
GPIOSpeed_TypeDef GPIO_Speed; /*!< 指定所選管腳的速度 */
GPIOMode_TypeDef GPIO_Mode; /*!< 指定所選管腳的操作模式 */
}GPIO_InitTypeDef;
4.2 庫(kù)函數(shù)
函數(shù)名 | 描述 |
---|---|
GPIO_DeInit | 將外設(shè)GPIOx寄存器重設(shè)為缺省值 |
GPIO_AFIODeInit | 將復(fù)用功能(重映射事件控制和 EXTI 設(shè)置)重設(shè)為缺省值 |
GPIO_Init | 根據(jù)GPIO_InitStruct中指定的參數(shù)初始化外設(shè) GPIOx 寄存器 |
GPIO_StructInit | 把GPIO_InitStruct中的每一個(gè)參數(shù)按缺省值填入 |
GPIO_ReadInputDataBit | 讀取指定端口管腳的輸入 |
GPIO_ReadInputData | 讀取指定端口的輸入 |
GPIO_ReadOutputDataBit | 讀取指定端口管腳的輸出 |
GPIO_ReadOutputData | 讀取指定端口輸出 |
GPIO_SetBits | 設(shè)置指定的數(shù)據(jù)端口位 |
GPIO_ResetBits | 清除指定的數(shù)據(jù)端口位 |
GPIO_WriteBit | 設(shè)置或者清除指定的數(shù)據(jù)端口位 |
GPIO_Write | 向指定端口寫(xiě)入數(shù)據(jù) |
GPIO_PinLockConfig | 鎖定管腳設(shè)置寄存器 |
GPIO_EventOutputConfig | 選擇 管腳用作事件輸出 |
GPIO_EventOutputCmd | 使能或者失能事件輸出 |
GPIO_PinRemapConfig | 改變指定管腳的映射 |
GPIO_EXTILineConfig | 選擇管腳用作外部中斷線(xiàn)路 |