【STM32】GPIO的输入输出
GPIO是通用的输入输出接口,可配置8种输入模式,输出模式下可控制端口输出高低电平,用于点亮LED、控制蜂鸣器、模拟通信协议等;输入模式下可以读取端口的高低电平或者电压,用于读取按键、外接模块的电平信号、ADC的电压采集等。
一、GPIO的输出
当GPIO引脚被配置为输出模式时,其核心目的是由MUC主动控制引脚的电平状态(高电平VDD或低电平VSS/GND),从而驱动外部电路或者信号其他设备。
GPIO输出模式的主要特点
1.可配置的输出类型:
推挽输出:引脚内部包含一个 PMOS(上管)和一个 NMOS(下管)晶体管。当输出高电平 时,PMOS 导通,NMOS 截止,引脚连接到 VDD
。当输出低电平时,PMOS 截止,NMOS 导通,引脚连接到VSS。
- 特点:有较强的驱动能力,不依赖外部电路,输出的高低电平比较准确。
开漏输出:引脚内部仅包含一个 NMOS(下管)晶体管。当输出低电平时,NMOS 导通,引脚连接到VSS。当输出高电平时,NMOS 截止,引脚处于高阻态(相当于断开)。
- 特点:依赖上拉,电平转换,驱动能力较弱(高电平)。
2.可配置的输出速度:
STM32允许为输出引脚配置不同的压摆率。这决定了引脚电平从低到高或从高到低切换的速度。
一般通常分为低速、中速、高速、超高速。
低速:最低功耗、最低噪声。一般适用于不频繁切换的引脚(如LED指示灯、控制使能信号)。
中速:平衡功耗、噪声和速度。
高速:最快的切换速度。一般适用于需要高频切换的引脚(如SPI、USART时钟线、PWM输出)。
超高速:在部分高性能型号上提供,速度最快。
3.输出数据寄存器
ODR:直接控制引脚输出电平。
- 写1到对应的ODR位:输出高电平(在推完模式下)使输出管截止(在开漏模式下,需外部上拉才能呈现高电平)。
- 写0到对应的ODR位:输出低电平(在推挽和开漏模式下都使输出管导通拉低)。
BSRR: 位设置/复位寄存器。这是一个更高效、更常用的操作 ODR 的方式,特别适合原子操作(避免读-修改-写操作在多任务环境中的竞争条件)。
BSRR的低 16 位:写1将对应的 ODR 位置1(输出高/开漏截止)。
BSRR的高 16 位:写1将对应的 ODR 位置0(输出低/开漏导通)。
写0到BSRR的任何位无效果。这允许只改变需要改变的位而不影响其他位。
4.可选的内部上拉/下拉电阻
即使在输出模式下,也可以选择启用内部的上拉或下拉电阻。
主要用途:
在MCU刚启动或者复位后、GPIO 配置完成前,内部上拉/下拉可以提供一个确定的初始电平,防止引脚悬空导致的不确定状态。
二、如何配置 GPIO 为输出模式
1.使能GPIO端口时钟:
在RCC寄存器中使能对应GPIO端口(GPIOA,GPIOB)的时钟。这是必要的!
2.配置引脚模式:
在GPIOx_MODER寄存器中寄存器中将对应引脚的模式位设置为01(输出模式)。
3.配置输出类型:
在 GPIOx_OTYPER 寄存器中设置对应引脚的输出类型位:
- 0 = 推挽输出
- 1 = 开漏输出
4.配置输出速度:
在 GPIOx_OSPEEDR 寄存器中设置对应引脚的速度位(选择低速、中速、高速或超高速)。
5.(可选)配置上拉/下拉:
在 GPIOx_PUPDR 寄存器中设置对应引脚的上拉/下拉位:
00 = 无上拉下拉
01
= 上拉10
= 下拉11
= 保留 (通常不用)
6.设置初始输出电平:
通过 GPIOx_ODR 或更推荐使用 GPIOx_BSRR 寄存器设置引脚初始输出状态(高或低)。
GPIO的输出总结
STM32 的 GPIO 输出功能强大且灵活。理解 推挽 和 开漏 两种输出类型的原理、特点和应用场景是核心。合理配置 输出速度 和 上拉/下拉 电阻对于优化性能、降低功耗和噪声至关重要。熟练掌握通过 ODR 和 BSRR 寄存器(或库函数)控制引脚电平是实际编程的基础。始终牢记引脚的 电气特性限制(电压、电流)是安全可靠设计的前提。
三、GPIO的输入
当 GPIO 引脚被配置为输入模式时,其核心目的是由 MCU 读取引脚上来自外部电路的电平状态(高电平VDD或低电平VSS/GND)。MCU 不会主动驱动该引脚的电平,而是检测外部施加在引脚上的电压。
GPIO 输入模式的主要特点
1.高输入阻抗:
- 配置为输入模式的 GPIO 引脚呈现非常高的输入阻抗(通常在兆欧姆级别)。这意味着从外部电路汲取的电流非常微小(通常在微安级别)。
优点: 不会显著加载(影响)外部信号源,适合读取传感器信号、按键状态等微弱或高阻抗信号。
2.可配置的输入特性:
STM32 为输入引脚提供了三种主要的配置选项,用于确定引脚在无外部驱动信号时的默认状态或抗干扰能力:
浮空输入:内部既不上拉也不下拉。引脚完全“悬空”。
上拉输入:在引脚和VDD之间内部连接一个电阻(典型值 30KΩ - 50KΩ)。
下拉输入:在引脚和VSS之间内部连接一个电阻(典型值 30KΩ - 50KΩ)。
3.施密特触发器:
所有 STM32 GPIO 输入引脚都包含施密特触发器。
作用: 对输入信号进行整形。
4.输入数据寄存器
IDR: 输入数据寄存器。这是读取引脚当前电平状态的地方。
读取IDR寄存器中对应引脚的位:
0
= 检测到低电平 (引脚电压 < V_IL)1
= 检测到高电平 (引脚电压 > V_IH)
四、如何配置GPIO为输入模式
使能 GPIO 端口时钟: 在 RCC 寄存器中使能对应 GPIO 端口(如 GPIOA, GPIOB)的时钟。必须步骤!
配置引脚模式: 在 GPIOx_MODER 寄存器中将对应引脚的模式位设置为
00
(输入模式)。配置上拉/下拉: 在 GPIOx_PUPDR 寄存器中设置对应引脚的上拉/下拉位:
00
= 浮空输入 (无上拉下拉 - 慎用)01
= 上拉输入10
= 下拉输入11
= 保留 (通常不用)
(可选) 配置模拟模式: 如果该引脚将用作 ADC、DAC 或 Comparator 的输入,除了将 MODER 设置为模拟模式 (11
),通常也要求 PUPDR 配置为无上拉下拉 (00
)。模拟模式会禁用施密特触发器和数字输入路径。
//直接读取 IDR 寄存器
if (GPIOA->IDR & GPIO_IDR_ID0) { // 检查 PA0 对应位 (IDR bit0) 是否为 1// PA0 为高电平 (按键松开)
} else {// PA0 为低电平 (按键按下)
}
一般适用场景:
按键/开关检测:上拉输入 + 按键接地:松开=高电平,按下=低电平。下拉输入 + 按键接 VDD
:松开=低电平,按下=高电平。
数字传感器读取:读取数字传感器(如数字温度传感器 DS18B20 - 需单总线协议、PIR 运动传感器、霍尔开关)的输出信号。
接收数字信号:
通信接口:UART RX, SPI MISO, I2C SDA (作为从机接收时), CAN RX 等。这些复用功能通常会自动或要求配置相应的输入模式(浮空或上拉取决于协议)。
外部中断源:配置为输入是使用外部中断/事件控制器 (EXTI) 的前提条件。
数字状态监控:读取外部设备的状态信号(如就绪READY、忙BUSY、错误ERROR等)。
模拟信号采集 (ADC/DAC/COMP):当引脚配置为模拟输入模式时,它本质上是输入模式的一个特例(MODER=11, PUPDR=00),信号直接连接到 ADC 转换器、比较器或其他模拟外设,绕过施密特触发器和数字输入路径。
电平检测/监控: 监控电源状态、外部逻辑电平等。
注意事项
1、避免浮空输入: 这是导致不稳定、误触发、额外功耗的最常见原因之一。除非外部电路保证提供确定驱动(如推挽输出信号)或用于模拟输入,否则务必启用内部上拉或下拉电阻!
2、输入阻抗与信号源驱动能力: 虽然输入阻抗很高,但如果信号源阻抗也很大(如长线、高阻抗传感器),信号上升/下降时间会变慢,可能影响高速信号识别或增加噪声敏感性。必要时可考虑缓冲器(如跟随器)。
3、复用功能: 当引脚用作通信接口 (UART, SPI, I2C, CAN 等) 的输入或外部中断 (EXTI) 时,输入模式(浮空、上拉)的配置需遵循外设或中断的要求。参考参考手册和外设章节。
GPIO的输入总结
STM32 的 GPIO 输入模式是感知外部数字世界的关键。核心在于理解浮空、上拉、下拉三种配置的区别与应用场景(上拉下拉是稳定性的保障),掌握施密特触发器的抗噪作用,以及严格遵守电压限制(特别是 5V Tolerant)。通过读取 IDR 寄存器可以获取引脚状态。按键检测可以很好的理解输入模式原理和实践。一定要避免浮空输入和注意电压兼容性是设计可靠系统的关键原则。