前言:
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、精密传感器)。
- 省电场景:优先浮空或模拟输入(静态功耗最低)