STM32F10x之GPIO

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):


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引腳的摘要。



...


...


圖1 I/O端口定義摘要

從以上管腳定義摘要中這里可以看出哼蛆,管腳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ù)用輸出庆冕。


圖2 復(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輸入輸出引腳的重映射功能表:


表1 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è)的端口配置。


表2 高級(jí)定時(shí)器TIM1&TIM8
表3 通用定時(shí)器TIM2~5
表4 USART
表5 SPI
表6 I2S
表7 I2C
表8 BxCAN
表9 USB
表10 全速USB OTG
表11 SDIO
表12 ADC/DAC
表13 FSMC
表14 其他IO

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)有重映射功能。


表15 CAN1復(fù)用功能重映射

3.2.4 CAN2 復(fù)用功能重映射

表16 CAN2重映射

3.2.5 JTAG/SWD復(fù)用功能重映射

調(diào)試接口信號(hào)被映射到GPIO端口上谈为,如下表所示:


表17 調(diào)試接口信號(hào)

為了在調(diào)試期間可以使用更多GPIO端口旅挤,通過(guò)設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位,可以改變上述重映射配置伞鲫,參見(jiàn)下表粘茄。

表18 調(diào)試端口重映射

3.2.6 ADC復(fù)用功能重映射

表19 ADC1外部觸發(fā)注入轉(zhuǎn)換重映射
表20 ADC1外部觸發(fā)規(guī)則轉(zhuǎn)換重映射
表21 ADC2外部觸發(fā)注入轉(zhuǎn)換重映射
表22 ADC2外部觸發(fā)規(guī)則轉(zhuǎn)換重映射

3.2.7 定時(shí)器復(fù)用功能重映射

表23 TIM5重映射
表24 TIM4重映射
表25 TIM3重映射
表26 TIM2重映射
表27 TIM1重映射

3.2.8 USART復(fù)用功能重映射

表28 USART3重映射
表29 USART2重映射
表30 USART1重映射

3.2.9 I2C1復(fù)用功能重映射

SPI1映射不適用于36腳封裝。

表31 I2C重映射

3.2.10 SPI1復(fù)用功能重映射

表32 SPI1重映射

3.2.11 SPI3復(fù)用功能重映射

SPI3映射只適用于互聯(lián)網(wǎng)型產(chǎn)品秕脓。

表33 SPI3重映射

3.2.12 以太網(wǎng)復(fù)用功能重映射

以太網(wǎng)映射只出現(xiàn)在互聯(lián)型產(chǎn)品柒瓣。


表34 ETH重映射

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)路
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吠架,隨后出現(xiàn)的幾起案子芙贫,更是在濱河造成了極大的恐慌,老刑警劉巖傍药,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磺平,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拐辽,警方通過(guò)查閱死者的電腦和手機(jī)拣挪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俱诸,“玉大人菠劝,你說(shuō)我怎么就攤上這事≌龃睿” “怎么了赶诊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)园骆。 經(jīng)常有香客問(wèn)我舔痪,道長(zhǎng),這世上最難降的妖魔是什么遇伞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任辙喂,我火速辦了婚禮,結(jié)果婚禮上鸠珠,老公的妹妹穿的比我還像新娘。我一直安慰自己秋麸,他們只是感情好渐排,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著灸蟆,像睡著了一般驯耻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天可缚,我揣著相機(jī)與錄音霎迫,去河邊找鬼。 笑死帘靡,一個(gè)胖子當(dāng)著我的面吹牛知给,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播描姚,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了堂鲜?” 一聲冷哼從身側(cè)響起可柿,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绊寻,沒(méi)想到半個(gè)月后花墩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澄步,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年冰蘑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮俗。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懂缕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出王凑,到底是詐尸還是另有隱情搪柑,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布索烹,位于F島的核電站工碾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏百姓。R本人自食惡果不足惜渊额,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垒拢。 院中可真熱鬧旬迹,春花似錦、人聲如沸求类。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尸疆。三九已至椿猎,卻和暖如春惶岭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犯眠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工按灶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筐咧。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓鸯旁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嗜浮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羡亩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容