首页/外设速查/GPIO
🔢

GPIO 通用输入输出

基础外设
芯片最基础的外设:每一个引脚可配置为输入、输出或复用功能,是所有外设的地基。
🧩 核心原理
📈 时序 / 工作过程图
GPIO 按键输入时序与消抖机械按键有抖动,需消抖后再作为有效电平KEY按下(抖动)稳定低电平释放(抖动)稳定高电平消抖方案:① 硬件RC滤波 ② 软件延时10-20ms再确认 ③ 定时器轮询+状态机输入模式:上拉(默认高)/下拉(默认低)/浮空 · 输出模式:推挽(强驱动)/开漏(需上拉)复用功能:GPIO 配置为 UART/SPI/I2C 等外设引脚(AF 映射)
⚙️ 配置 / 使用要点
  1. 使能 GPIO 外设时钟:__HAL_RCC_GPIOx_CLK_ENABLE()
  2. 初始化结构体:Pin/ Mode / Pull / Speed / Alternate
  3. 输出:HAL_GPIO_WritePin / TogglePin;输入:ReadPin
  4. 中断:配置 EXTI 模式 + NVIC 使能 + 回调函数
🛠️ 项目示例
按键检测 + LED 控制(STM32 HAL 风格)
// 按键 PE4 上拉输入,LED PB5 推挽输出
__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE();

GPIO_InitTypeDef gi = {0};
gi.Pin = GPIO_PIN_5; gi.Mode = GPIO_MODE_OUTPUT_PP; gi.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gi);

gi.Pin = GPIO_PIN_4; gi.Mode = GPIO_MODE_INPUT; gi.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOE, &gi);

while(1){
  if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET){  // 按下=低
    HAL_Delay(15);                                            // 软件消抖
    if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET)
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);                  // 翻转LED
  }
}
❓ 面试高频
推挽输出和开漏输出的区别?
推挽:输出级有 P/N 两个管,能主动输出高低电平,驱动强。开漏:只有下拉管,高电平靠外部上拉电阻,适合 I2C 线与、5V 电平转换
什么时候用上拉/下拉输入?
按键默认高(上拉)或默认低(下拉),防止浮空误判;总线空闲电平也靠上下拉固定
GPIO 速度选型原则?
低速信号选低速档,减小振铃和EMI;高速通信(SPI/并口)选高速档
怎么实现按键消抖?
硬件RC滤波或软件延时10-20ms二次确认,更优做法是定时器轮询+状态机,不阻塞主循环
✅ 自查清单 (点击勾选,本地保存)
0/0
能说出推挽vs开漏的电路本质
能配置输入/输出/复用三种模式
会做按键消抖(软/硬)
知道上拉下拉的作用
能说出GPIO速度档位影响