1. 程式人生 > >stm32簡明教程系列(二)----GPIO(上)八種模式的區別與應用場合

stm32簡明教程系列(二)----GPIO(上)八種模式的區別與應用場合

一.概述

GPIO全稱為通用輸入/輸出埠。是stm32用於輸出訊號,輸入訊號的通道。他有以下八種模式:

輸入方式

  • 浮空輸入 GPIO_Mode_IN_FLOATING
  • 上拉GPIO_Mode_IPU
  • 下拉GPIO_Mode_IPD
  • 模擬輸入 GPIO_Mode_AIN

輸出方式

  • 開漏輸出GPIO_Mode_AF_OD
  • 開漏複用GPIO_Mode_AF_OD
  • 推輓式輸出GPIO_Mode_Out_PP
  • 推輓式複用功能GPIO_Mode_AF_PP

我們分別介紹一下他們各自的原理以及用途。還是首先祭出這張總的原理圖:

我們先來講一下這個結構圖。我們可以看到虛線所框住的兩個部分,即分別為輸入輸出的驅動器。輸入驅動器的主要元件是TTL施密特(肖特基)觸發器。這個觸發器的主要作用是:設定電壓閾值,超過/低於該電壓,才可通過

。輸出驅動器的主要元件是P-MOS管和一個N-MOS管。

這裡先介紹一下MOS管。對於我們後面理解電路有很大的幫助。

MOS管是由加在輸入端柵極的電壓(GU)來控制輸出端漏極的電流(DI)的元器件。它類似於三極體,有三個極,分別為柵極/門極(G),源極(Source)和漏極(Drain)。按溝道半導體材料的不同,結型和絕緣柵型各分N溝道和P溝道兩種。若按導電方式來劃分,場效電晶體又可分紅耗盡型與加強型。結型場效電晶體均為耗盡型,絕緣柵型場效電晶體既有耗盡型的,也有加強型的。如下圖:

我們可以從上圖看到N溝的MOS管的箭頭指向絕緣板。mos管有一個重要的引數就是開啟電壓。對於N-mos管來說,這裡我們要想讓源極S和漏極D之間開始通電,則柵極和源級之間的電壓必須大於開啟電壓。同理,對於P-mos管,柵極和源級電壓必須小於開啟電壓。比如說,這裡我們開啟電壓是5v,源級電壓是12V,柵極電壓要12+5=17V才能導通。

導通特性 :

  • NMOS的特性,Vgs大於一定的值就會導通,適合用於漏極D接電源,源極S接地時的情況(低端驅動),只要柵極電壓達到4V或10V就可以了。需要注意的是,Vgs指的是柵極G與源極S的電壓。
  • PMOS的特性,Vgs小於一定的值就會導通,適合用於源極接VCC時的情況(高階驅動)。但是,雖然PMOS可以很方便地用作高階驅動,但由於導通電阻大,價格貴,替換種類少等原因,在高階驅動(大功率)中,通常還是使用NMOS。

二.詳解

1.浮空輸入

1)原理圖

這裡我們可以看到,外部的電平訊號通過左邊編號1的I/O埠進入STM32,經過編號2的施密特觸發器的整形送入編號3的“輸入資料暫存器”,在“輸入資料暫存器”的另一端(編號4),CPU可以隨時讀出I/O埠的電平狀態。

2)適用場合

(1)按鍵識別

(2)串列埠RX1 

2.輸入上拉模式

1)原理圖

與前面的浮空輸入模式相比,僅僅是在資料通道上部,接入了一個上拉電阻,並接到裝置電壓(VDD)。根據STM32的資料手冊,這個上拉電阻阻值介於30K~50K歐姆。同樣,CPU可以隨時在“輸入資料暫存器”的另一端,讀出I/O埠的電平狀態。

該輸入模式中,上拉電阻的目的是為了保證在無訊號輸入時IO口的電平為高電平。同時,當訊號輸入為低電平時,IO口的電平應該也為低電平。如果沒有上拉電阻,在沒有外界輸入的情況下輸入端是懸空的,它的電平是未知的無法保證的,上拉電阻就是為了保證無訊號輸入時輸入端的電平為高電平。同樣還有下拉電阻它是為了保證無訊號輸入時輸入端的電平為低電平。

2)適用場合

IO內部上拉電阻輸入

3.輸入下拉模式

1)原理圖

資料通道的下部,接入了一個下拉電阻,並接到電路共地端(VSS)。根據STM32的資料手冊,這個下拉電阻阻值也是介於30K~50K歐姆。

2)適用場合

 IO內部下拉電阻輸入

4.模擬輸入通道

1)原理圖

模擬通道輸入的配置則更加簡單,訊號從左邊編號1的埠進入,從右邊編號2的一端直接進入ADC模組。 
這裡看到所有的上拉、下拉電阻和施密特觸發器,均處於斷開狀態,因此“輸入資料暫存器”將不能反映埠上的電平狀態,也就是說,模擬輸入配置下,CPU不能在“輸入資料暫存器”上讀到有效的資料。這也是為什麼我們在選擇ADC採集時,不能通過直接讀取GPIO輸入資料暫存器來獲得模擬電壓值。而是必須讀取ADC資料暫存器的值。

2)適用場合

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

5.開漏輸出GPIO_Mode_Out_OD

1)原理圖

這是開漏輸出模式的配置,當CPU在左邊的編號1端通過位設定/清除暫存器或輸出資料暫存器寫入資料後,該資料位將通過編號2的輸出控制電路控制3,將訊號傳送到編號4的I/O埠。

如果CPU寫入的是邏輯“1”,則編號3的N-MOS管將處於關閉狀態,此時I/O埠的電平將由外部的上拉電阻決定,如果CPU寫入的是邏輯“0”,則編號3的N-MOS管將處於開啟狀態,此時I/O埠的電平被編號3的N-MOS管拉到了VSS的零電位。 
同時,根據藍色線路,施密特觸發器處於開啟狀態,這意味著CPU可以在“輸入資料暫存器”的另一端,隨時監控I/O埠的狀態;通過這個特性,還實現了虛擬的I/O埠雙向通訊:只要CPU輸出邏輯“1”,由於編號3的N-MOS管處於關閉狀態,I/O埠的電平將完全由外部電路決定,因此,CPU可以在“輸入資料暫存器”讀到外部電路的訊號,而不是它自己輸出的邏輯“1”。 
開漏形式的電路有以下幾個特點: 
1、 利用外部電路的驅動能力,減少IC內部的驅動。當IC內部MOSFET導通時,驅動電流是從外部的VCC流經電阻上拉後 ,從MOSFET到GND。IC內部僅需很小的柵極驅動電流。 
2、 一般來說,開漏是用來連線不同電平的器件,匹配電平用的,因為開漏引腳不連線外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。(上拉電阻的阻值決定了邏輯電平轉換的沿的速度 。阻值越大,速度越低功耗越小,所以負載電阻的選擇要兼顧功耗和速度。) 
3、開漏提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。 
4、可以將多個開漏輸出的Pin,連線到一條線上。通過一隻上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關係。這也是I2C,SMBus等匯流排判斷匯流排佔用狀態的原理。

2)適用場合

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

 因為通常需要再加一個上拉電阻,所以不怎麼用。

6.開漏複用GPIO_Mode_AF_OD

1)原理圖

開漏複用輸出模式與開漏輸出模式的配置基本相同。不同的是編號2的輸出控制電路的輸入與複用功能的輸出端相連,此時輸出資料暫存器被從輸出通道斷開了。

同樣,CPU可以從“輸入資料暫存器”讀到外部電路的訊號。

2)適用範圍

片內外設功能(TX1,MOSI,MISO.SCK.SS)

7.推輓式輸出GPIO_Mode_Out_PP

1)原理圖

在開漏輸出模式的基礎上,推輓輸出模式僅僅是在編號2的輸出控制電路之後,增加了一個P-MOS管。 

補充圖片:

當輸出邏輯“1”時,編號3處的P-MOS管導通,而下方的N-MOS管截止,達到輸出高電平的目的。 
當輸出邏輯“0”時,編號3處的P-MOS管截止,而下方的N-MOS管導通,達到輸出低電平的目的。
在這個模式下,CPU仍然可以從“輸入資料暫存器”讀到外部電路的訊號。 
推輓結構一般是指兩個三極體分別受兩互補訊號的控制,總是在一個三極體導通的時候另一個截止。高低電平由IC的電源低定。 
推輓電路是兩個引數相同的三極體或MOSFET,以推輓方式存在於電路中,各負責正負半周的波形放大任務,電路工作時,兩隻對稱的功率開關管每次只有一個導通,所以導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級既提高電路的負載能力,又提高開關速度。

2)適用場合

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

8.推輓式複用功能GPIO_Mode_AF_PP

最後是推輓複用輸出模式,同樣的道理,編號2的輸出控制電路的輸入,與複用功能的輸出端相連,此時輸出資料暫存器被從輸出通道斷開了。 
其它部分與前述模式一致,包括對“輸入資料暫存器”的讀取。

2)應用場合

片內外設功能(I2C的SCL,SDA)

三、小結

如果接按鍵,則配置成上拉輸入;如果是上拉,無鍵下1,按下0,掃描要用0掃描。如果是下拉,要用1掃描。

一般輸出儘量用推輓,輸出電流大20mA左右,比如接上一個LED燈;輸入儘量用浮空;雙向比如DS18B20,和特殊要求比如IIC用開漏;AD用模擬;第2功能用複用;上下拉也可以作為輸出,但是推輓的驅動能力更好。

  • 浮空,顧名思義就是浮在空中,上面用繩子一拉就上去了,下面用繩子一拉就沉下去了。
  • 開漏,就等於輸出口接了個NPN三極體,並且只接了e,b.。而c極是開路的,你可以接一個電阻到3.3V,也可以接一個電阻到5V,這樣,在輸出1的時候,就可以是5V電壓,也可以是3.3V電壓了。但是不接電阻上拉的時候,這個輸出高就不能實現了。 
  • 推輓,就是有推有拉,任何時候IO口的電平都是確定的,不需要外接上拉或者下拉電阻。