1. 程式人生 > >STM32 IO口的八種模式使用小結

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;
  1. 推輓輸出

:可以輸出高電平,也可以輸出低電平,結構是兩個三極體分別受兩個互補訊號的控制,總是在一個三極體導通的時候另一個截止,高電平由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口為模擬輸入模式,同時不要使能該引腳對應的所有的複用功能模組
作為內建外設的輸入的設定:根據需要配置該引腳為 浮空輸入 帶弱上拉輸入或者帶弱下拉輸入,同時使能該引腳對應的某個複用功能模組;
作為內建外設輸出:根據需要配置該引腳為複用推輓輸出或則複用開漏輸出,同時使能該引腳對用德爾複用功能模組