STM32 GPIO 输入输出

发表时间:2026-06-17  |  分类:STM32 开发

GPIO 简介

GPIO(General Purpose Input Output)是微控制器最基础的外设。STM32 的每个 IO 口可以配置为输入、输出、复用、模拟四种模式。

工作模式

模式说明应用场景
浮空输入电平由外部决定,内部无上下拉按键检测(外部上拉)
上拉输入内部电阻拉到 VDD按键检测(默认高电平)
下拉输入内部电阻拉到 GND检测高电平信号
推挽输出可输出高低电平驱动 LED、蜂鸣器
开漏输出只能输出低电平或高阻I2C 总线

寄存器操作

每个 GPIO 端口由 7 个 32 位寄存器控制,了解寄存器有助于深入理解 STM32 的工作机制:

// 点亮 PA5 上的 LED(寄存器方式)
RCC->AHB1ENR |= 1 << 0;           // 1. 使能 GPIOA 时钟
GPIOA->MODER &= ~(3 << (5*2));     // 2. 清除 PA5 模式
GPIOA->MODER |= 1 << (5*2);       // 3. 设置为输出模式
GPIOA->ODR |= 1 << 5;             // 4. PA5 输出高电平,点亮 LED

HAL 库操作

实际开发中更多使用 HAL 库,代码可读性更好:

// 点亮 PA5 上的 LED(HAL 库方式)
__HAL_RCC_GPIOA_CLK_ENABLE();     // 1. 使能时钟

GPIO_InitTypeDef gpio = {0};
gpio.Pin = GPIO_PIN_5;
gpio.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &gpio);       // 2. 初始化

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);  // 3. 点亮

按键输入

配置 GPIO 为输入模式,读取引脚电平判断按键状态。实际项目中需要做消抖处理。

// 读取按键状态(PA0 接按键,按下为低电平)
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
    HAL_Delay(20);  // 简单延时消抖
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);  // 翻转 LED
        while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET); // 等待释放
    }
}
提示:延时消抖在简单项目中够用,复杂项目建议用定时器中断消抖或状态机方式,避免阻塞主循环。

速度配置

GPIO 输出速度有低速、中速、高速、超高速四档。速度越高功耗越大、EMI 越严重。一般情况下:LED 用低速,SPI 用高速。