【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 输出功能强大且灵活。理解 推挽开漏 两种输出类型的原理、特点和应用场景是核心。合理配置 输出速度上拉/下拉 电阻对于优化性能、降低功耗和噪声至关重要。熟练掌握通过 ODRBSRR 寄存器(或库函数)控制引脚电平是实际编程的基础。始终牢记引脚的 电气特性限制(电压、电流)是安全可靠设计的前提。

三、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为输入模式

  1. 使能 GPIO 端口时钟: 在 RCC 寄存器中使能对应 GPIO 端口(如 GPIOA, GPIOB)的时钟。必须步骤!

  2. 配置引脚模式: 在 GPIOx_MODER 寄存器中将对应引脚的模式位设置为 00 (输入模式)。

  3. 配置上拉/下拉: 在 GPIOx_PUPDR 寄存器中设置对应引脚的上拉/下拉位:

  • 00 = 浮空输入 (无上拉下拉 - 慎用)

  • 01 = 上拉输入

  • 10 = 下拉输入

  • 11 = 保留 (通常不用)

(可选) 配置模拟模式: 如果该引脚将用作 ADC、DAC 或 Comparator 的输入,除了将 MODER 设置为模拟模式 (11),通常也要求 PUPDR 配置为无上拉下拉 (00)。模拟模式会禁用施密特触发器和数字输入路径。

cpp 复制代码
//直接读取 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 寄存器可以获取引脚状态。按键检测 可以很好的理解输入模式原理和实践。一定要避免浮空输入注意电压兼容性是设计可靠系统的关键原则。

相关推荐
tingshuo291712 小时前
D006 【模板】并查集
笔记
tingshuo29171 天前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
RuoZoe2 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
祈安_5 天前
C语言内存函数
c语言·后端
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
norlan_jame7 天前
C-PHY与D-PHY差异
c语言·开发语言
czy87874757 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
starlaky7 天前
Django入门笔记
笔记·django
勇气要爆发7 天前
吴恩达《LangChain LLM 应用开发精读笔记》1-Introduction_介绍
笔记·langchain·吴恩达
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习