GPIO 基础 & 高级用法

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

📌 配置步骤

  1. 打开 STM32CubeMX,选择 STM32 型号
  2. 进入 Pinout & Configuration 选择 GPIO 引脚
  3. 选择 模式(Input / Output / AF / Analog)
  4. 生成代码

📌 代码示例

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 调光、舵机控制、音频信号输出

📌 配置步骤

  1. STM32CubeMX 将 GPIO 设置为 TIMx_CHx 复用功能
  2. 配置定时器 PWM 模式
  3. 生成代码,使用 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 操作! 🚀

评论
列表