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 用高速。