1.1: STM32外设-GPIO
本教程适用于 STM32 系列芯片(如 STM32F1、F4 等),以标准外设库或 HAL 库为基础,讲解如何配置和使用 GPIO(通用输入输出)。
目录
简介
GPIO(General Purpose Input/Output)是 STM32 最基本的外设之一,允许 MCU 与外部设备进行通信,如 LED、按键、继电器等。
GPIO 工作模式
STM32 的 GPIO 引脚支持以下几种模式:
- 输入模式(Input):
- 浮空输入
- 上拉/下拉输入
- 输出模式(Output):
- 推挽输出(Push-pull)
- 开漏输出(Open-drain)
- 复用功能(AF)
- 模拟模式(Analog)
使用步骤
1. 时钟使能
每个 GPIO 端口都需要手动开启时钟。例如:
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能 GPIOA 时钟
2. GPIO 初始化
使用 HAL 库进行初始化示例:
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
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);
3. GPIO 输入输出操作
输出高/低电平:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 输出高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 输出低电平
读取输入电平:
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
实战示例
使用 HAL 点亮 LED
假设 LED 接在 PA5:
void LED_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
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);
}
void LED_On(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}
void LED_Off(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}
读取按键状态
假设按键接在 PC13:
void Key_Init(void) {
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
uint8_t Key_Read(void) {
return HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET;
}
小贴士
- 上拉/下拉电阻选择要根据外部电路情况。
- 输入引脚建议不要浮空。
- 推挽模式适合驱动 LED 等;开漏模式适合用于多路共线设备(如 I2C)。
- 有些 IO 引脚默认是 JTAG/SWD 功能,需要在启动时复用为 GPIO。
参考资料
- STM32 官方参考手册(RM)
- [STM32 HAL 库用户手册]
- 《正点原子 STM32 教程》
- CubeMX 工具生成代码示例