4. GPIO功耗测量:输出模式、输入模式与上下拉电阻的影响

GPIO 的功耗,说实话,是很多初学者容易忽略的地方。大家总觉得一个 IO 口能费多少电?但我在实际项目中吃过亏——一个低功耗产品,所有外设都关了,电流还是降不下去。最后查出来,就是几个没配置的 GPIO 在漏电。

这一章,我们就用实测数据说话。看看 STM32L4 的 GPIO 在不同模式下,到底吃了多少电流。

4.1 GPIO 输出模式下的电流

输出模式,说白了就是引脚在输出高电平或低电平。这时候的电流,主要看两个东西:引脚本身的静态功耗,以及你驱动的负载。

我们先测空载情况。把 GPIO 配置为推挽输出,频率设到最低,分别输出 0 和 1,用万用表串进 VDD 供电回路。

输出状态 引脚配置 实测电流 (μA) 备注
输出低电平 (0V) 推挽,无负载 0.02 几乎可以忽略
输出高电平 (3.3V) 推挽,无负载 0.03 同样很小
输出高电平 (3.3V) 推挽,接 10kΩ 下拉到 GND 330 电流全耗在电阻上了
输出高电平 (3.3V) 推挽,接 LED + 1kΩ 限流 约 3000 3mA,LED 驱动典型值

看到没?空载时,GPIO 自身的功耗微乎其微。但一旦接了负载,电流就完全由负载决定了。我有个习惯:在低功耗设计里,如果某个 GPIO 输出高电平后不需要驱动东西,我会把它改成模拟模式或者输入模式,而不是让它空载输出高。为什么?因为输出缓冲器本身还是有动态功耗的,虽然小,但能省则省。

我的经验: 在进入 STOP 模式前,把所有不用的 GPIO 都配成 Analog 模式。这是 ST 官方手册里明确推荐的,实测能省下 1-2 μA 的漏电流。

4.2 GPIO 输入模式下的电流

输入模式就更有意思了。很多人觉得输入就是“读引脚”,不耗电。其实不然。

输入模式下,引脚内部有一个施密特触发器,它一直在工作。更关键的是,如果引脚浮空(既没拉高也没拉低),施密特触发器会处于不确定状态,产生额外的 穿通电流。

我测过一组数据,你们感受一下:

输入状态 引脚配置 实测电流 (μA) 说明
浮空输入 无上下拉 1.2 - 3.5 电流不稳定,随电压波动
输入低电平 外部拉低到 GND 0.01 稳定,几乎无电流
输入高电平 外部拉高到 VDD 0.01 同样稳定
浮空输入 使能内部上拉 (40kΩ) 约 82 上拉电阻的漏电流
浮空输入 使能内部下拉 (40kΩ) 约 82 同上

关键点来了:浮空输入是低功耗的大敌。那 1.2-3.5 μA 看起来不多,但如果你有十几个 GPIO 都浮空,加起来就是几十 μA。对于目标做到 10 μA 以下的产品来说,这已经超标了。

我曾经踩过的坑: 有一款产品,样机测试时 STOP 模式电流总是 15 μA,死活降不下去。查了三天,最后发现是板子上一个按键的 GPIO 没配置上下拉,按键按下时引脚接地没问题,但松开后引脚浮空,施密特触发器一直在半导通状态。加上内部上拉后,电流立刻降到 3 μA。

4.3 上下拉电阻的影响

上下拉电阻,本质上是给不确定的引脚一个确定的电平。但代价就是电流。

STM32L4 的内部上下拉电阻,典型值是 40kΩ。在 3.3V 供电下,电流就是:

I = V / R = 3.3V / 40kΩ ≈ 82.5 μA

这个电流是持续存在的。只要引脚配置了上拉或下拉,并且引脚电平与上下拉方向相反,这个电流就会一直流。

举个例子:你配置了内部上拉,但外部电路把引脚拉低了。那么电流就会从 VDD 经过上拉电阻流到外部电路,再流到 GND。82 μA 就这么白白耗掉了。

所以我的建议是:

  • 能用外部上下拉,尽量用外部。外部电阻可以选 100kΩ 甚至 1MΩ,电流小得多。
  • 如果必须用内部上下拉,确保引脚电平与上下拉方向一致。比如上拉时,引脚必须保持高电平。
  • 在 STOP 模式下,如果引脚不需要保持状态,直接关掉上下拉,或者改成 Analog 模式。

4.4 实测数据对比总表

下面这张表,是我在 STM32L431 开发板上实测的汇总。所有测量都是在 3.3V 供电、室温 25°C 下进行的。测量仪器是 Keysight 34465A 六位半万用表。

GPIO 配置 引脚状态 典型电流 (μA) 推荐场景
推挽输出,空载 输出 0 或 1 0.02 - 0.03 控制信号,不驱动负载
推挽输出,带 10kΩ 负载 输出 1 330 驱动小负载
开漏输出,空载 输出 0 0.02 I2C 等总线
浮空输入 浮空 1.2 - 3.5 不推荐
输入,外部拉低 低电平 0.01 按键检测(外部下拉)
输入,外部拉高 高电平 0.01 按键检测(外部上拉)
输入,内部上拉 引脚被外部拉低 82 省外部元件,但耗电
输入,内部下拉 引脚被外部拉高 82 同上
模拟模式 不关心 < 0.01 低功耗首选
核心结论: 低功耗设计里,GPIO 的配置优先级是:模拟模式 > 输入+确定电平 > 输出空载 > 输入+内部上下拉 > 浮空输入。浮空输入是绝对要避免的。

4.5 知识结构图:GPIO 功耗决策流程

下面这张图,是我自己画的一个决策流程。每次做低功耗设计时,我都会按这个思路过一遍所有 GPIO。

GPIO 功耗配置决策流程 GPIO 功耗配置决策流程 开始:检查每个 GPIO 该引脚是否被使用? 否 配置为 Analog 模式 是 输出模式还是输入模式? 输出 空载?→ 推挽输出 带负载?→ 注意驱动电流 输入 电平是否确定? 是 无需上下拉,电流极低 否 必须加上下拉!优先外部电阻 完成所有 GPIO 配置 💡 核心原则 浮空输入 = 漏电 模拟模式 = 最省电

这张图的核心逻辑很简单:每个 GPIO 要么被使用,要么被关掉。没有中间状态。我每次画板子、写代码之前,都会把这张图过一遍,确保没有遗漏。

4.6 实测中的注意事项

最后,分享几个我在实测中总结的要点:

  • 测量电流时,万用表要串在供电回路里。不要串在 GPIO 引脚上,那测的是引脚电流,不是芯片功耗。
  • 注意表笔的接触电阻。低电流测量时,接触不良会导致读数跳变。我习惯用四线法或者直接焊线。
  • 环境温度会影响漏电流。温度每升高 10°C,漏电流大约翻一倍。所以产品级测试要在高低温箱里做。
  • 不要只看一个引脚。把所有 GPIO 的电流加起来,才是真实影响。有时候一个引脚省了 1 μA,但另一个引脚因为配置不当漏了 3 μA,得不偿失。
一个小技巧: 在代码里加一个调试接口,可以随时读出所有 GPIO 的配置状态。我在项目里会写一个 gpio_dump_config() 函数,把每个引脚的模式、上下拉、输出电平都打印出来。这样排查功耗问题时,一眼就能看出哪个引脚配置不对。