STM32 IO口的八種模式使用小結
/**
* @brief Configuration Mode enumeration
*/
typedef enum
{ GPIO_Mode_AIN = 0x0, //模擬輸入
GPIO_Mode_IN_FLOATING = 0x04, //浮空輸入
GPIO_Mode_IPD = 0x28, //下拉輸入
GPIO_Mode_IPU = 0x48, //上拉輸入
GPIO_Mode_Out_OD = 0x14, //開漏輸出
GPIO_Mode_Out_PP = 0x10, //推輓輸出
GPIO_Mode_AF_OD = 0x1C, //複用開漏輸出
GPIO_Mode_AF_PP = 0x18 //複用推輓輸出
}GPIOMode_TypeDef;
- 推輓輸出
:可以輸出高電平,也可以輸出低電平,結構是兩個三極體分別受兩個互補訊號的控制,總是在一個三極體導通的時候另一個截止,高電平由IC電源確定;
推輓電路是兩個引數相同的三極體或MOSFET,以推輓的方式存在於電路中,各負責正負半周的波形放大任務,電路工作時兩隻對稱的功率開關管每次只有一個導通,所以損耗小效率高,輸出既可以向負載灌電流也可以向負載抽取電流;
開漏輸出
輸出端相當於三極體的集電極,要得到高電平狀態需要使用上拉電阻才行,適用於做電流型的驅動,其吸收能力相對較強(一般20ma以內)
開漏的特點:
利用外部電流的驅動能力,減少IC內部的驅動,當IC內部的MOSFET導通的時候,驅動電流是從外部的VCC流經 R pull-up,MOSFET到GND。IC內部僅需要很小的柵極驅動電流。
一般來說 開漏是用來連線不同電平的元器件,匹配電平使用的。因為開漏輸出的引腳在不連線外部的上拉電阻的時候,只能輸出低電平,如果需要同時具備輸出高電平的功能需要加上上拉電阻,很好的一個有點就是可以通過改變上拉電源的電壓,便可以改變輸出電平,比如加上上拉電阻就可以提供TTL/CMOS電平的輸出等,(上拉電阻的組織決定了邏輯電平轉換速度,阻值越大,速度越低功耗越小,所以負載電阻的阻值要結合實際情況選優);
OPEN-DRAIN 提供了靈活的輸出方式,但是也有弱點,就是在上升沿的時候會有延時,因為上升沿是通過外接無源上拉電阻對負載進行充電實現的,所以當電阻選擇小的時候延時就小,但是功耗大,反之延時大功耗小,如果對延時有要求,則建議使用下降沿輸出。
可以將多個開漏輸出的Pin,連線到一條線上,通過一個上拉電阻,在不增加任何器件的情況下,形成”與邏輯”關係。這也是I2C,SMBus等匯流排判斷匯流排佔用的原理;浮空輸入
由於浮空輸入一般多用於外部按鍵輸入,在浮空輸入的狀態下,IO口的電平狀態是不確定的,如果在該引腳懸空的,讀取埠的電平狀態是不確定的複用開漏輸出、複用推輓輸出:可以理解為GPIO被作為第二功能使用的時候的配置情況;
- 總結:
- 浮空輸如:可以做Key識別 ,RX
- 上拉輸入 內部有上電阻
- 下拉輸入 內部有下拉電阻
- 模擬輸入 應用ADC模擬輸入,或者低電平狀態下有電
- 開漏輸出 IO口輸出0接地 IO口輸出1 懸空 需要上拉電阻才能實現輸出高電平,可以讀取IO輸入電平的變化實現C51的IO的雙向功能;
- 推輓輸出 IO輸出0接地 IO輸出1接VCC 讀輸入值是未知的
- 複用功能推輓輸出 片內外設功能 (I2C的SCL,SDA USART TX)
- 複用開漏輸出 片內外設功能 (TX1,MOSI,MISO,SCK,SS)
使用的例項:
模擬I2C使用開漏輸出的時候,接上拉電阻,能夠實現0和1的輸出,讀值的時候先GPIO_SetBits(GPIOB,GPIO_Pin_0); 拉高,然後在讀取IO口的值,GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
如果無上拉電阻,IO口預設是高電平;需要讀取IO口的值,可以使用帶上拉電阻的IPU和浮空輸入和開漏輸出
通常的五種方法使能一個引腳的IO口,作為普通GPIO輸入輸出:根據需要配置引腳,同時不要使能該引腳的多有的複用功能模組
作為普通模擬輸入:配置該IO口為模擬輸入模式,同時不要使能該引腳對應的所有的複用功能模組
作為內建外設的輸入的設定:根據需要配置該引腳為 浮空輸入 帶弱上拉輸入或者帶弱下拉輸入,同時使能該引腳對應的某個複用功能模組;
作為內建外設輸出:根據需要配置該引腳為複用推輓輸出或則複用開漏輸出,同時使能該引腳對用德爾複用功能模組