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 输出高电平后不需要驱动东西,我会把它改成模拟模式或者输入模式,而不是让它空载输出高。为什么?因为输出缓冲器本身还是有动态功耗的,虽然小,但能省则省。
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 以下的产品来说,这已经超标了。
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 | 低功耗首选 |
4.5 知识结构图:GPIO 功耗决策流程
下面这张图,是我自己画的一个决策流程。每次做低功耗设计时,我都会按这个思路过一遍所有 GPIO。
这张图的核心逻辑很简单:每个 GPIO 要么被使用,要么被关掉。没有中间状态。我每次画板子、写代码之前,都会把这张图过一遍,确保没有遗漏。
4.6 实测中的注意事项
最后,分享几个我在实测中总结的要点:
- 测量电流时,万用表要串在供电回路里。不要串在 GPIO 引脚上,那测的是引脚电流,不是芯片功耗。
- 注意表笔的接触电阻。低电流测量时,接触不良会导致读数跳变。我习惯用四线法或者直接焊线。
- 环境温度会影响漏电流。温度每升高 10°C,漏电流大约翻一倍。所以产品级测试要在高低温箱里做。
- 不要只看一个引脚。把所有 GPIO 的电流加起来,才是真实影响。有时候一个引脚省了 1 μA,但另一个引脚因为配置不当漏了 3 μA,得不偿失。
gpio_dump_config() 函数,把每个引脚的模式、上下拉、输出电平都打印出来。这样排查功耗问题时,一眼就能看出哪个引脚配置不对。