一、GPIO基本結構
二、GPIO工作模式
輸入模式
輸入浮空
輸入上拉
輸入下拉
模擬輸入
輸出模式
開漏輸出
開漏復用功能
推挽式輸出
推挽式復用功能
庫函數中所對應的代碼
1 typedef enum
2 {
3 GPIO_Mode_AIN = 0x0, /* 模擬輸入 */
4 GPIO_Mode_IN_FLOATING = 0x04, /* 浮空輸入,復位后的狀態 */
5 GPIO_Mode_IPD = 0x28, /* 下拉輸入,這里的下拉是指單片機內部的電阻 */
6 GPIO_Mode_IPU = 0x48, /* 上拉輸入,這里的上拉是指單片機內部的電阻 */
7 GPIO_Mode_Out_OD = 0x14, /* 開漏輸出 */
8 GPIO_Mode_Out_PP = 0x10, /* 推挽輸出 */
9 GPIO_Mode_AF_OD = 0x1C, /* 復用開漏輸出 */
10 GPIO_Mode_AF_PP = 0x18 /* 復用推挽輸出 */
11 }GPIOMode_TypeDef;
GPIO的工作模式有這么多那么每個模式是怎樣工作的呢?下面以圖片的形式進行講解
那么先來講解輸入模式下的4種工作方式(輸入浮空、輸入上拉、輸入下拉、模擬輸入)
(1)輸入浮空模式
(2)輸入上拉模式
(3) 輸入下拉模式
(4)模擬輸入模式
上面的幾種輸入模式根據圖所示的路線應該很好理解,懸空輸入就是你輸入進來的啥我就接受啥,輸入上拉就是你不輸入的時候我就是高電平,輸入下拉與輸入上拉情況相反,模擬輸入的話就是用來接受模擬量(電壓值),一般用於AD采集。
看完輸入的幾種模式后接下來學習下GPIO輸出的幾種工作模式
(1)開漏輸出模式
(2)開漏復用輸出模式
開漏形式輸出端相當於三極管的集電極,要得到高電平狀態需要上拉電阻才行。開漏形式的電路有以下幾個特點:
1、利用外部電路的驅動能力,減少IC內部的驅動。當IC內部MOSFET導通時,驅動電流是從外部的VCC流經上拉電阻、MOSFET到GND。IC內部僅需很小的柵極驅動電流。
2、一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因為開漏引腳不連接外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。(上拉電阻的阻值決定了邏輯電平轉換的速度。阻值越大,速度越低功耗越小,所以負載電阻的選擇要兼顧功耗和速度。)
3、開漏輸出提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。
4、可以將多個開漏輸出連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成"與邏輯"關系,即"線與"。可以簡單的理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯0,相當於接地,與之並聯的回路"相當於被一根導線短路",所以外電路邏輯電平便為0,只有都為高電平時,與的結果才為邏輯1。
開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸出高電平時電壓會拉到上拉電阻的電源電壓。這種方式適合在連接的外設電壓比單片機電壓低的時候。輸出端出跟集電極開路十分相似,工作原理也是一樣的。不同的是,開漏輸出使用的場效應管,使用時要加上拉電阻。(挺繞的,有機會用具體工程來介紹)
(3)推挽輸出模式
(4)推挽復用輸出模式
推挽輸出可以輸出高、低電平,連接數字器件;推挽結構一般是指兩個三極管分別受兩個互補信號的控制,總是在一個三極管導通的時候另一個截止。高低電平由IC的電源決定。
推挽電路是兩個參數相同的三極管或MOSFET,以推挽方式存在於電路中,各負責正負半周的波形放大任務,電路工作時,兩只對稱的功率開關管每次只有一個導通,所以導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級既提高電路的負載能力,又提高開關速度。
關於推挽輸出和開漏輸出,用一幅最簡單的圖形來概括:該圖中左邊的便是推挽輸出模式,其中比較器輸出高電平時下面的PNP三極管截止,而上面NPN三極管導通,輸出電平VS+;當比較器輸出低電平時則恰恰相反,PNP三極管導通,輸出和地相連,為低電平。右邊的則可以理解為開漏輸出形式,需要接上拉。
復用開漏 / 推挽輸出
可以認為是GPIO口被用作第二功能時的配置情況(即並非作為通用IO口使用),開漏 / 推挽輸出
下圖是截取的stm32f103中I/O口對應的功能PA1除了當做普通I/O之外還有USART2、ADC、TIM5、TIM2的功能
其實到這關於GPIO的這幾個工作模式就已經說完了,但是各位是否心中有個疑問,為什么輸入里面沒有說復用輸入呢?(輸出模式可是有復用輸出的相關模式的)
我們再來看看GPIO的結構圖,紅色的框內和藍色的框內是不是有一個很大的不同,藍色的框內有個梯形的東西(這個是用來選擇哪個輸出的)而輸入這邊沒有,所以在輸入的時候模擬輸入、復用功能對應的片上外設、以及讀入數據對應CPU都可以去讀取I/O寄存器或者相應寄存器的值(都是從I/O口一個個輸入進去的),前提是你打開相應的片上外設時鍾且使能,比如說復用功能需要輸入的數據那么對應的這個片上外設就應該使能且時鍾也使能,這個外設就可以通過讀自己的數據寄存器的值來得到I/O口的數據了(這寄存器和讀入數據中的輸入數據寄存器原理上是一樣的)