# GPIO
Reference:[成大Wiki](https://wiki.csie.ncku.edu.tw/embedded/GPIO), [STM32G0x0](https://www.st.com/en/microcontrollers-microprocessors/stm32g030c8.html), [open drain push pull 上拉电阻理解](https://blog.csdn.net/chenpuo/article/details/105876739), [Open Drain Output vs. Push-Pull Output](https://open4tech.com/open-drain-output-vs-push-pull-output/)
## Introduction
由於開發MCU時會大量接觸GPIO的設定,對於硬體電路不熟的我有時就像霧裡看花。於是透過本篇筆記紀錄GPIO硬體相關特性及學習過程,方便複習。
## GPIO functional description
下圖是一個 I/O port 的電路圖,可搭配了解電路特性

首先,可以先了解控制 GPIO 的 register
:::info
:book: **GPIO 各個 register 功能**
1. GPIO port mode register (GPIOx_MODER):控制每個 GPIO 引腳的工作模式。
2. GPIO port output type register (GPIOx_OTYPER):設置輸出引腳的類型。
3. GPIO port output speed register (GPIOx_OSPEEDR):控制輸出信號的切換速度(影響上升沿和下降沿的時間)。
4. GPIO port pull-up/pull-down register (GPIOx_PUPDR):控制引腳是否啟用內部的上拉電阻或下拉電阻。
5. GPIO port input data register (GPIOx_IDR):用於讀取 GPIO 引腳的當前狀態。
6. GPIO port output data register (GPIOx_ODR):用於設置輸出引腳的狀態。
7. GPIO port bit set/reset register (GPIOx_BSRR):用於設置或清除 GPIO 引腳的輸出狀態(位操作)。
8. GPIO port configuration lock register (GPIOx_LCKR):鎖定 GPIO 的配置,防止意外修改。
:::
由`GPIOx_MODER`可知,一個pin通常可被設定成input、output、alternate function或analog,其中input及output又細分多種模式:
### Input
When the I/O port is programmed as input:
* The output buffer is disabled.
* The [<font color="#f00">^**^Schmitt trigger</font>](#note-1) input is activate.
* The pull-up and pull-down resistors are activated depending on the value in the GPIOx_PUPDR register.
* The data present on the I/O pin are sampled into the input data register every AHB clock cycle.
* A read access to the input data register provides the I/O state.

#### Mode
1. floating
當input pin被處在高阻抗的模式下,若沒有外部訊號源進來的話,此時是無法確定pin的狀態(不能確定現在處在高電位或低電位),除非有外部訊號來驅動電路。換句話說,input floating,這個input電位狀態完全是由外部訊號來決定,沒有訊號驅動的話,就會呈現高阻抗狀態。
2. pull-up/pull-down
如果我們需要這個pin有一個明確的預設狀態時,必須借助pull-up(pull-down)resistor來做調整,在pull-up resistor(pull-up外接高電壓,pull-down通常會接地)加入之下,讓pin的維持在明確的高電壓狀態(pull-down則是讓pin維持在低電壓狀態)。
3. <font color="#f00">repeater</font>
***這個模式較少使用***,重複器主要的作用是 「維持 GPIO 先前的狀態」,防止訊號在沒有驅動時變成不穩定的狀態。
* 當 GPIO 為 High(1)時,Repeater 會保持 High
* 當 GPIO 為 Low(0)時,Repeater 會保持 Low
* 如果沒有輸入(High-Z 狀態),GPIO 會保持最後的狀態,而不是變成浮動(Floating)
### Output
When the I/O port is programmed as output:
* The output buffer is enabled:
* Open drain mode: A “0” in the Output register activates the N-MOS whereas a “1” in the Output register leaves the port in Hi-Z (the P-MOS is never activated).
* Push-pull mode: A “0” in the Output register activates the N-MOS whereas a “1” in the Output register activates the P-MOS.
* The Schmitt trigger input is activated.
* The pull-up and pull-down resistors are activated depending on the value in the GPIOx_PUPDR register.
* The data present on the I/O pin are sampled into the input data register every AHB clock cycle.
* A read access to the input data register gets the I/O state.
* A read access to the output data register gets the last written value.

#### Mode
1. open-drain (with pull-up/pull-down)
此電路看到名子就可以理解他是開路的形式,所以選擇此電路時,輸出部分必須加上上拉電阻,透過 N-MOS 當開關,來決定輸出為 On/off,而輸出電壓則為外部決定。

2. push-pull (with pull-up/pull-down)
此時的電路有 P-MOS 與 N-MOS。當輸出設定為低電位, P-MOS 導通, N-MOS 關閉,如下圖路徑一;反之,當輸出為高電位時, P-MOS 關閉,而 N-MOS 導通。因此這種方法不需要額外加上拉電阻。

### Alternate function
When the I/O port is programmed as alternate function:
* The output buffer can be configured in open-drain or push-pull mode.
* The output buffer is driven by the signals coming from the peripheral (transmitter enable and data).
* The Schmitt trigger input is activated.
* The weak pull-up and pull-down resistors are activated or not depending on the value in the GPIOx_PUPDR register.
* The data present on the I/O pin are sampled into the input data register every AHB clock cycle.
* A read access to the input data register gets the I/O state.

### Analog
When the I/O port is programmed as analog configuration:
* The output buffer is disabled.
* The Schmitt trigger input is deactivated, providing zero consumption for every analog.
value of the I/O pin. The output of the Schmitt trigger is forced to a constant value (0).
* The weak pull-up and pull-down resistors are disabled by hardware.
* Read access to the input data register gets the value “0”.
* 
## 電路元件
- [ ] <a id="note-1">Schmitt trigger</a>
包含正回饋的比較器電路,將類比訊號的波形整成數位電路所能處理的方波波形,以利被input register讀取(處理完只能分辨出高低電位的差別)。

