STM32 GPIO 基础 & 高级用法
GPIO(通用输入输出)是 STM32 最基础的功能,掌握 GPIO 控制是开发 STM32 应用的第一步。本指南涵盖 GPIO 基础知识 和 高级用法,包括 GPIO 模式、寄存器操作、高速 IO、外部中断、PWM 和低功耗配置。
1. GPIO 基础
1.1 GPIO 引脚模式
STM32 GPIO 可配置以下模式:
模式 | 描述 | 应用 |
---|---|---|
输入模式(Input) | 仅用于读取电平 | 按键输入 |
输出模式(Output) | 推挽/开漏输出高低电平 | LED 控制、电机驱动 |
复用功能(AF - Alternate Function) | GPIO 作为外设功能 | UART、SPI、I2C、PWM |
模拟模式(Analog) | 关闭数字功能,减少功耗 | ADC、DAC |
1.2 GPIO 上拉/下拉电阻
- 上拉(Pull-Up):默认 高电平(接 VCC),适用于开关按键
- 下拉(Pull-Down):默认 低电平(接 GND),适用于信号输入
示例:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // PA0 置高
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // PA0 置低
2. STM32 GPIO 基础用法
2.1 STM32CubeMX 配置 GPIO
📌 配置步骤
- 打开 STM32CubeMX,选择 STM32 型号
- 进入 Pinout & Configuration 选择 GPIO 引脚
- 选择 模式(Input / Output / AF / Analog)
- 生成代码
📌 代码示例
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能 GPIOA 时钟
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
2.2 GPIO 输出控制
📌 点亮 LED
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 置高(熄灭)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 置低(点亮)
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 翻转状态
📌 多个 GPIO 同时输出
GPIOA->ODR = 0xFFFF; // 使所有 GPIOA 置高
GPIOA->ODR &= ~(1 << 5); // 仅 PA5 置低
2.3 GPIO 输入(按键检测)
📌 轮询方式读取按键
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { // 按键按下
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(50); // 消抖
}
📌 外部中断(EXTI)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_0) {
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}
3. 高级 GPIO 用法
3.1 GPIO 直接操作寄存器
📌 读写 GPIO
GPIOA->BSRR = GPIO_PIN_5; // 置高 PA5
GPIOA->BSRR = (uint32_t)GPIO_PIN_5 << 16; // 置低 PA5
📌 速度对比:
方法 | 速度 |
---|---|
HAL_GPIO_WritePin() |
慢 |
GPIOx->BSRR |
快 |
3.2 高速 IO(GPIO Speed)
模式 | 速度 | 应用 |
---|---|---|
GPIO_SPEED_FREQ_LOW | 2 MHz | 普通 LED |
GPIO_SPEED_FREQ_MEDIUM | 10 MHz | 一般外设 |
GPIO_SPEED_FREQ_HIGH | 50 MHz | SPI、PWM |
示例:
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速模式
3.3 PWM 控制 GPIO
PWM 主要用于 LED 调光、舵机控制、音频信号输出。
📌 配置步骤
- STM32CubeMX 将 GPIO 设置为 TIMx_CHx 复用功能
- 配置定时器 PWM 模式
- 生成代码,使用
HAL_TIM_PWM_Start()
📌 代码示例
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 启动 PWM
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 50); // 设置占空比 50%
3.4 GPIO 低功耗优化
在 低功耗模式 下,可以 关闭 GPIO 时钟 或 将未使用的 GPIO 设为模拟模式 以降低功耗。
📌 配置未使用 GPIO 为模拟模式
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
📌 进入低功耗模式
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
📌 按键中断可唤醒 STM32
4. 总结
✅ GPIO 是 STM32 开发的基础,掌握输入、输出、复用、PWM 是关键
✅ 寄存器操作速度更快,适用于高性能应用
✅ GPIO 可结合外部中断、PWM 进行更多高级控制
✅ 低功耗应用应将未使用的 GPIO 设为模拟模式
📌 建议新手从点亮 LED、按键输入开始,逐步学习高级 GPIO 操作! 🚀