1、推挽輸出模式
#define GPIO_MODE_OUTPUT_PP 0x00000001U / *!<輸出推拉模式* /
推挽結構一般是指兩個三極管分別受兩個互補信號的控制,總是在一個三極管導通的時候另一個截止。
這種結構既可以輸出高電平,也可以輸出低電平,可以用於連接數字器件。
推挽電路是兩個參數相同的三極管或MOSFET,以推挽方式存在於電路中,各負責正負半周的波形放大任務,電路工作時,兩只對稱的功率開關管每次只有一個導通,
所以導通損耗小,效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級既提高電路的負載能力,又提高開關速度。
2、開漏輸出模式
#define GPIO_MODE_OUTPUT_OD 0x00000011U / *!<輸出開漏模式* /
如果外部不接上拉電阻時,只能輸出低電平,所以要想輸出高電平必須要外接上拉電阻。
i、一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因為如果外部不接上拉電阻時,只能輸出低電平,所以要想輸出高電平必須要外接上拉電阻。
很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平,用於不同電壓的系統之間的通信。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。
(上拉電阻的阻值決定了邏輯電平轉換的速度。阻值越大,速度越低功耗越小,所以負載電阻的選擇要兼顧功耗和速度。)
ii、利用外部電路的驅動能力,減小內部電流,當IC內部MOSFET導通時,驅動電流是從外部的VCC流經上拉電阻、MOSFET到GND。內部只需要很小的柵極驅動電流。
iii、開漏輸出提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時,通信的速度也受到上拉電阻阻值的影響。因為上升沿是通過外接上拉無源電阻
對負載充電,所以當電阻選擇小時延時就小,通信速度可以很快,但功耗大;反之延時大通信速度變慢功耗小。所以如果對延時有要求,則建議用下降沿輸出。
iv、可以將多個開漏輸出連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關系,即“線與”。
可以簡單的理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯0,相當於接地,
與之並聯的回路“相當於被一根導線短路”,所以外電路邏輯電平便為0,只有都為高電平時,與的結果才為邏輯1。
關於推挽輸出和開漏輸出,最后用一幅最簡單的圖形來概括:
該圖中左邊的便是推挽輸出模式,其中比較器輸出高電平時下面的PNP三極管截止,而上面NPN三極管導通,輸出電平VS+;
當比較器輸出低電平時則恰恰相反,PNP三極管導通,輸出和地相連,為低電平。推挽輸出可以提高電路的負載能力,提高開關速度。
右邊的則可以理解為開漏輸出形式,需要接上拉。
開漏輸出:只可以輸出強低電平,高電平得靠外部電阻拉高。輸出端相當於三極管的集電極。適合於做電流型的驅動,其吸收電流的能力相對強(一般20ma以內);
推挽輸出:可以輸出強高、低電平,連接數字器件。
3、復用推挽輸出、復用開漏輸出
#define GPIO_MODE_AF_PP 0x00000002U / *!<備用功能推拉模式* /
#define GPIO_MODE_AF_OD 0x00000012U / *!<備用功能開漏模式 * /
這兩種模式,可以理解為把GPIO配置為第二功能使用的時候的配置,並非作為通用IO口使用。
比如使用外設I2C時,需要把GPIO配置為復用開漏輸出,用於數據通信功能。
再比如串口通信的TX,以及SPI外設的GPIO使用就要把引腳設置為復用推挽輸出。
4、浮空輸入模式
#define GPIO_MODE_INPUT 0x00000000U / *!<輸入浮動模式* /
浮空輸入模式下,I/O端口的電平信號直接進入輸入數據寄存器。也就是說,I/O的電平狀態是不確定的,完全由外部輸入決定;
如果在該引腳懸空(在無信號輸入)的情況下,讀取該端口的電平是不確定的。浮空輸入一般多用於外部按鍵輸入。
5、模擬輸入模式
#define GPIO_MODE_ANALOG 0x00000003U / *!<模擬輸入模式* /
I/O端口的模擬信號(電壓信號,而非電平信號)直接模擬輸入到片上外設模塊,比如ADC模擬輸入等。不像其他輸入模式只有0和1,模擬輸入模式可以讀取到很細微變化的值。
6、帶上拉,下拉輸入模式
#define GPIO_MODE_IT_RISING 0x10110000U / *!<具有上升沿觸發檢測的外部中斷模式* /
#define GPIO_MODE_IT_FALLING 0x10210000U / *!<具有下降沿觸發檢測的外部中斷模式* /
#define GPIO_MODE_IT_RISING_FALLING 0x10310000U / *!<具有上升沿/下降沿觸發檢測的外部中斷模式* /
關於上下拉的電阻的介紹是電阻阻值都在30-50K之間。
上拉就是使IO口接上拉電阻到VCC了;下拉就是使IO口接下拉電阻到GND了;浮空就是即不接上拉,也不接下拉,這樣的話IO默認輸入電平不確定。
因為浮空模式時,在GPIO外部連接的電路未工作時,STM32讀取的GPIO狀態是不確定的,所以可以采用帶上拉或者下拉輸入的模式先給MCU一個確定的狀態,
當外部電路電平狀態發生變化時,易於MCU的判斷。這樣可以增強MCU的抗干擾能力。
上拉輸入模式下,I/O端口的電平信號直接進入輸入數據寄存器。但是在I/O端口懸空(在無信號輸入)的情況下,輸入端的電平可以保持在高電平;
並且在I/O端口輸入為低電平的時候,輸入端的電平也還是低電平。
下拉輸入模式下,I/O端口的電平信號直接進入輸入數據寄存器。但是在I/O端口懸空(在無信號輸入)的情況下,輸入端的電平可以保持在低電平;
並且在I/O端口輸入為高電平的時候,輸入端的電平也還是高電平。
在STM32中選用怎樣選擇I/O模式?
1--浮空輸入_IN_FLOATING ——浮空輸入,可以做KEY識別,RX;一般實際運用時,引腳不建議懸空,易受干擾。
2--帶上拉輸入_IPU——IO內部上拉電阻輸入。
3--帶下拉輸入_IPD—— IO內部下拉電阻輸入。
4--模擬輸入_AIN ——應用ADC模擬輸入,或者低功耗下省電。
5--推挽輸出_OUT_PP ——IO輸出0接GND, IO輸出1 接VCC,讀輸入值是未知的。
6--開漏輸出_OUT_OD ——IO輸出0接GND,IO輸出1懸空,需要外接上拉電阻,才能實現輸出高電平。當輸出為1時,IO口的狀態由上拉電阻拉高電平,但由於是開漏輸出模式,
這樣IO口也就可以由外部電路改變為低電平或不變。可以讀IO輸入電平變化,實現IO雙向功能,適合於做電流型的驅動,其吸收電流的能力相對強(一般20ma以內)。
7--復用推挽輸出_AF_PP ——片內外設功能(TX1、SPI)
8--復用開漏輸出_AF_OD——片內外設功能(I2C)