前言:
STM32 存在八大模式,分别如下:
- 推挽输出
- 开漏输出
- 复用推挽输出
- 复用开漏输出
- 浮空输入
- 上拉输入
- 下拉输入
- 模拟输入
STM32 标准 IO 结构图如下:

其中如下电路为保护电路,当大于 VDD-3.3~5v,保护二极管导通,电压被电源吸收,而当电压小于 vss-0v 时,由 GND 吸收,以此来达到保护芯片目的

寄存器就是程序和电路控制单元,我们编写的程序最终能控制电路,主要就是通过寄存器对功能电路开关来实现的

类似于我们常用的 HAL_GPIO_WritePin,内部代码如下

主要通过 BSRR 寄存器实现 GPIO 引脚状态的原子性设置
操作类型 | 代码逻辑 | 寄存器行为 | 电平结果 |
置位(高电平) | GPIOx->BSRR = GPIO_Pin | 向 BSRR 低 16 位写入引脚掩码,对应位置 1 | 引脚输出高电平 |
复位(低电平) | GPIOx->BSRR = GPIO_Pin << 16u | 向 BSRR 高 16 位写入引脚掩码,对应位置 1 | 引脚输出低电平 |
因此我们的代码主要就是通过控制寄存器的信息来控制单片机的功能
输出驱动器:
输出寄存器的电路图如下,主要是由输出控制,P-MOS 和 N -MOS 控制

通用推挽输出:
推挽输出的核心是 P -MOS 和 N -MOS 管始终处于互补的导通状态,一个导通时,另一个必定截止
其状态对应关系如下表所示:
目标输出电平 | “Output Control”逻辑 | P-MOS 管状态 | N-MOS 管状态 | 电流路径 (Drive Strength) |
高电平 (1) | 接收到 置位信号 (如 BSRR 低 16 位写 1) |
导通 (开关闭合) | 截止 (开关断开) | V_DD → P-MOS → 输出引脚 。电流从芯片 流出 , 主动驱动 输出为高电平。 |
低电平 (0) | 接收到 复位信号 (如 BSRR 高 16 位写 1) |
截止 (开关断开) | 导通 (开关闭合) | 输出引脚 → N-MOS → V_SS (地)。电流从引脚 流入 芯片,主动驱动 输出为低电平。 |
通用推挽输出 (Push-Pull) 特点:
- 强驱动能力:无论在高低电平时,都能主动提供或吸入可观的电流(例如±20mA),直接驱动 LED、蜂鸣器等器件。
- 低阻抗:输出电平稳定,抗干扰能力强。
- 经典应用:数字信号输出、驱动常见外设。
通用推挽输出 (GPIO_MODE_OUTPUT_PP)
- 电路:推挽结构。
- 控制:软件直接控制。
- 用途:最常见的输出模式,驱动 LED、按键扫描等。
推挽输出时小灯是由来自芯片内部的电压所驱动
通用开漏输出:
通用开漏输出 (Open-Drain) :
- 在开漏输出模式下,P-MOS 管是完全不工作的(始终截止),只有 N -MOS 管受控。当 N -MOS 截止时,输出引脚相当于断开(高阻态),需要外接上拉电阻到 VDD 才能输出高电平。
- 开漏应用:电平转换、I²C 等总线通信(可实现“线与”功能)
通用开漏输出 (GPIO_MODE_OUTPUT_OD)
- 电路:开漏结构。
- 控制:软件直接控制。
- 用途:软件模拟 I²C 协议、需要电平转换的普通 IO。
开漏输出没有驱动能力,必须由外部电压源来进行驱动
“推挽”和“开漏” 指的是电路结构,决定了引脚的电气特性(如何驱动电平)。
推挽输出和开漏输出的最大区别就是高电平下推挽输出为固定 3.3v,而开漏输出由外部电路决定,因为开漏输出不会控制 P -MOS 的状态
复用推挽输出:
复用推挽输出 (GPIO_MODE_AF_PP)
- 电路:推挽结构。
- 控制:硬件外设自动控制。
- 用途:SPI 的 SCK/MOSI/MISO 引脚、USART 的 TX 引脚等。这些协议需要强驱动、高速的推挽输出。
复用开漏输出:
复用开漏输出 (GPIO_MODE_AF_OD)
- 电路:开漏结构。
- 控制:硬件外设自动控制。
- 用途:I²C 的 SDA 和 SCL 引脚。这是 I²C 总线标准所要求的,以实现多主设备的“线与”功能
“通用”和“复用” 指的是信号来源,决定了引脚由谁控制(软件还是硬件外设)
如何使用何种通信协议,取决于必须选择哪种“复用”模式及其对应的电路结构。例如,I²C 必须配“复用开漏”,SPI 必须配“复用推挽”。
输入驱动器:

输入驱动器主要由上拉,下拉电阻和 TTL 肖特基触发器组成

TTL 肖特基触发器主要用于稳定电平,因为外部输入的电压了能不太稳定,不会稳定的在 3.3v 和 0v 来区别高低电平,因此 TTL 肖特基触发器会产生两个参考电压,分别为高参考电压和低参考电压,当高于高参考电压则输出高电平,低于地参考电压输出低电平,在两者之间不改变电平信号

输出存在三个分支,从上到下依次是模拟输入,复用功能输入和读取
其中模拟输入是在进入 TTL 肖特基触发器前,主要是为了读取准确的电压值

浮空输入:
浮空输入就是不启用内部的上拉和下拉电阻,仅读取 I / O 引脚的电压
浮空输入(Floating Input)
- 原理:内部完全断开上拉 / 下拉电阻,引脚呈高阻态,电平完全由外部电路决定。
- 特点:
- 悬空时电平随机:0.3–0.7VDD 间波动,可能导致逻辑误判。
- 高信号保真度:无内部电阻干扰,适合 μV 级微弱信号(如压电传感器)。
- 必须外接驱动:否则易受静电损坏或噪声干扰。
- 应用场景:
- 高速数字信号接收(UART_RX、CAN 总线)。
- 高精度 ADC 前级信号采集(需外接低阻抗源)。
上拉输入:
上拉输入(Pull-Up Input)
- 原理:内部电阻连接 VDD,默认拉高引脚电平。
- 特点:
- 默认高电平:悬空时读数为“1”,外部接地时读“0”。
- 简化电路设计:无需外接上拉电阻(如按键直接接地)。
- 静态功耗问题:3.3V 时约 82μA 电流,电池供电需谨慎。
- 应用场景:
- 机械按键检测(按键按下拉低电平)。
- I²C 总线的电平保持(配合开漏输出)。
下拉输入:
下拉输入(Pull-Down Input)
- 原理:内部电阻连接 GND,默认拉低引脚电平。
- 特点:
- 默认低电平:悬空时读数为“0”,外部接 VDD 时读“1”。
- 抗电源干扰强:适合安全监控(异常时触发高电平)。
- 应用场景:
- 霍尔传感器(常态低电平,磁触发高电平)。
- 直流电源接入检测(默认无电状态为低电平)。
模拟输入(Analog Input)
模拟输入:
- 原理:禁用数字电路(施密特触发器、上 / 下拉电阻),信号直通 ADC 模块。
- 特点:
- 无数字电平:无法通过 IDR 寄存器读取引脚状态。
- 高精度要求:需阻抗匹配(12 位 ADC 建议信号源阻抗 <1kΩ)。
- 抗干扰设计:需外接滤波电容 / π 型滤波器抑制噪声。
- 应用场景:
- ADC 采集模拟信号(温度、压力、电压)。
- 低功耗模式下传感器信号直采(如热电偶)。
输入总结:
特性 | 浮空输入 | 上拉输入 | 下拉输入 | 模拟输入 |
内部结构 | 无上拉 / 下拉电阻,高阻抗(>100MΩ) | 内部上拉电阻(约 40kΩ)连接 VDD | 内部下拉电阻(约 40kΩ)连接 GND | 禁用数字电路,直连 ADC 模块 |
默认电平 | 不确定(悬空时随机波动) | 高电平(1) | 低电平(0) | 无数字电平,仅传输模拟信号 |
外部驱动要求 | 必须外接低阻抗驱动源(<10kΩ) | 可悬空,默认高电平 | 可悬空,默认低电平 | 需匹配传感器阻抗(如 ADC 需 <1kΩ) |
响应速度 | 极快(<5ns) | 较慢(约 200ns,受 RC 延迟影响) | 较慢(约 200ns) | 依赖 ADC 采样率(如 μs 级) |
功耗 | 超低(静态电流≈0.1μA) | 较高(3.3V 时约 82μA) | 较高(类似上拉) | 低(仅 ADC 工作时耗电) |
抗干扰能力 | 极弱(易受噪声影响) | 较强(默认电平稳定) | 较强(默认电平稳定) | 依赖外部滤波电路 |
典型应用场景 | 高速通信(UART/CAN)、高精度传感器 | 按键检测、I²C 总线、唤醒电路 | 光敏传感器、安全开关、低电平触发 | ADC 采集(温度、压力、电压信号) |
输入模式选择:
- 需要高精度模拟采集 → 模拟输入(如 ADC)。
- 外部信号明确且需默认状态 → 上拉 / 下拉输入(如按键、传感器)。
- 高速或微弱信号处理 → 浮空输入 + 外部驱动(如 UART、精密传感器)。
- 省电场景:优先浮空或模拟输入(静态功耗最低)