1. GPIO 的基本概念
(1) 什么是 GPIO?
GPIO 的中文意思是通用輸入輸出端口(General Purpose Input/Output),是嵌入式系統中可編程控制的通用引腳,可通過軟件配置為輸入或輸出模式。(背誦)
(2) 它的主要功能是什么?(背誦)
① 輸入功能:讀取引腳電平狀態,獲取按鍵和各類傳感器的信息輸入。
② 輸出功能:輸出高低電平,控制外圍設備。
③ 復用功能:部分GPIO可配置為特殊功能(如UART、SPI、I2C)
2. GPIO 的 8 種工作模式(背誦)
模式名稱 | 性質 | 關鍵特征 |
浮空輸入 | 數字輸入 | 可讀取引腳電平,若引腳懸空,則電平不確定(巧記:輸入為讀取) |
上拉輸入 | 數字輸入 | 可讀取引腳電平,內部連接上拉電阻,懸空時默認高電平 |
下拉輸入 | 數字輸入 | 可讀取引腳電平,內部連接下拉電阻,懸空時默認低電平 |
模擬輸入 | 模擬輸入 | ?GPIO 無效,引腳直接接入內部 ADC |
開漏輸出 | 數字輸出 | 可輸出引腳電平,高電平為高阻態,低電平接 VSS(巧記:輸出為輸出) |
推挽輸出 | 數字輸出 | 可輸出引腳電平,高電平接 VDD,低電平接 VSS |
復用開漏輸出 | 數字輸出 | 由片上外設控制,高電平為高阻態,低電平為 VSS |
復用推挽輸出 | 數字輸出 | 由片上外設控制,高電平接 VDD,低電平接 VSS |
(1) 上拉/下拉電阻:上拉/下拉電阻用于設置引腳的默認電壓。上拉使能,引腳默認電壓為高電平,下拉使能,引腳默認電壓為低電平。
(2) VSS 通常指電路的負極,VDD 通常指電路的正電源。
3. 推挽輸出和開漏輸出的區別
(1)?
4. GPIO 初始化流程(以STM32為例,描述GPIO初始化的步驟)
(1) 使能GPIO時鐘
① 作用:微控制器中外設(如GPIO)默認處于關閉狀態以節省功耗。時鐘信號是數字電路工作的基礎,必須開啟對應GPIO端口的時鐘,才能配置和使用其引腳。
② 操作實例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); # 使能GPIOA的時鐘
- RCC:Reset and Clock Control(復位與時鐘控制器),負責管理系統時鐘和外設時鐘。
- APB2:一種低速總線,連接GPIO、USART等外設。
- PeriphClockcmd:外設時鐘控制命令。
(2) 配置GPIO引腳參數(背誦)
① 關鍵參數:
- Pin:選擇具體的引腳(如GPIO_PIN_5)。
- Mode:設置引腳模式(輸入/輸出/復用/模擬)。
- Pull:配置上拉或下拉電阻(上拉、下拉、無上下拉)。
- Speed:輸出驅動速度(低速、中速、高速、超高速)。
(3) 調用 GPIO_Init() 生效
① 聲明結構體變量:
GPIO_InitTypeDef GPIO_InitStruct; # 創建結構體實例
② 填充配置參數:
# 示例:配置PA5為推挽輸出,高速,無上下拉
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pull = GPIO_PuPd_NOPULL;
③ 調用初始化函數:
GPIO_Init(GPIOA, &GPIO_InitStruct); # 應用配置到GPIOA端口
5. GPIO 必記函數
(1) 時鐘控制函數:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
示例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); # 開啟GPIOA的時鐘
(2) GPIO 初始化函數:
void GPIO_DeInit(GPIO_TypeDef* GPIOx); # 被指定的GPIO外設會被復位
void GPIO_AFIODeInit(); # 復位AFIO復用功能配置
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* InitStruct); # 配置GPIO引腳的工作模式、速度、上下拉等參數
void GPIO_StructInit(GPIO_InitTypeDef* InitStruct); # 把結構體變量賦值一個默認值
示例:
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_5; # 選擇PA5引腳
gpio.GPIO_Mode = GPIO_Mode_Out_PP; # 推挽輸出模式
gpio.GPIO_Speed = GPIO_Speed_50MHz; # 高速驅動
GPIO_Init(GPIOA, &gpio); # 應用配置到GPIOA
GPIO_DeInit(GPIOA); # 復位GPIOA所有寄存器的值
gpio.GPIO_Pin = GPIO_Pin_5; # 仍選擇PA5
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; # 浮空輸入模式
GPIO_Init(GPIOA, &gpio); # 重新初始化PA5
(3) 輸出控制類函數:
① GPIO_SetBits()
- 功能:將指定引腳設置為高電平(1)。
- 示例:點亮LED。
GPIO_SetBits(GPIOA, GPIO_Pin_5); # PA5輸出高電平
② GPIO_ResetBits()
- 功能:將指定引腳設置為低電平(0)。
- 示例:熄滅LED。
GPIO_ResetBits(GPIOA, GPIO_Pin_5); # PA5輸出低電平
③ GPIO_WriteBit()
- 功能:動態設置單個引腳電平(可替代SetBits/ResetBits)。
- 示例:根據條件設置電平。
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (condition ? Bit_SET : Bit_RESET));
(4) 輸入讀取類函數:
① GPIO_ReadInputDataBit()
- 功能:讀取單個引腳的電平狀態(輸入模式時使用)。
- 示例:檢測按鍵按下。
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {# 引腳PA0為低電平(按鍵按下)
}
② GPIO_ReadOutputDataBit()
- 功能:讀取輸出寄存器的狀態(輸出模式時使用)。
- 示例:檢測當前輸出值。
BitStatus pinState = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);
(5) 必須掌握的模式宏定義:
① GPIO_Mode_AIN 是模擬輸入。
② GPIO_Mode_IN_FLOATING 是浮空輸入。
③ GPIO_Mode_IPD 是下拉輸入。
④ GPIO_Mode_IPU 是上拉輸入。
⑤ GPIO_Mode_Out_OD 是開漏輸出。
⑥ GPIO_Mode_Out_PP 是推挽輸出。
⑦ GPIO_Mode_AF_OD 是復用開漏。
⑧ GPIO_Mode_AF_PP 是復用推挽。