GPIO基本知識
GPIO是通用輸入/輸出端口的簡稱,是STM32可控制的引腳。GPIO的引腳與外部硬件設備連接,可實現與外部通訊、控制外部硬件或者采集外部硬件數據的功能。那STM32引腳是如何分類的?GPIO內部結構是怎樣的,隨海翎光電的小編一起看看吧!
一、GPIO是什么?
GPIO(英語:General-purpose input/output)
通用輸入輸出端口的簡稱。可以通過軟件控制其輸出和輸入。stm32芯片的GPIO引腳與外部設備連接起來,GPIO既然一個引腳可以用于輸入、輸出或其他特殊功能,那么一定有寄存器用來選擇這些功能。對于輸入,一定可以通過讀取某個寄存器來確定引腳電位的高低;對于輸出,一定可以通過寫入某個寄存器來讓這個引腳輸出高電位或者低電位;對于其他特殊功能,則有另外的寄存器來控制它們。
二、STM32引腳分類
三、GPIO內部結構
引腳內部加上這兩個保護二級管可以防止引腳外部過高或過低的電壓輸入。 當引腳電壓高于 VDD_FT 或 VDD 時,上方的二極管導通吸收這個高電壓。 當引腳電壓低于 VSS 時,下方的二極管導通,防止不正常電壓引入芯片導致芯片燒毀。
上拉和下拉電阻上都有一個開關,通過配置上下拉電阻開關,可以控制引腳的默認狀態電平。 當開啟上拉時引腳默認電壓為高電平, 開啟下拉時,引腳默認電壓為低電平,這樣就可以消除引腳不定狀態的影響。 將上拉和下拉的開關都關斷,這種狀態我們稱為浮空模式,一旦配置成這個模式,引腳的電壓是不確定的,如果用萬用表測量此模式下管腳電壓時會發現只有 1 點幾伏,而且還不時改變,所以一般情況下我們都會給引腳設置成上拉或者下拉模式,使它有一個默認狀態。 STM32 上下拉及浮空模式的配置是通過GPIOx_CRL 和 GPIOx_CRH 寄存器控制的。 STM32 內部的上拉其實是一個弱上拉,也就是說通過此上拉電阻輸出的電流很小,如果想要輸出一個大電流,那么就需要外接上拉電阻了。
GPIO 引腳經過兩個保護二極管后就分成兩路, 上面一路是“輸入模式”,下面一路是“輸出模式”。 輸出模式,線路經過一個由 P-MOS 和 N-MOS管組成的單元電路,這讓 GPIO 引腳具有了推挽和開漏兩種輸出模式。 推挽輸出模式,是根據 P-MOS 和 N-MOS 管的工作方式命名的。 在該結構單元輸入一個高電平時,P-MOS 管導通,N-MOS 管截止,對外輸出高電平(3.3V)。 在該單元輸入一個低電平時,P-MOS 管截止,N-MOS 管導通,對外輸出低電平(0V)。 如果當切換輸入高低電平時,兩個 MOS 管將輪流導通,一個負責灌電流(電流輸出到負載),一個負責拉電流(負載電流流向芯片),使其負載能力和開關速度都比普通的方式有很大的提高。下圖為推挽輸出模式的等效電路。
在開漏輸出模式時,不論輸入是高電平還是低電平,P-MOS 管總處于關閉狀態。 當給這個單元電路輸入低電平時,N-MOS 管導通,輸出即為低電平。 當輸入高電平時,N-MOS 管截止,這個時候引腳狀態既不是高電平,又不是低電平,我們稱之為高阻態。 如果想讓引腳輸出高電平,那么引腳必須外接一個上拉電阻,由上拉電阻提供高電平。開漏輸出模式等效電路圖如下圖所示。
-
在開漏輸出模式中還有一個特點,引腳具有“線與”關系。即多個開漏輸出模式的引腳接在一起,只要有一個引腳為低電平,其他所有管腳都為低電平,即把所有引腳連接在一起的這條總線拉低了。
只有當所有引腳輸出高阻態時這條總線的電平才由上拉電阻的 VDD 決定。如果 VDD 連接的是 3.3V,那么引腳輸出的就是 3.3V,如果 VDD 連接的是 5V,那么引腳輸出的就是 5V。因此如果想要讓 STM32 管腳輸出 5V,可以選擇開漏輸出模式,然后在外接上拉電阻的電源 VDD 選擇 5V 即可,前提是這個 STM32 引腳是容忍 5V 的。開漏輸出模式一般應用在 I2C、SMBUS 通訊等需要“線與”功能的總線電路中。還可以用在電平不匹配的場合中,就如上面說的輸出 5V 一樣。 推挽輸出模式一般應用在輸出電平為 0-3.3V 而且需要高速切換開關狀態的場合。除了必須要用開漏輸出模式的場合,我們一般選擇推挽輸出模式。要配置引腳是開漏輸出還是推挽輸出模式可以使用GPIOx_CRL 和 GPIOx_CRH 寄存器。
四、GPIO具有8種模式,四種輸入模式,四種輸出模式。
輸入模式:
輸出模式:
開漏輸出(上拉或者下拉)GPIO_Mode_Out_OD
開漏復用功能(上拉或者下拉)GPIO_Mode_AF_OD
推挽式輸出(上拉或者下拉)GPIO_Mode_Out_PP
推挽式復用功能(上拉或者下拉)GPIO_Mode_AF_PP
四種最大輸出速度:
2MHZ
25MHZ
50MHZ
1000MHZ
五、GPIO8種模式含義
輸入浮空:浮空就是邏輯器件與引腳即不接高電平,也不接低電平。由于邏輯器件的內部結構,當它輸入引腳懸空時,相當于該引腳接了高電平。一般實際運用時,引腳不建議懸空,易受干擾。通俗講就是浮空就是浮在空中,就相當于此端口在默認情況下什么都不接,呈高阻態,這種設置在數據傳輸時用的比較多。浮空最大的特點就是電壓的不確定性,它可能是0V,頁可能是VCC,還可能是介于兩者之間的某個值(最有可能) 浮空一般用來做ADC輸入用,這樣可以減少上下拉電阻對結果的影響。
輸入上拉模式:上拉就是把點位拉高,比如拉到Vcc。上拉就是將不確定的信號通過一個電阻嵌位在高電平。電阻同時起到限流的作用。弱強只是上拉電阻的阻值不同,沒有什么嚴格區分。
輸入下拉:就是把電壓拉低,拉到GND。與上拉原理相似。
模擬輸入:模擬輸入是指傳統方式的輸入,數字輸入是輸入PCM數字信號,即0,1的二進制數字信號,通過數模轉換,轉換成模擬信號,經前級放大進入功率放大器,功率放大器還是模擬的。
開漏復用功能:可以理解為GPIO口被用作第二功能時的配置情況(即并非作為通用IO口使用)。端口必須配置成復用功能輸出模式(推挽或開漏)
推挽式輸出:可以輸出高,低電平,連接數字器件;推挽結構一般是指兩個三級管分別受到互補信號的控制,總是在一個三極管導通的時候另一個截止。高低電平由IC的電源低定。
推挽電路是兩個參數相同的三極管或MOSFET,以推挽方式存在于電路中,各負責正負半周的波形方法任務,電路工作時,兩只對稱的功率開關管每次只有一個導通,所以導通損耗小,效率高。輸出即可以向負載灌電流。推拉式輸出級即提高電路的負載能力,又提高開關速度。
推挽式復用功能:可以理解為GPIO口被用作第二功能時的配置情況(并非作為通用IO口使用)
GPIO的主要寄存器
每個I/O端口位可以自由編程,然而I/O端口寄存器必須按32位字被訪問(不允許半字或字節訪問),**一些寄存器的使用功能可以通過立創商場查找相應單片機芯片的數據手冊來查閱,然后進行相應的端口配置,以達到IO口初始化的效果。**也可以通過以下鏈接來查看GPIO相關寄存器配置詳情。
GPIO相關寄存器
六、在stm32中選用io模式
(1) 浮空輸入_IN_FLOATING ——浮空輸入,可以做KEY識別,RX1
(2)帶上拉輸入_IPU——IO內部上拉電阻輸入
(3)帶下拉輸入_IPD—— IO內部下拉電阻輸入
(4)模擬輸入_AIN ——應用ADC模擬輸入,或者低功耗下省電
(5)開漏輸出_OUT_OD ——IO輸出0接GND,IO輸出1,懸空,需要外接上拉電阻,才能實現輸出高電平。當輸出為1時,IO口的狀態由上拉電阻拉高電平,但由于是開漏輸出模式,這樣IO口也就可以由外部電路改變為低電平或不變 。可以讀IO輸入電平變化,實現C51的IO雙向功能
(6)推挽輸出_OUT_PP ——IO輸出0-接GND, IO輸出1 -接VCC,讀輸入值是未知的
(7)復用功能的推挽輸出_AF_PP ——片內外設功能(I2C的SCL,SDA)
(8)復用功能的開漏輸出_AF_OD ——片內外設功能(TX1,MOSI,MISO.SCK.SS)
總結:之前對于配置寄存器都是通過例程來進行配置的,當自己實際來進行配置的時候還是有點困難,經過多次練習后,自己掌握了一些寄存器的應用場景之后,配置端口的速度也有所提升,也對之前不懂的地方有了新的理解,總的來說,成功沒有捷徑,還是要多練習,多看stm32中的一些底層函數,這樣才有更好的提升。好了,海翎光電的小編今日分享就到這里。