理解 GPIO 的工作原理和配置方法是掌握 STM32 开发的基础,后续的外设(如定时器、ADC、通信接口)都依赖于 GPIO 的正确配置。
目录
一、GPIO 的基本概念
二、GPIO 的主要功能
三、GPIO 的内部结构
四、GPIO 的工作模式
1. 输入模式
2. 输出模式
3. 复用功能模式
4. 模拟模式
五、GPIO 的配置寄存器
六、GPIO 的配置步骤(以点亮 LED 为例)
1. 使能 GPIO 时钟
2. 配置 GPIO 模式
3. 控制电平
七、GPIO 的应用场景
八、注意事项
九、总结
一、GPIO 的基本概念
GPIO(General Purpose Input/Output,通用输入输出)是 STM32 微控制器上的一种多功能引脚,可以通过软件配置为输入或输出模式,用于与外部设备进行数字信号交互。每个 GPIO 引脚都可以独立配置,支持多种工作模式和功能。
二、GPIO 的主要功能
-
数字输入:读取外部信号的电平状态(高电平或低电平)。
-
数字输出:控制引脚输出高电平或低电平。
-
复用功能:将引脚配置为特殊功能(如串口、SPI、I2C 等)。
-
模拟功能:将引脚配置为模拟输入(用于 ADC)或模拟输出(用于 DAC)。
三、GPIO 的内部结构
STM32 的 GPIO 内部结构较为复杂,但可以简化为以下几个关键部分:
-
输入驱动器:
-
通过施密特触发器将外部信号转换为数字信号(0 或 1)。
-
支持上拉/下拉电阻,用于稳定电平。
-
-
输出驱动器:
-
推挽输出:通过 PMOS 和 NMOS 管实现高电平和低电平输出。
-
开漏输出:仅通过 NMOS 管实现低电平输出,高电平需要外部上拉电阻。
-
-
复用功能选择器:
-
将引脚连接到内部外设(如 USART、SPI 等)。
-
-
模拟开关:
-
将引脚连接到 ADC 或 DAC。
-
四、GPIO 的工作模式
STM32 的 GPIO 支持多种工作模式,具体如下:
1. 输入模式
-
浮空输入(Floating Input):
-
引脚电平完全由外部电路决定,内部无上拉/下拉电阻。
-
适用于外部电路已提供明确电平的场景。
-
-
上拉输入(Pull-up Input):
-
内部通过上拉电阻连接到 VDD,默认电平为高。
-
适用于按键检测等场景。
-
-
下拉输入(Pull-down Input):
-
内部通过下拉电阻连接到 GND,默认电平为低。
-
适用于按键检测等场景。
-
2. 输出模式
-
推挽输出(Push-Pull Output):
-
可以主动输出高电平或低电平,驱动能力强。
-
适用于驱动 LED、继电器等。
-
-
开漏输出(Open-Drain Output):
-
只能输出低电平或“悬空”,高电平需要外部上拉电阻。
-
适用于 I2C 等总线通信。
-
3. 复用功能模式
-
将引脚连接到内部外设(如 USART、SPI、I2C 等)。
-
需要同时配置 GPIO 和外设寄存器。
4. 模拟模式
-
模拟输入:将引脚连接到 ADC,用于读取模拟信号。
-
模拟输出:将引脚连接到 DAC,用于输出模拟信号。
五、GPIO 的配置寄存器
STM32 的 GPIO 配置通过以下寄存器实现:
-
GPIO 模式寄存器(GPIOx_MODER):
-
配置引脚为输入、输出、复用或模拟模式。
-
-
GPIO 输出类型寄存器(GPIOx_OTYPER):
-
配置输出模式为推挽或开漏。
-
-
GPIO 输出速度寄存器(GPIOx_OSPEEDR):
-
配置输出速度(低速、中速、高速、超高速)。
-
-
GPIO 上拉/下拉寄存器(GPIOx_PUPDR):
-
配置上拉、下拉或浮空输入。
-
-
GPIO 输入数据寄存器(GPIOx_IDR):
-
读取引脚的电平状态。
-
-
GPIO 输出数据寄存器(GPIOx_ODR):
-
设置引脚的输出电平。
-
-
GPIO 置位/复位寄存器(GPIOx_BSRR):
-
原子操作,用于设置或清除引脚电平。
-
-
GPIO 复用功能寄存器(GPIOx_AFRH/GPIOx_AFRL):
-
配置引脚的复用功能。
-
六、GPIO 的配置步骤(以点亮 LED 为例)
假设使用 PA5 引脚控制 LED,步骤如下:
1. 使能 GPIO 时钟
STM32 的外设需要先开启时钟才能使用:
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能 GPIOA 的时钟
2. 配置 GPIO 模式
将 PA5 设置为推挽输出:
GPIOA->MODER &= ~GPIO_MODER_MODER5; // 清除原有模式
GPIOA->MODER |= GPIO_MODER_MODER5_0; // 设置为输出模式(01)
GPIOA->OTYPER &= ~GPIO_OTYPER_OT5; // 推挽输出(0)
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5; // 设置输出速度
3. 控制电平
GPIOA->BSRR = GPIO_BSRR_BS5; // 输出高电平(点亮 LED)
GPIOA->BSRR = GPIO_BSRR_BR5; // 输出低电平(熄灭 LED)
七、GPIO 的应用场景
-
输出模式:
-
控制 LED、蜂鸣器、继电器等。
-
驱动数码管、LCD 屏幕。
-
-
输入模式:
-
检测按键、开关状态。
-
接收传感器数字信号(如红外避障)。
-
-
复用功能:
-
作为串口(UART)、SPI、I2C 的通信引脚。
-
连接 PWM 输出(控制电机速度)。
-
-
模拟功能:
-
读取模拟信号(如温度传感器)。
-
输出模拟信号(如音频信号)。
-
八、注意事项
-
电平兼容:
-
STM32 的 GPIO 是 3.3V 电平,直接连接 5V 设备可能损坏芯片。
-
-
驱动能力:
-
单个 GPIO 的电流有限(如 20mA),驱动大功率设备需加三极管或 MOSFET。
-
-
复用功能:
-
使用特殊功能(如串口)时,需同时配置外设和 GPIO。
-
-
引脚锁定:
-
某些引脚可能被默认配置为特殊功能(如 JTAG),需手动释放。
-
九、总结
STM32 的 GPIO 是其与外部世界交互的核心接口,通过灵活配置可以实现多种功能:
-
输入模式:读取外部信号。
-
输出模式:控制外部设备。
-
复用功能:实现复杂通信协议。
-
模拟功能:处理模拟信号。