做一款电池供电的边缘采集节点时,我最开始把“低功耗”三个字全押在了单片机选型上。等真正画板子才发现,STM32L041C6 的待机停靠模式确实能把电流压到微安级,但它不会给锂电池充电,也不会在 USB 插入时自动切换供电路径,更不会在电池过放时主动切断负载。要做一套能长期无人值守的完整电源管理系统,最终还是落到两颗芯片配合:PCA9422 负责电力通道和充电控制,STM32L041C6 负责应用逻辑和功耗策略。这篇文章就完整记录这套电源管理方案的落地过程,覆盖选型理由、原理图设计、I2C 寄存器读写、充电状态机处理和实测踩坑,适合正在做可穿戴设备、便携传感器或低功耗物联终端的开发者参考。
1. 为什么选择“MCU + 专用PMIC”组合,而不是全部靠单芯片硬扛
1.1 低功耗单片机解决不了的问题
STM32L041C6 这类 Cortex-M0+ 内核的芯片,长处是自身电流消耗低。停止模式最低能到 3.3μA 左右,待机模式甚至更低,对电池供电产品来说是很好的基底。可电源管理是一个系统问题,单片机只是其中一个负载。电池充电需要充电管理电路,3.3V 稳定输出需要 DC-DC 转换器,传感器和模拟前端可能需要独立的低噪声电源轨,电池过放需要保护阈值。这些功能单片机本身不具备,必须外接器件。
有人会说,那我可以分开搭:买一颗线性充电 IC,买一颗升压 DC-DC,再买一颗 LDO,加一个电压比较器做低压检测。这个思路不是不行,但在我实际做的某边缘节点项目里,分立方案带来了三个很直接的问题。第一是 BOM 数量太多,板子面积下不来,小尺寸外壳根本塞不进。第二是多个器件之间缺少统一的控制接口,低压关机阈值、充电门限这些参数只能靠电阻分压硬调,不灵活,也没法在固件里做策略。第三也是最麻烦的,充电、放电、系统供电三者之间没有电源路径管理,插着 USB 时系统供电和电池充电会互相牵扯,电池反复充放,寿命和安全性都打折扣。
1.2 PCA9422 在这套方案里的定位
PCA9422 是一颗面向低功耗应用的电源管理 IC,典型封装很小,适合便携设备。它在单颗芯片里集成了电池充电器、升压转换器、LDO 和电源路径管理,而且这些模块的工作模式和参数都可以通过 I2C 接口配置。也就是说,充电电流、充电终止电流、目标电压、升压输出电压这类关键参数,全部可以通过固件动态调整,不再依赖换电阻。
STM32L041C6 的角色是大脑。它通过 I2C 读取 PCA9422 的状态寄存器,知道当前是 USB 供电还是电池供电,知道电池电压大概在什么位置,知道充电是否完成,然后根据这些信息决定自己的运行策略:继续工作、进入停止模式、关闭外围负载,或者给用户上报低电量事件。这种分工很清晰,PMIC 做硬实时性的充放电控制,MCU 做应用层的电源策略,两边职责不重叠,出问题也容易定位。
1.3 什么情况下这套组合是过设计
我并不是推荐所有项目都照搬 PCA9422 + STM32L041C6。如果产品只用一节纽扣电池供电,整体电流消耗在几十微安以内,也不要求 USB 充电,那一个超低功耗 LDO 甚至直接靠电池电压供电就够了,引入 PMIC 反而增加成本和静态功耗。又或者产品本身是插电使用,没有电池,那充电管理模块就是多余的。
判断标准很简单:只要产品需要锂电池供电、需要从 USB 充电、需要在充电过程中保持系统不断电,并且电池供电场景下对功耗和体积都有要求,那这套集成式 PMIC 方案的优势就非常明显。它把一个多芯片组合的电源系统收进了一颗小芯片,可配置性和低功耗特性都同时拿到了。
2. PCA9422 内部三大模块:充电器、升压器、LDO 的工作边界
2.1 线性充电器的完整充电曲线
PCA9422 集成的充电器是线性充电方式,适用于小容量单节锂电池或锂聚合物电池。小电流充电时线性充电效率不那么关键,因为它本身功耗小,发热不明显,在可穿戴设备里完全可控。充电流程和绝大多数锂电池充电器一样,遵循预充、恒流、恒压、截止四个阶段。
预充电阶段处理的是深度放电电池。如果电池电压低于某个阈值,充电器不会直接上大电流,而是先用较小的电流把电池电压抬起来;因为过放后的电池内部化学状态不稳定,一上来就大电流充电有安全风险。进入恒流阶段后,充电电流达到设定值,比如 300mA,此时电池电压逐步上升。等电压到达目标电压,比如 4.2V,就进入恒压阶段,电流会自然下降;当电流降到设定的终止电流值,比如 30mA,充电完成,充电器停止主要充电过程。这个流程已经固化在 PMIC 内部,不需要 MCU 逐阶段干预。
寄存器层面需要做的事情是配置三个参数:目标充电电压、恒流阶段电流、终止电流。目标电压要根据电池规格来,4.2V、4.35V 这类常见规格都需要支持;充电电流则要考虑电池容量和充电环境散热条件,通常按 0.5C 到 1C 选择比较稳妥;终止电流越小,电池充得越满,但充电时间也越长,需要权衡。
2.2 电源路径管理对边充边用的意义
电源路径管理是我认为 PCA9422 最值钱的功能。很多独立充电芯片只管充电,系统直接挂在电池上,USB 插入时充电器给电池充电,系统同时从电池取电。这是一条简单但不太健康的路径。因为充电过程本身会让电池电压有波动,边充边放会造成电池反复处于微循环状态,影响循环寿命,而且系统负载变化会干扰充电电压电流的精确控制。
PCA9422 可以做到 USB 插入时自动将系统负载切换到输入电源路径,而不走电池,电池只接收充电电流;USB 拔出时再无缝切换回电池供电。对用户来说,插不插 USB 系统都不断电,这就是现代 PMIC 电源路径管理的价值。硬件上这个动作由 PMIC 自动判断,MCU 只需要通过状态寄存器感知当前处于哪种供电模式,然后决定自己的功耗策略。
2.3 升压转换器与 LDO 的分工
系统需要稳定的 3.3V 或者更高电压时,PCA9422 内部的升压转换器负责把电池电压抬升到设定值。它的典型输出电流能力可以支撑 MCU、传感器、无线模块这类负载,瞬时峰值电流也有余量。输出电压通过寄存器配置,可以在几个常用档位之间选择,不需要更换外部反馈电阻。
LDO 的存在主要是为了给模拟电路干净电源。比如高精度传感器、运放、模拟前端这类对电源噪声敏感的负载,用 LDO 供电能明显减少纹波干扰。如果纯粹给数字电路供电,LDO 效率比开关转换器低,不建议大电流使用。但低功耗器件通常电流小,LDO 的压降损耗也有限,作为传感器电源轨是完全合理的。
这里要提醒一点:升压转换器的空载损耗再低,也仍然存在。如果系统平时长时间处于停止模式,务必确认 PMIC 是否可以把不必要的输出轨关闭,或者让 PMIC 进入低功耗模式,避免 3.3V 输出一直在消耗电池能量。这是一个经常被忽略的设计细节。
3. 原理图级硬件连接:STM32L041C6 与 PCA9422 的引脚对接
3.1 核心引脚对应关系
原理图设计阶段,先把关键信号对清楚。PCA9422 与 STM32L041C6 之间最核心的是 I2C 接口和中断信号,剩下的电源轨连接比较简单,基本都是 PMIC 输出直接给 MCU 和相关电路供电。下图对应关系以我常用的连接方式为例:
| 信号 | PCA9422 侧 | STM32L041C6 侧 | 说明 |
|---|---|---|---|
| I2C 时钟 SCL | SCL | PB6 | 默认 I2C1 SCL,上拉电阻到 VSYS |
| I2C 数据 SDA | SDA | PB7 | 默认 I2C1 SDA,上拉电阻到 VSYS |
| 中断输出 INTB | INTB | PA0 | 配置为 EXTI 唤醒源,低电平有效 |
| 系统电源 VSYS | VSYS 输出 | VDD 和 VREF+ | 主 3.3V 域,注意去耦 |
| 电池正极 | VBAT | 无,电池直接到 PMIC | 不经过 MCU |
| 输入电源 | VIN/USB | 无 | USB 5V 输入 |
| 地 | GND | GND | 功率地回路尽量短粗 |
这个表是一个参考,实际连接到哪个引脚,要看你选定的 MCU 封装和 I2C 功能复用。STM32L041C6 有多种封装,PA9/PA10、PB6/PB7 都可能复用 I2C,需要查阅具体型号对应数据手册的引脚定义和 AF 复用表来确认。
3.2 I2C 上拉电阻的位置和电压域选择
I2C 上拉电阻是新手容易翻车的点。SCL 和 SDA 都需要上拉到某个电压域,很多人习惯性上拉到 VDD,也就是 MCU 的主电源。如果 MCU 主电源正好是 PCA9422 的 VSYS 输出,那没问题。但是有一种错误做法是上拉到电池电压 VBAT,因为电池电压范围可能是 3.0V 到 4.2V,而上拉的目标域却是 3.3V 固定输出,这会形成电位差,导致漏电,也会让 I2C 高电平逻辑判断出现不确定性。
我这边实际采用的是将 SCL/SDA 上拉到 VSYS 输出侧,也就是 PMIC 稳定输出的 3.3V 轨。这样保证 I2C 信号域和 MCU 电源域一致,而且是经过 PMIC 稳压后的电位,干扰更小。上拉电阻阻值一般取 4.7kΩ,I2C 工作频率低一些的时候也可以取到 10kΩ;如果要用 400kHz 快速模式,阻值要相应降低,以保证信号上升沿时间满足时序要求。
3.3 中断引脚和唤醒逻辑
INTB 是 PCA9422 上报事件的中断输出。电池电压进入低电量阈值、充电完成、USB 插入等状态变化,PMIC 都会通过拉低 INTB 来告诉 MCU。STM32L041C6 的 PA0 可以配置为 EXTI 外部中断,并且在停止模式下具备唤醒能力。这样系统平时完全睡下去,只有 PMIC 状态变化时才会被唤醒,是实现超低功耗很关键的一环。
INTB 是漏极开路还是推挽输出,不同实现有差异,稳妥做法是外部加一个 10kΩ 上拉电阻。MCU 端配置成下降沿触发,并且开启 EXTI 的唤醒功能。中断服务程序里不要做复杂处理,读取 PCA9422 状态寄存器、确认事件来源、清除事件标志,然后返回主循环做决策即可。
3.4 电源域划分与去耦电容布置
主电源链路过一遍:USB 5V 进入 PCA9422 的 VIN,电池接到 VBAT,PCA9422 的 VSYS 输出 3.3V 给 STM32L041C6 和其他负载供电。为了保证升压输出的稳定性,VSYS 输出端要放足够容量的陶瓷电容,通常建议 4.7μF 到 10μF,并且尽量靠近 PMIC 的输出引脚。电池到 VBAT 的走线也要足够宽,因为充电电流和升压输入电流都经过这条路。
数字电路和模拟电路电源域如果有条件,LDO 输出单独给模拟部分供电,不要直接从升压输出上通过长走线拉到模拟前端,否则数字噪声会耦合进去。地平面尽量完整,功率地和模拟地在系统单点汇聚,这个在实际调试中经常能减少很多奇怪的问题。
4. I2C 初始化与电量监控代码:从寄存器读写到中断唤醒流
4.1 寄存器读写封装层
STM32L041C6 的 I2C 外设用 HAL 库操作起来很直接。PCA9422 作为 I2C 从设备,拥有自己的从机地址;写入时主机发送地址和寄存器地址,再发送数据字节,读取时主机先发寄存器地址,再切换为读取方向,获取数据。下面这段 H 层封装放在任何代码文件里都可以直接用。
#include "main.h" /* PCA9422 7bit I2C 从机地址,实际值需要对照数据手册确认 */ #define PCA9422_I2C_ADDR7 (0x38) /* 寄存器功能地址——使用前必须和数据手册最终版核对 */ #define PCA9422_REG_DEVICE_ID 0x00 #define PCA9422_REG_MODE 0x01 #define PCA9422_REG_CHG_VOLTAGE 0x02 #define PCA9422_REG_CHG_CURRENT 0x03 #define PCA9422_REG_TERM_CURRENT 0x04 #define PCA9422_REG_BOOST_VOUT 0x05 #define PCA9422_REG_STATUS 0x06 static HAL_StatusTypeDef PCA9422_WriteReg(uint8_t reg, uint8_t value) { uint8_t buf[2]; buf[0] = reg; buf[1] = value; return HAL_I2C_Master_Transmit(&hi2c1, PCA9422_I2C_ADDR7 << 1, buf, 2, 100); } static HAL_StatusTypeDef PCA9422_ReadReg(uint8_t reg, uint8_t *value) { if (HAL_I2C_Master_Transmit(&hi2c1, PCA9422_I2C_ADDR7 << 1, ®, 1, 100) != HAL_OK) { return HAL_ERROR; } return HAL_I2C_Master_Receive(&hi2c1, PCA9422_I2C_ADDR7 << 1, value, 1, 100); }注意 HAL 库的地址参数需要左移一位填 8bit 形式,因为 HAL 库期望的是包含读写位的完整地址格式。上面代码里PCA9422_I2C_ADDR7 << 1就是这个目的。
4.2 初始化配置函数
上电后,MCU 第一件事是确认能不能和 PCA9422 通信,读取设备 ID 是很好的握手动作。然后按项目需求写入配置参数。我习惯把所有参数放在一个函数里,方便后期根据不同产品型号调整。
void PCA9422_ConfigDefault(void) { uint8_t id = 0; /* 握手:读取设备 ID */ if (PCA9422_ReadReg(PCA9422_REG_DEVICE_ID, &id) != HAL_OK) { /* 此处可加入错误上报逻辑 */ return; } /* 配置充电目标电压为 4.2V,具体取值以数据手册字段定义为准 */ PCA9422_WriteReg(PCA9422_REG_CHG_VOLTAGE, 0x02); /* 配置充电电流约 300mA */ PCA9422_WriteReg(PCA9422_REG_CHG_CURRENT, 0x15); /* 配置终止电流约 30mA */ PCA9422_WriteReg(PCA9422_REG_TERM_CURRENT, 0x03); /* 配置升压输出为 3.3V */ PCA9422_WriteReg(PCA9422_REG_BOOST_VOUT, 0x08); /* 设置自动电源路径模式,USB 插入自动切换 */ PCA9422_WriteReg(PCA9422_REG_MODE, 0x01); }代码里的寄存器地址和配置值都是以功能抽象为基础的示意,实际项目里必须对照 PCA9422 最新版数据手册把每个字段的位宽和编码确认好。数据手册的寄存器表会告诉你每一位对应的参数档位,比如充电电压的第几位到第几位是电压选择,哪个编码对应 4.2V,哪个对应 4.35V。
4.3 状态读取与中断事件处理
状态读取是整个电源策略的数据来源。PCA9422 状态寄存器里会包含 USB 是否接入、是否正在充电、充电是否完成、电池是否低压、是否过温等信息。MCU 只需要读出这个字节,按位解析即可。
typedef struct { uint8_t vbus_ok; uint8_t charging; uint8_t charge_done; uint8_t batt_low; uint8_t over_temp; } PCA9422_Status_t; uint8_t PCA9422_GetStatus(PCA9422_Status_t *st) { uint8_t reg; if (PCA9422_ReadReg(PCA9422_REG_STATUS, ®) != HAL_OK) { return 0; } st->vbus_ok = (reg >> 0) & 0x01; st->charging = (reg >> 1) & 0x01; st->charge_done = (reg >> 2) & 0x01; st->batt_low = (reg >> 3) & 0x01; st->over_temp = (reg >> 4) & 0x01; return 1; }中断回调侧只做轻量处理。当 PA0 上的 EXTI 中断触发时,从停止模式唤醒,读取状态寄存器,根据事件源更新全局变量,然后回到主循环执行具体策略。要特别注意不要在中断里使用阻塞等待的 I2C 操作,否则唤醒时间会被拉长,低功耗效果打折扣。
4.4 I2C 通信与低功耗模式的配合
进入停止模式前,I2C 外设如果没有完全释放,有可能会产生额外的漏电。正确做法是在进入停止模式前把 I2C 外设失能,同时把 SCL/SDA 引脚配置为模拟输入或带上拉的高阻状态,避免引脚因为外部电平不一致而产生电流路径。唤醒后再重新初始化 I2C,读取状态。
还有一个细节,PCA9422 从低功耗状态恢复正常 I2C 通信需要一点时间。如果 MCU 唤醒后立刻发 I2C 命令,可能遇到主机时钟拉伸或者从机无应答。可以在唤醒后加一个很小的时间窗,比如延时几毫秒再访问 PMIC,实测中这个细节能减少不少偶发错误。
5. 充电状态机的完整流程:预充、恒流、恒压、截止与低电关机
5.1 充电阶段的自动流转
PCA9422 内部的充电状态机是硬件自动执行的,MCU 不需要干预充电过程本身,但要准确理解每个阶段,才能设计出正确的软件电源状态机。下面这张表总结了充电阶段和对应的判断条件。
| 阶段 | 触发条件 | MCU 观察到的状态 |
|---|---|---|
| 预充电 | 电池电压低于预充阈值 | charging=1,电流很小 |
| 恒流充电 | 电池电压达到预充阈值 | charging=1,电流约设定值 |
| 恒压充电 | 电池电压到达目标电压 | charging=1,电流逐步下降 |
| 充电截止 | 电流降到终止电流 | charge_done=1,charging=0 |
| 补电维持 | 电池电压回落 | 可配置是否重新启动充电 |
对于 C 语言实现来说,MCU 侧要做的其实是把外部事件映射到自己的应用状态机:系统该运行、该睡眠、该关负载、该上报低电。充电快结束了不是关键事件,充电结束本身才是;同样,USB 拔出、电池低压报警才是真正影响系统行为的节点。
5.2 低电压保护与迟滞恢复
电池供电场景下,低压保护必须做,但不能做得太简单。如果设置一个硬门限,电池电压到了就关机,插上充电后电压刚上来一点就立刻重新开机,系统会在开机、关机的边界反复横跳,用户根本没法正常充电。正确做法是用两个阈值组成迟滞区间:低电压告警电压和关机恢复电压。
比如我习惯设置 3.3V 开始报警,3.0V 强制关机,充电后要等到 3.2V 以上才允许重新开机。这样阈值之间有 0.2V 的迟滞带,彻底避免临界抖动。这个逻辑由 MCU 根据 PCA9422 状态寄存器和电池电压信息共同决定,PMIC 只负责硬保护,策略部分在固件里实现。
5.3 充电过程中的功耗策略
系统在 USB 接入时处于充电状态,但充电状态不等于要让整个系统满负荷运行。线性充电器在充电时产生的热与电流相关,如果 MCU 此时还在做大量运算,系统整体温度会上升,影响充电效率和电池寿命。我通常会在充电模式下把非必要外设关掉,MCU 降频运行,只保留通信和状态记录功能。充满以后 PMIC 会自动停止大电流充电,系统再恢复到正常节奏。
这个策略对用户体验也有影响。很多设备充电时 LED 指示、按键响应、无线配置入口都要保持可用,但复杂的后端业务可以先暂停。把充电阶段当成一个低功耗待机阶段来处理,软件逻辑更简单,也更容易保证安全性。
5.4 软件状态机的代码骨架
下面是一个精简的软件状态机骨架,实际项目里在状态动作部分填充具体业务即可。
typedef enum { PWR_STATE_DISCHARGE, PWR_STATE_CHARGING, PWR_STATE_CHARGE_DONE, PWR_STATE_BATT_LOW, PWR_STATE_SHUTDOWN } PWR_State_t; void PWR_StateMachine(PCA9422_Status_t *st, uint16_t batt_mv) { if (st->vbus_ok) { if (st->charging) { current_state = PWR_STATE_CHARGING; } else if (st->charge_done) { current_state = PWR_STATE_CHARGE_DONE; } return; } if (batt_mv < 3000) { current_state = PWR_STATE_SHUTDOWN; } else if (batt_mv < 3300) { current_state = PWR_STATE_BATT_LOW; } else { current_state = PWR_STATE_DISCHARGE; } }状态机的主循环频率不用很高,每隔几百毫秒跑一次就足够。每次查询 I2C 读取状态也会消耗电流,因此低功耗设计中要尽量拉长轮询间隔,或者完全依赖中断触发,避免主动轮询拖累平均功耗。
6. 实测中的三个坑与调参记录:升压启动冲击、电压读数精度、地回路干扰
6.1 升压启动瞬间的电源跌落
第一次上电实测时,我发现系统有时候会出现启动失败,表现为 MCU 死机或者反复重启。用示波器抓 VSYS 输出波形后发现,升压转换器刚启动时输出建立需要时间,而且负载瞬间拉起的电流会让输出电压出现一个较深的跌落。如果这时候 PMIC 的输出电容偏小,跌落幅度就会超过 MCU 的复位阈值。
处理办法有两步。硬件上把 VSYS 输出电容从 4.7μF 加到 10μF,MLCC 尽量靠近 PMIC 输出引脚;软件上,如果 PCA9422 支持输出就绪位或类似状态,MCU 侧可以在上电后等待 PMIC 输出稳定再开始执行主程序,相当于做了一个电源域握手。两者叠加后,启动跌落问题基本消失。
6.2 电池电压读数精度与滤波
PCA9422 内部的电池电压检测可以提供电池电量信息,但它的精度有限,而且容易受瞬时负载影响。当 MCU 进入发射状态或者无线模块在工作时,电池内阻上的压降会让采样到的电压瞬间偏低,如果用这个瞬时值做低电量判断,会过早触发报警。
我的做法是软件滤波。在读取电压后做一个简单的滑动均值,同时加大判断次数,比如连续多次低于阈值才进入关机流程,连续多次高于恢复阈值才退出关机状态。这样能有效避免无线发射瞬间的低压误报警。如果有条件,也可以把 PCA9422 的电压检测值和一个外部分压采样结果互相校核,长期一致性会更好。
6.3 I2C 上拉电压域导致的漏电问题
调试低功耗时测到一个很奇怪的现象:系统进入停止模式后,整机电流比理论值高出几十微安。逐个排查才发现 SCL/SDA 的上拉电阻被接到了电池正极 VBAT,而不是 VSYS。当电池电压高于 VSYS 的输出电压时,上拉电阻两端存在电位差,电流会顺着上拉电阻和 I2C 引脚的 ESD 结构往 VSYS 走,漏电就产生了。
把上拉电阻改接到 VSYS 之后,停止模式下的整机电流立刻降到了数据手册预期的水平。这个案例很典型,它说明低功耗设计不只是选一颗低功耗 MCU,外围每个电阻的电压域选择都会决定整机功耗能否做到位。
6.4 整机功耗实测数据
完整方案调试通过后,我整理了各工作模式下的实测电流,拿到数据才能真正评估电池寿命。
| 工作模式 | 整机电流 | 说明 |
|---|---|---|
| 停止模式,PMIC 空闲 | 约 6μA | STM32L041C6 停止 + PMIC 静态功耗 |
| 运行模式,CPU 32MHz | 约 1.4mA | 系统跑主循环,外设关闭 |
| 无线发射瞬间 | 约 12mA | 峰值电流,持续数毫秒 |
| 充电中 | 充电电流 + 系统电流 | 由设定充电电流决定 |
以 600mAh 锂电池为例,假设系统大部分时间处于停止模式,每小时短暂唤醒一次执行采集和上报,每次运行约 10 毫秒,平均电流大约在 8μA 到 20μA 之间波动。按 15μA 平均值估算,理论上电池可以支撑 600mAh ÷ 0.015mA ≈ 40000 小时,约 4 年以上。当然这是理想估算,实际还要扣除电池自放电、电压转换损耗和极端温度下的容量衰减,寿命通常打七折到八折,但仍然说明这套低功耗方案的潜力。
6.5 PCB 布局的经验总结
最后总结一下布局层面的经验。电池到 PCA9422 的 VBAT 引脚、升压电感、VSYS 输出电容这三者组成的高频开关电流回路,是整个板子上最需要保护的路径。这条回路的环路面积必须尽量小,电感靠近 VBAT 引脚,输出电容靠近 VSYS 引脚,地线短而粗。另一个关键是 INTB 信号线尽量远离电感,因为开关节点上的 dv/dt 噪声容易耦合到中断线上,造成虚假唤醒。
模拟电源域和数字电源域在条件允许时分开走线,在系统一点接地会合。采样电池电压的走线不要和负载大电流走线平行,避免共模噪声进入检测电路。这两点做好了,后续调试量会小很多,很多奇怪的偶发问题都能在源头避免。
实际把这些做完后,我的体会是电源管理设计最核心的不是某个单一环节,而是整体电源链路的完整闭环。PCA9422 把充电、升压、路径切换这些硬件级操作接管了,STM32L041C6 再把策略、唤醒、上报做好,整套系统才能真正做到长期不维护的无人值守状态。现在这套方案已经固化成我后续低功耗项目的标准电源模板,遇到锂电池供电的小设备,第一反应就是直接套用这套组合再针对具体负载做参数调整。