GPIO 是通用輸入輸出端口的簡稱,簡單來說就是STM32 可控制的引腳,STM32 芯片的GPIO 引腳與外部設備連接起來,從而實現與外部通訊、控制以及數據采集的功能。STM32 芯片的GPIO被分成很多組,每組有16 個引腳,如型號為STM32F103VET6 型號的芯片有GPIOA、GPIOB、GPIOC 至GPIOE 共5 組GPIO,芯片一共100 個引腳,其中GPIO就占了一大部分,所有的GPIO引腳都有基本的輸入輸出功能。
最基本的輸出功能是由STM32 控制引腳輸出高、低電平,實現開關控制,如把GPIO引腳接入到LED 燈,那就可以控制LED 燈的亮滅,引腳接入到繼電器或三極管,那就可以通過繼電器或三極管控制外部大功率電路的通斷。最基本的輸入功能是檢測外部輸入電平,如把GPIO 引腳連接到按鍵,通過電平高低區分按鍵是否被按下。
GPIO 框圖剖析

通過GPIO 硬件結構框圖,就可以從整體上深入了解GPIO 外設及它的各種應用模式。該圖從最右端看起,最右端就是代表STM32 芯片引出的GPIO 引腳,其余部件都位於芯片內部。
基本結構分析
下面我們按圖中的編號對GPIO端口的結構部件進行說明。
1. 保護二極管及上、下拉電阻
引腳的兩個保護二級管可以防止引腳外部過高或過低的電壓輸入,當引腳電壓高於VDD 時,上方的二極管導通,當引腳電壓低於VSS 時,下方的二極管導通,防止不正常電壓引入芯片導致芯片燒毀。盡管有這樣的保護,並不意味着STM32 的引腳能直接外接大功率驅動器件,如直接驅動電機,強制驅動要么電機不轉,要么導致芯片燒壞,必須要加大功率及隔離電路驅動。
2. P-MOS 管和N-MOS 管
GPIO 引腳線路經過兩個保護二極管后,向上流向“輸入模式”結構,向下流向“輸出模式”結構。先看輸出模式部分,線路經過一個由P-MOS 和N-MOS 管組成的單元電路。這個結構使GPIO具有了“推挽輸出”和“開漏輸出”兩種模式。
所謂的推挽輸出模式,是根據這兩個MOS 管的工作方式來命名的。在該結構中輸入高電平時,經過反向后,上方的P-MOS 導通,下方的N-MOS 關閉,對外輸出高電平;而在該結構中輸入低電平時,經過反向后,N-MOS 管導通,P-MOS 關閉,對外輸出低電平。當引腳高低電平切換時,兩個管子輪流導通,P 管負責灌電流,N 管負責拉電流,使其負載能力和開關速度都比普通的方式有很大的提高。推挽輸出的低電平為0 伏,高電平為3.3伏,它是推挽輸出模式時的等效電路。

而在開漏輸出模式時,上方的P-MOS 管完全不工作。如果我們控制輸出為0,低電平,則P-MOS 管關閉,N-MOS 管導通,使輸出接地,若控制輸出為1 (它無法直接輸出高電平)時,則P-MOS 管和N-MOS 管都關閉,所以引腳既不輸出高電平,也不輸出低電平,為高阻態。為正常使用時必須外部接上拉電阻。它具有“線與”特性,也就是說,若有很多個開漏模式引腳連接到一起時,只有當所有引腳都輸出高阻態,才由上拉電阻提供高電平,此高電平的電壓為外部上拉電阻所接的電源的電壓。若其中一個引腳為低電平,那線路就相當於短路接地,使得整條線路都為低電平,0 伏。
推挽輸出模式一般應用在輸出電平為0 和3.3 伏而且需要高速切換開關狀態的場合。在STM32 的應用中,除了必須用開漏模式的場合,我們都習慣使用推挽輸出模式。
開漏輸出一般應用在I2C、SMBUS 通訊等需要“線與”功能的總線電路中。除此之外,還用在電平不匹配的場合,如需要輸出5 伏的高電平,就可以在外部接一個上拉電阻,上拉電源為5 伏,並且把GPIO 設置為開漏模式,當輸出高阻態時,由上拉電阻和電源向外輸出5 伏的電平。


3. 輸出數據寄存器
前面提到的雙MOS 管結構電路的輸入信號, 是由GPIO“ 輸出數據寄存器GPIOx_ODR”提供的,因此我們通過修改輸出數據寄存器的值就可以修改GPIO 引腳的輸出電平。而“置位/復位寄存器GPIOx_BSRR”可以通過修改輸出數據寄存器的值從而影響電路的輸出。
4. 復用功能輸出
“復用功能輸出”中的“復用”是指STM32 的其它片上外設對GPIO 引腳進行控制,此時GPIO 引腳用作該外設功能的一部分,算是第二用途。從其它外設引出來的“復用功能輸出信號”與GPIO本身的數據據寄存器都連接到雙MOS 管結構的輸入中,通過圖中的梯形結構作為開關切換選擇。
例如我們使用USART 串口通訊時,需要用到某個GPIO引腳作為通訊發送引腳,這個時候就可以把該GPIO引腳配置成USART 串口復用功能,由串口外設控制該引腳,發送數據。
1 // GPIOB 16 個IO 全部輸出 0XFF
2 GPIOB->ODR = 0XFF;
5. 輸入數據寄存器
看GPIO 結構框圖的上半部分,GPIO 引腳經過內部的上、下拉電阻,可以配置成上/下拉輸入,然后再連接到施密特觸發器,信號經過觸發器后,模擬信號轉化為0、1 的數字信號,然后存儲在“輸入數據寄存器GPIOx_IDR”中,通過讀取該寄存器就可以了解GPIO引腳的電平狀態。
1 // 讀取GPIOB 端口的16 位數據值2uint16_ttemp;3 temp = GPIOB->IDR;
6. 復用功能輸入
與“復用功能輸出”模式類似,在“復用功能輸入模式”時,GPIO引腳的信號傳輸到
STM32 其它片上外設,由該外設讀取引腳狀態。
同樣,如我們使用USART 串口通訊時,需要用到某個GPIO引腳作為通訊接收引腳,這個時候就可以把該GPIO 引腳配置成USART 串口復用功能,使USART 可以通過該通訊引腳的接收遠端數據。
7. 模擬輸入輸出
當GPIO 引腳用於ADC 采集電壓的輸入通道時,用作“模擬輸入”功能,此時信號是不經過施密特觸發器的,因為經過施密特觸發器后信號只有0、1 兩種狀態,所以ADC 外設要采集到原始的模擬信號,信號源輸入必須在施密特觸發器之前。類似地,當GPIO 引腳用於DAC 作為模擬電壓輸出通道時,此時作為“模擬輸出”功能,DAC 的模擬信號輸出就不經過雙MOS 管結構,模擬信號直接輸出到引腳。
GPIO 工作模式
總結一下,由GPIO的結構決定了GPIO可以配置成以下模式:

(在固件庫中,GPIO總共有8 種細分的工作模式,大致歸類為以下三類)
1. 輸入模式(模擬/浮空/上拉/下拉)
在輸入模式時,施密特觸發器打開,輸出被禁止,可通過輸入數據寄存器GPIOx_IDR讀取I/O 狀態。其中輸入模式,可設置為上拉、下拉、浮空和模擬輸入四種。上拉和下拉輸入很好理解,默認的電平由上拉或者下拉決定。浮空輸入的電平是不確定的,完全由外部的輸入決定,一般接按鍵的時候用的是這個模式。模擬輸入則用於ADC 采集。
2. 輸出模式(推挽/開漏)
在輸出模式中,推挽模式時雙MOS 管以輪流方式工作,輸出數據寄存器GPIOx_ODR可控制I/O 輸出高低電平。開漏模式時,只有N-MOS 管工作,輸出數據寄存器可控制I/O輸出高阻態或低電平。輸出速度可配置,有2MHz\10MHz\50MHz 的選項。此處的輸出速度即I/O 支持的高低電平狀態最高切換頻率,支持的頻率越高,功耗越大,如果功耗要求不嚴格,把速度設置成最大即可。
在輸出模式時施密特觸發器是打開的,即輸入可用,通過輸入數據寄存器GPIOx_IDR可讀取I/O 的實際狀態。
3. 復用功能(推挽/開漏)
復用功能模式中,輸出使能,輸出速度可配置,可工作在開漏及推挽模式,但是輸出信號源於其它外設,輸出數據寄存器GPIOx_ODR 無效;輸入可用,通過輸入數據寄存器可獲取I/O 實際狀態,但一般直接用外設的寄存器來獲取該數據信號。
通過對GPIO 寄存器寫入不同的參數,就可以改變GPIO 的工作模式,再強調一下,要了解具體寄存器時一定要查閱《STM32F10X-中文參考手冊》中對應外設的寄存器說明。在GPIO 外設中,控制端口高低控制寄存器CRH和CRL 可以配置每個GPIO的工作模式和工作的速度,每4 個位控制一個IO,CRH 控制端口的高八位,CRL 控制端口的低8 位,具體的看CRH 和CRL 的寄存器描述。


如何做好精准職業規划
http://www.makeru.com.cn/live/4006_1429.html?s=45051
釋放潛能:學習效率提升、編程能力提升
http://www.makeru.com.cn/live/3507_1276.html?s=45051
(stm32 USART串口應用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051
PWM脈寬調制技術
http://www.makeru.com.cn/live/4034_2146.html?s=45051
(stm32直流電機驅動)
http://www.makeru.com.cn/live/1392_1218.html?s=45051