第一次使用 MCU: GPIO 相關配置設計
什麼是GPIO?
韌體工程師於程式編寫設計中,不只需要設計編寫的程式,因為有需要對應的硬體配置。因此對於我們來說,硬體也是相當重要的,但對於多數人來說,硬體功夫反而沒有非常深厚!因此此文只要是在描述該如何設置MCU上多數硬體設計。
MCU上的GPIO 設定全名為 General-purpose input/output 的縮寫 (中文名稱:通用型之輸入輸出) 。也就是利用編寫設定暫存器的方法來控制 MCU 上的腳位為輸出或輸入。這功能應用於簡單的電路上可說是十分的重要呢!
※註: 傳統 GPIO 輸出輸入電位多數為 5V,其較新 MCU 為了節省效率等需求,大多數漸漸的將 MCU 使用電源降低為 3.3V,因此 GPIO 腳位也跟著改為 3.3V。
GPIO 可分為輸入型與輸出型兩種,多數 MCU 會再去細分其配置模式的選擇,像是輸入型的配置模式可為 Floating, with/without pull-up/pull-down,而輸出型的配置模式可分為 Push-pull, open drain, with/without pull-up/pull-down。
下面敘述的設定皆來自 MCU STM32F411 的設計,各家 MCU 設定暫存器方法均不太一樣。為了讓使用者快速上手,像是瑞薩、ST、TI 等廠商均有提供他們各自設計的 API 提供使用者快速設定所需的功能,則可省略大量閱讀MCU datasheet 的過程。
GPIO 可分為兩類 (輸入型 與 輸出型):
● 輸入型:
當我們在設定 GPIO 為輸入型時,下路的 output buffer 會被 disable,而圖中的 Schmitt trigger [ A* ]會被 turn on,而上拉電阻/下拉電阻 [ B* ] 可經過 GPIOx_PUPDR 暫存器設定阻值。
● 輸出型:
當我們在設定 GPIO 為輸出型時,下路的 output buffer 會被 enable,此時下方 Output driver 分為兩種模式,Push-pull 與 Open-drain 電路 [C* ]。而圖中的 Schmitt trigger [ A* ]也會被 turn on,而上拉電阻/下拉電阻 [ B* ] 可經過 GPIOx_PUPDR 暫存器設定阻值。
文中所提相關名詞解釋:
[ A* ]: Schmitt trigger 施密特觸發器
Schmitt trigger 施密特觸發器為一正回饋的比較電路,當輸入電壓高於設定之閥值電壓時,輸出一正電壓;反之,當輸入電壓低於設定之閥值電壓時,輸出一低電壓。
[ B* ]: 上拉電阻/下拉電阻 (Pull-up & Pull-down resistor)
電路中為了讓其中一點維持一個電位的基準值,就可以利用使方法。上拉電阻/下拉電阻就是用來維持基準電位的。如果電路設計中這值為浮動的,易造成輸入或輸出腳位容易受到雜訊干擾 (亂數值)。
下面例子依 GPIO 設定為輸出為例:
▼上拉電阻:
當 GPIO 輸出為 Low 時,此時 I/O pin 則會讀到 VDD 這個電壓;反之,若 GPIO 輸出為 High 時,此時 I/O pin 則會讀到輸出 High 的電壓。
▼下拉電阻:
當 GPIO 輸出為 Low 時,此時 I/O pin 則會讀到 VSS 這個電壓;反之,若 GPIO 輸出為 High 時,此時 I/O pin 則會讀到輸出 High 的電壓。
[ C* ]: Push-pull 與 Open-drain 電路
▼Open-drain:
此電路看到名子就可以理解他是開路的形式,所以選擇此電路時,輸出部分必須加上一上拉電阻,透過下臂 N-MOS 當開關,來決定輸出為 On/off,而輸出電壓則為外部決定。要注意的是,若輸出沒有加上上拉電阻,此時的輸出則為浮接狀態,優點為可利用此電路做為電壓轉換的機制與IC只需要提供很小的閘極電流。
▼Push-Pull:
此時的電路有 P-MOS 與 N-MOS,這時的電路就是個 Totem pole 了。當輸出設定為低電位,上臂 P-MOS 導通,而下臂 N-MOS 關閉,因此輸出為低電位,如下圖路徑一;反之,當輸出為高電位時,上臂 P-MOS 關閉,而下臂 N-MOS 導通,因此輸出為高電位。因此這種方法不需要額外加上拉電阻,如下圖路徑二。此電路的優點為可以做為吸電流,也可做為灌電流,根據電壓來決定方向,但輸出電壓由IC電源決定。