GPIO介绍
一、 什么是GPIO?
- GPIO是通用输入输出端口(General-purpose input/output)的英文简写,是所有的微控制器必不可少的外设之一,可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功能。
- GPIO口可配置为多种输入输出模式,如输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、开漏复用功能、推挽式输出以及推挽式复用功能等。
- STM32单片机的GPIO被分为很多组,每组最多有16个引脚,不同型号的 MCU 的GPIO个数是不同的。
- 引脚电平:0V~3.3V,部分引脚可容忍5V。
二、 GPIO内部结构
三、GPIO工作模式
GPIO的工作模式决定了引脚的功能和电气特性,常见模式包括:
- 输入模式
- 浮空输入:引脚无上下拉,电平由外部信号决定(如按键检测)。
- 上拉输入:内部上拉电阻使引脚默认高电平,适用于检测低电平信号(如按键按下)。
- 下拉输入:内部下拉电阻使引脚默认低电平,适用于检测高电平信号。
- 模拟输入:引脚连接ADC,用于模拟信号采集(如温度传感器)。
- 输出模式
- 推挽输出:输出高电平时驱动高电平,低电平时驱动低电平,可以输出高、低两种。电平适用于驱动LED、继电器等。
- 开漏输出:输出高电平时为高阻态,低电平时驱动低电平,因此只能输出低电平。常用于总线通信(如I2C)或电平转换。
- 复用功能输出:引脚被配置为特定外设功能(如UART、SPI的TX/RX)。
- 其他模式
- 复用功能输入:引脚作为外设输入(如编码器接口)。
- 事件触发模式:引脚电平变化触发中断或DMA请求(如外部中断)。
四、GPIO寄存器(以STM32为例)
STM32的GPIO通过寄存器组配置,主要寄存器包括:
CRL/CRH(配置低/高寄存器)
- 功能:配置引脚模式(输入/输出/复用/模拟)和输出类型(推挽/开漏)。
- 结构:每4位控制一个引脚(MODE[1:0] + CNF[1:0])。
IDR(输入数据寄存器)
- 功能:读取引脚当前电平状态(只读)。
ODR(输出数据寄存器)
- 功能:设置引脚输出电平(可读可写)。
BSRR/BRR(位设置/清除寄存器)
- 功能:原子操作设置/清除引脚电平(避免读-修改-写风险)。
LCKR(锁定寄存器)
- 功能:锁定引脚配置(防止误修改)。
五、GPIO库函数(以STM32 HAL库为例)
HAL库封装了寄存器操作,提供更易用的接口:
初始化函数
HAL_GPIO_Init()
:配置引脚模式、速度、上下拉等。- 示例:配置PA5为推挽输出,上拉,高速:
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
读写函数
HAL_GPIO_WritePin()
:设置引脚电平。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 高电平
HAL_GPIO_ReadPin()
:读取引脚电平。
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
HAL_GPIO_TogglePin()
:翻转引脚电平。
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
中断函数
HAL_GPIO_EXTI_IRQHandler()
:处理外部中断。- 回调函数:用户需实现
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
处理中断。
复用功能配置
- 通过
GPIO_InitStruct.Alternate
字段配置复用功能(如UART_TX对应AF7)。
六、关键区别与选择
维度 | 寄存器操作 | 库函数操作 |
---|---|---|
速度 | 快(直接操作硬件) | 慢(函数调用开销) |
可移植性 | 差(依赖具体芯片) | 好(跨系列兼容) |
开发效率 | 低(需手动计算寄存器位) | 高(结构化配置) |
适用场景 | 底层驱动、高性能需求 | 快速原型开发、应用层代码 |