GPIO 下拉输入测到 1.x V,说明需要检查引脚上的电流与真实配置,不能简单归因于“下拉比较弱,所以本来就拉不到 0 V”。本页限定为 STM32F1 的 GPIO 架构;寄存器模式以 RM0008 为依据,电气参数以 STM32F103x8/xB 为示例,具体型号和引脚仍须查对应数据手册。
需要从时钟、位字段开始配置,或比较 F1 与 F4/H7 的差异时,先读 STM32 GPIO 配置指南;本页集中解释电压与逻辑以及故障排查。
先区分引脚电压、输入读数与输出命令
跳转到“先区分引脚电压、输入读数与输出命令”原笔记中的 GPIO 框图可转写为三个相连但不同的通路:
外部电路 ↔ 引脚节点 → 数字输入缓冲/施密特触发器 → IDR ↘ 模拟输入通路(选定模拟模式时)ODR/BSRR → 输出控制 → P-MOS/N-MOS → 引脚节点外设输出 → 复用输出控制 ────────────↗- 引脚电压由外部连接、输出级、上下拉、漏电和瞬态共同决定,可以用仪表测量。
- IDR保存数字输入通路识别到的状态,不是模拟电压的数值。
- ODR是输出数据寄存器;对普通输出,它表达驱动命令。BSRR 可以置位或清零相应 ODR 位。
- 在 F1 的上下拉输入模式中,ODR 位还用于选择上拉或下拉,因此不能把所有模式下的 ODR 都理解成“主动输出”。
施密特触发器的阈值和迟滞影响电压如何被判为 0 或 1,不会凭空把外部引脚稳压到 1.x V。电源保护结构、复用功能和耐压特性也不能仅靠一张通用框图确定。
STM32F1 的上下拉不是独立于输出模式的开关
跳转到“STM32F1 的上下拉不是独立于输出模式的开关”RM0008 的 GPIO 配置表和输出章节规定了如下关系。这里的 MODE、CNF 是对应引脚在 CRL/CRH 中的配置位。RM0008,第 9 章
| 配置 | 关键位或状态 | 引脚行为 |
|---|---|---|
| 浮空输入 | MODE=00,CNF=01 | 输出级关闭,未启用内部上下拉 |
| 下拉输入 | MODE=00,CNF=10,ODR=0 | 弱下拉到 VSS |
| 上拉输入 | MODE=00,CNF=10,ODR=1 | 弱上拉到 VDD |
| 普通推挽输出 | 输出模式,CNF=00 | ODR=1 主动拉高;ODR=0 主动拉低 |
| 普通开漏输出 | 输出模式,CNF=01 | ODR=0 主动拉低;ODR=1 关闭下管、释放引脚 |
| 模拟输入 | MODE=00,CNF=00 | 使用模拟输入配置,不能套用数字输入判断 |
F1 在输出模式下关闭内部弱上拉、下拉。 原笔记中的“推挽加内部上拉只是不重要”“开漏可用内部上拉代替外部电阻”不适用于这里。
STM32F1 HAL 的 HAL_GPIO_Init() 也体现了这一点:输出分支按 Mode 与 Speed 配置;输入分支才检查 Pull,并通过 BSRR/BRR 选择 ODR 位。结构体存在 Pull 字段,不代表每种模式都使用该字段。不要把带独立 PUPDR 的其他系列示例直接套用到 F1。ST 官方 F1 HAL GPIO 实现
为什么下拉输入会停在 1.x V
跳转到“为什么下拉输入会停在 1.x V”弱下拉本身不是电压来源
跳转到“弱下拉本身不是电压来源”以 STM32F103x8/xB 数据手册给定条件为例,内部上拉、下拉等效电阻典型约 40 kΩ,范围为 30~50 kΩ;它不是精密电阻。数字阈值、漏电和容限须同时按该型号、引脚类型及工作条件检查。STM32F103x8/xB 数据手册,I/O port characteristics
若引脚只有一个下拉电阻连到真实的 VSS,且没有其他电流来源,理想稳态电压就是 0 V。若有电流 注入引脚,忽略其他支路时:
例如 30 µA 流入 40 kΩ 下拉,可形成约 1.2 V。这只是帮助定位的等效计算,不能因此断定 MCU 自身正常漏电就有 30 µA。
如果外部另有一个电阻 接 3.3 V,内部下拉为 ,则形成分压:
当两者均为 40 kΩ 时,结果是 1.65 V。此时需要寻找外部上拉、模块输出或板上其他支路,不能仅调整数字输入阈值。
按证据排查
跳转到“按证据排查”- 确认型号、封装和引脚。 核对板上标号与 MCU 实际管脚,检查是否连接调试器、复用外设、LED、传感器输出或电平转换器。
- 确认电压参考。 测 VDD 相对 MCU 的 VSS 是否正常,检查外设地与测量地。悬空参考地会使读数失去预期含义。
- 读取实际寄存器。 确认时钟已开启,CRL/CRH 为下拉输入,ODR 对应位为 0,并观察是否被后续初始化改写。单看 CubeMX 页面不能证明运行时状态。
- 区分直流中间电压与波形平均值。 万用表看到的 1.x V 可能来自脉冲、扫描或干扰;用合适的示波测量查看波形及上电过程。
- 隔离外部来源。 在确认允许断开的条件下,逐项排查外部上拉、漏电、污染、保护器件、未供电模块倒灌等路径。不要对一个正在主动输出高电平的端口直接短路到地。
- 核对数字阈值。 只有电压满足对应条件下的 才能保证读为低,满足 才能保证读为高;中间区间不能保证。不能要求所有低电平都精确等于 0.000 V,也不能把所有型号的 1.x V 一概判成同一种状态。
外接 10 kΩ 下拉可以降低某些高阻节点对漏电和干扰的敏感性,但不是无条件修复。应先算高电平时的负载电流、分压和外部驱动能力,再检查波形与阈值。
只在确有冲突时调整调试复用
跳转到“只在确有冲突时调整调试复用”F1 大部分 GPIO 复位后为浮空输入;调试相关引脚有特殊复位配置。不能把复位状态统称为“随机输出”。如果正在使用 PA15、PB3、PB4 等 JTAG 相关引脚,才进一步核对 SWJ 配置。
旧标准外设库示例中的 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE) 表达禁用 JTAG、保留 SWD,调用前需要相应时钟与库支持。它不是 HAL API,也不是所有 GPIO 异常的通用处理。保留 SWD 的 PA13/PA14 仍用于调试;不要为了排查普通输入盲目关闭整个调试接口。
推挽、开漏与 Output Level
跳转到“推挽、开漏与 Output Level”| 模式与 ODR 命令 | 输出级状态 | 引脚是否保证为高 |
|---|---|---|
| 推挽,1 | 上管导通,下管关断 | 需满足负载、电源及输出电压规格 |
| 推挽,0 | 上管关断,下管导通 | 输出低,仍有非零导通压降 |
| 开漏,1 | 下管关断,上管不参与 | 释放引脚;由外部上拉及其他器件决定 |
| 开漏,0 | 下管导通 | 主动拉低;上拉电阻仍有电流 |
开漏输出低时,上拉不是“无效”。近似电流为 ,它影响功耗、下拉电流与低电平压降。释放后,上拉与总线电容决定上升速度;一阶近似时间常数为 。
F1 的硬件 I²C 引脚应使用对应复用开漏配置,并根据总线电容、速度和灌电流能力选外部上拉。软件模拟 I²C 的普通开漏配置是另一种实现;两者都不能靠 F1 输出模式中的 GPIO_PULLUP 获得不存在的内部上拉。
电阻等效必须先确认连接节点
跳转到“电阻等效必须先确认连接节点”原来的电阻示意图已转为以下可核算的文字模型。图中的 5 V 仅是电路计算示例,不表示 STM32F1 的供电电压或所有引脚都可接 5 V。5 V 容限必须看具体 FT 引脚及模式、供电和内部上下拉限制。
并联:两端分别是同一对节点
跳转到“并联:两端分别是同一对节点”因此 。该结果只适用于两者确实跨接同一对节点,不能把“上管连向电源”和“下拉连向地”当作并联。原图“与无穷大并联等于 0”错误;与理想短路并联才得到 0。
分压:上支路与下支路连接到不同电源端
跳转到“分压:上支路与下支路连接到不同电源端”原图假设 5 V 经 30 Ω 上支路到引脚,引脚再经 100 Ω 到地。按线性电阻模型:
若再从 5 V 到引脚并联一只 100 Ω,上支路变为:
原图写约 4.2 V,与图示这组电阻值不符。真实 MOS 输出级也不是在所有工作点保持固定 30 Ω;这些值用于说明拓扑,不能代替 GPIO 驱动规格或推出允许负载。
初始化先选择不动作状态,再启用输出
跳转到“初始化先选择不动作状态,再启用输出”CubeMX 的 GPIO Output Level 应结合生成代码理解:普通推挽输出的初始 ODR 决定拉高还是拉低;开漏输出的 High 表示释放。复用外设输出还由外设本身控制,不能只看 ODR。
为了减少模式切换时的非预期脉冲,通常先开 GPIO 时钟、预装所需 ODR,再开启输出驱动。以下是 F1 HAL 的初始化顺序示例,假设 PA5 未被其他用途占用,且所接电路的非动作电平确实是低:
#include "stm32f1xx_hal.h"
void Output_InitInactiveLow(void){ GPIO_InitTypeDef gpio = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
gpio.Pin = GPIO_PIN_5; gpio.Mode = GPIO_MODE_OUTPUT_PP; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &gpio);}若实际硬件为低有效,非动作电平可能需要 GPIO_PIN_SET,不能照抄函数名和引脚。以上顺序不能控制代码运行前的复位窗口;必要时用合适的外部偏置和驱动电路定义上电状态,并测量整个上电过程。
| 原笔记应用 | 应先确认的电气关系 |
|---|---|
| LED | 接向地且高有效,低电平才通常熄灭;接向电源的低有效接法相反 |
| 继电器、电机、蜂鸣器 | 查驱动级有效极性及复位状态;不能把“Low”统一当作安全或不动作 |
| 使能信号 | 区分 EN 与低有效 EN,核对上电时序 |
| 片选 | 只有低有效片选通常以高作为不选中;还需确认电源域与外设条件 |
| I²C/开漏总线 | 释放输出并使用符合电气要求的外部上拉;不要主动推挽拉高共享开漏线 |
本次已逐项核对原文、两张原图、RM0008、F103 数据手册与 F1 HAL 源码,并重新计算图中电阻示例。未获取发生异常的实物、具体引脚和测量波形,不能据此断定原故障根因;初始化片段也未在该目标板编译或上电验证。