当前位置: 首页 > news >正文

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

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

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

  3. 配置上拉/下拉: 在 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 寄存器可以获取引脚状态。按键检测可以很好的理解输入模式原理和实践。一定要避免浮空输入注意电压兼容性是设计可靠系统的关键原则。

http://www.dtcms.com/a/314206.html

相关文章:

  • 正点原子STM32MP257开发板移植ubuntu24.04根文件系统(带桌面版)
  • Android的UI View是如何最终绘制成一帧显示在手机屏幕上?
  • Android Espresso 测试框架深度解析:从入门到精通
  • imx6ull-驱动开发篇8——设备树常用 OF 操作函数
  • 力扣热题100——哈希表
  • 大模型×垂直领域:预算、时间、空间三重夹击下的生存法则
  • 基于ensp的防火墙安全策略及认证策略综合实验
  • Flink CDC 介绍
  • PHP-分支语句、while循环、for循环
  • 深入理解Spring中的循环依赖及解决方案
  • 鸿蒙南向开发 编写一个简单子系统
  • 机器学习——学习路线
  • MySQL进阶:(第八篇)深入解析InnoDB存储架构
  • 高效洗牌:Fisher-Yates算法详解
  • 软考 系统架构设计师系列知识点之杂项集萃(118)
  • 直播 app 系统架构分析
  • 如何在 Ubuntu 24.04 LTS 上安装 Docker
  • 计算机网络:
  • 团购商城 app 系统架构分析
  • (五)系统可靠性设计
  • android TextView lineHeight 是什么 ?
  • 国产化低代码平台如何筑牢企业数字化安全底座
  • 学习日志27 python
  • 远程机器操作--学习系列004
  • Vue Router快速入门
  • 数据从mysql迁移到postgresql
  • Petalinux快捷下载
  • 项目一:Python实现PDF增删改查编辑保存功能的全栈解决方案
  • WPF 按钮背景色渐变
  • LLM开发——基于Graph RAG知识图谱检索增强生成