GPIO口工作原理的超詳細解釋(附電路圖)

うちは止水發表於2020-10-08

本文轉自:微信公眾號:電子工程專輯

STM32的GPIO介紹

 

STM32引腳說明

GPIO是通用輸入/輸出埠的簡稱,是STM32可控制的引腳。GPIO的引腳與外部硬體裝置連線,可實現與外部通訊、控制外部硬體或者採集外部硬體資料的功能。

 

STM32F103ZET6晶片為144腳晶片,包括7個通用目的的輸入/輸出口(GPIO)組,分別為GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同時每組GPIO口組有16個GPIO口。通常簡略稱為PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x為0-15。

 

STM32的大部分引腳除了當GPIO使用之外,還可以複用位外設功能引腳(比如串列埠),這部分在【STM32】STM32埠複用和重對映(AFIO輔助功能時鐘) 中有詳細的介紹。

 

GPIO基本結構

每個GPIO內部都有這樣的一個電路結構,這個結構在本文下面會具體介紹。

這邊的電路圖稍微提一下:

 

保護二極體:IO引腳上下兩邊兩個二極體用於防止引腳外部過高、過低的電壓輸入。當引腳電壓高於VDD時,上方的二極體導通;當引腳電壓低於VSS時,下方的二極體導通,防止不正常電壓引入晶片導致晶片燒燬。但是儘管如此,還是不能直接外接大功率器件,須加大功率及隔離電路驅動,防止燒壞晶片或者外接器件無法正常工作。

 

P-MOS管和N-MOS管:由P-MOS管和N-MOS管組成的單元電路使得GPIO具有“推輓輸出”和“開漏輸出”的模式。這裡的電路會在下面很詳細地分析到。

 

TTL肖特基觸發器:訊號經過觸發器後,模擬訊號轉化為0和1的數字訊號。但是,當GPIO引腳作為ADC採集電壓的輸入通道時,用其“模擬輸入”功能,此時訊號不再經過觸發器進行TTL電平轉換。ADC外設要採集到的原始的模擬訊號。

 

這裡需要注意的是,在檢視《STM32中文參考手冊V10》中的GPIO的表格時,會看到有“FT”一列,這代表著這個GPIO口時相容3.3V和5V的;如果沒有標註“FT”,就代表著不相容5V。

 

STM32的GPIO工作方式

GPIO支援4種輸入模式(浮空輸入、上拉輸入、下拉輸入、模擬輸入)和4種輸出模式(開漏輸出、開漏複用輸出、推輓輸出、推輓複用輸出)。同時,GPIO還支援三種最大翻轉速度(2MHz、10MHz、50MHz)。

 

每個I/O口可以自由程式設計,但I/O口暫存器必須按32位字被訪問。

 

GPIO_Mode_AIN 模擬輸入

GPIO_Mode_IN_FLOATING 浮空輸入

GPIO_Mode_IPD 下拉輸入

GPIO_Mode_IPU 上拉輸入

GPIO_Mode_Out_OD 開漏輸出

GPIO_Mode_Out_PP 推輓輸出

GPIO_Mode_AF_OD 複用開漏輸出

GPIO_Mode_AF_PP 複用推輓輸出

下面將具體介紹GPIO的這八種工作方式:

浮空輸入模式

浮空輸入模式下,I/O埠的電平訊號直接進入輸入資料暫存器。也就是說,I/O的電平狀態是不確定的,完全由外部輸入決定;如果在該引腳懸空(在無訊號輸入)的情況下,讀取該埠的電平是不確定的。

 

上拉輸入模式

上拉輸入模式下,I/O埠的電平訊號直接進入輸入資料暫存器。但是在I/O埠懸空(在無訊號輸入)的情況下,輸入端的電平可以保持在高電平;並且在I/O埠輸入為低電平的時候,輸入端的電平也還是低電平。

 

下拉輸入模式

下拉輸入模式下,I/O埠的電平訊號直接進入輸入資料暫存器。但是在I/O埠懸空(在無訊號輸入)的情況下,輸入端的電平可以保持在低電平;並且在I/O埠輸入為高電平的時候,輸入端的電平也還是高電平。

模擬輸入模式

模擬輸入模式下,I/O埠的模擬訊號(電壓訊號,而非電平訊號)直接模擬輸入到片上外設模組,比如ADC模組等等。

 

開漏輸出模式

開漏輸出模式下,通過設定位設定/清除暫存器或者輸出資料暫存器的值,途經N-MOS管,最終輸出到I/O埠。這裡要注意N-MOS管,當設定輸出的值為高電平的時候,N-MOS管處於關閉狀態,此時I/O埠的電平就不會由輸出的高低電平決定,而是由I/O埠外部的上拉或者下拉決定;當設定輸出的值為低電平的時候,N-MOS管處於開啟狀態,此時I/O埠的電平就是低電平。同時,I/O埠的電平也可以通過輸入電路進行讀取;注意,I/O埠的電平不一定是輸出的電平。

開漏複用輸出模式

開漏複用輸出模式,與開漏輸出模式很是類似。只是輸出的高低電平的來源,不是讓CPU直接寫輸出資料暫存器,取而代之利用片上外設模組的複用功能輸出來決定的。

總結與分析

 

1、什麼是推輓結構和推輓電路?

推輓結構一般是指兩個引數相同的三極體或MOS管分別受兩互補訊號的控制,總是在一個三極體或MOS管導通的時候另一個截止。高低電平由輸出電平決定。

 

推輓電路是兩個引數相同的三極體或MOSFET,以推輓方式存在於電路中,各負責正負半周的波形放大任務。電路工作時,兩隻對稱的功率開關管每次只有一個導通,所以導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級既提高電路的負載能力,又提高開關速度。

 

2、開漏輸出和推輓輸出的區別?

開漏輸出:只可以輸出強低電平,高電平得靠外部電阻拉高。輸出端相當於三極體的集電極。適合於做電流型的驅動,其吸收電流的能力相對強(一般20ma以內);

推輓輸出:可以輸出強高、低電平,連線數字器件。

關於推輓輸出和開漏輸出,最後用一幅最簡單的圖形來概括:

該圖中左邊的便是推輓輸出模式,其中比較器輸出高電平時下面的PNP三極體截止,而上面NPN三極體導通,輸出電平VS+;當比較器輸出低電平時則恰恰相反,PNP三極體導通,輸出和地相連,為低電平。右邊的則可以理解為開漏輸出形式,需要接上拉。

 

3、在STM32中選用怎樣選擇I/O模式?

浮空輸入_IN_FLOATING ——浮空輸入,可以做KEY識別,RX1

帶上拉輸入_IPU——IO內部上拉電阻輸入

帶下拉輸入_IPD—— IO內部下拉電阻輸入

模擬輸入_AIN ——應用ADC模擬輸入,或者低功耗下省電

開漏輸出_OUT_OD ——IO輸出0接GND,IO輸出1,懸空,需要外接上拉電阻,才能實現輸出高電平。當輸出為1時,IO口的狀態由上拉電阻拉高電平,但由於是開漏輸出模式,這樣IO口也就可以由外部電路改變為低電平或不變。可以讀IO輸入電平變化,實現C51的IO雙向功能

推輓輸出_OUT_PP ——IO輸出0-接GND, IO輸出1 -接VCC,讀輸入值是未知的

複用功能的推輓輸出_AF_PP ——片內外設功能(I2C的SCL、SDA)

複用功能的開漏輸出_AF_OD——片內外設功能(TX1、MOSI、MISO.SCK.SS)

 

 

 

 

相關文章