专栏前言
上一篇我们构建了三级看门狗可靠性体系 ,实现了故障自动检测与自愈,保障了系统长时间运行的稳定性。
但对于大量物联网终端、户外电池供电设备、可穿戴设备来说,另一个核心指标就是功耗------功耗直接决定电池续航、供电成本、设备部署场景,是工业级物联网产品的核心竞争力之一。
很多新手对低功耗的理解停留在"进入休眠就行",但实际工程中低功耗是系统性工程:不同休眠等级的功耗差可达上万倍,唤醒源配置决定了设备的响应性,外设状态、GPIO电平、时钟源都可能成为漏电的"隐形杀手"。
ESP32提供了完整的分级低功耗体系,从运行时动态调频到多级休眠,配合丰富的唤醒源,可以在功耗与性能之间找到最优平衡。
本篇一次性讲透ESP-IDF下的完整低功耗方案:
模式分级原理 → 深度/轻度/调制解调器三级休眠 → 定时/外部/触摸多唤醒源 → 动态电源管理调频 → 外设低功耗适配 → 漏电排查与优化 → 最佳实践与踩坑汇总
全程配可编译源码+架构图解,零基础也能设计出工业级的低功耗设备。
一、低功耗模式核心基础
1. 分级功耗体系
ESP32 采用分级低功耗设计,共分为四个核心运行模式,功耗从高到低依次为:主动模式 → 调制解调器睡眠 → 轻度睡眠 → 深度睡眠。等级越高,功耗越低,但唤醒延迟越长、保留的状态越少。
核心设计思路:根据当前业务需求,选择最低功耗的运行模式,在满足功能的前提下最大化续航。
2. 四种模式核心对比
| 模式 | CPU状态 | WiFi/蓝牙 | 内存状态 | 典型功耗 | 唤醒时间 | 典型应用 |
|---|---|---|---|---|---|---|
| 主动模式(Active) | 全速运行 | 可开启 | 全部保留 | ~80mA(全速) | 0 | 正常业务处理、高速通信 |
| 调制解调器睡眠(Modem Sleep) | CPU运行 | 关闭 | 全部保留 | ~20mA | 0 | 间歇通信、本地处理为主 |
| 轻度睡眠(Light Sleep) | 时钟暂停 | 关闭 | 全部保留 | ~0.8mA | 微秒级 | 快速响应、间歇工作、保留状态 |
| 深度睡眠(Deep Sleep) | 断电 | 关闭 | 仅RTC内存保留 | ~10μA | 毫秒级 | 长续航电池设备、定时采集 |
注意:功耗数值为典型值,具体与外设配置、时钟频率、芯片型号有关。深度睡眠功耗可以做到微安级,是电池供电设备的核心模式。

ESP32 四种低功耗模式分级与功耗对比:
#mermaid-svg-CayHKHU1tMjPCK4G{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CayHKHU1tMjPCK4G .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CayHKHU1tMjPCK4G .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CayHKHU1tMjPCK4G .error-icon{fill:#552222;}#mermaid-svg-CayHKHU1tMjPCK4G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CayHKHU1tMjPCK4G .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CayHKHU1tMjPCK4G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CayHKHU1tMjPCK4G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CayHKHU1tMjPCK4G .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CayHKHU1tMjPCK4G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CayHKHU1tMjPCK4G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CayHKHU1tMjPCK4G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CayHKHU1tMjPCK4G .marker.cross{stroke:#333333;}#mermaid-svg-CayHKHU1tMjPCK4G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CayHKHU1tMjPCK4G p{margin:0;}#mermaid-svg-CayHKHU1tMjPCK4G .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CayHKHU1tMjPCK4G .cluster-label text{fill:#333;}#mermaid-svg-CayHKHU1tMjPCK4G .cluster-label span{color:#333;}#mermaid-svg-CayHKHU1tMjPCK4G .cluster-label span p{background-color:transparent;}#mermaid-svg-CayHKHU1tMjPCK4G .label text,#mermaid-svg-CayHKHU1tMjPCK4G span{fill:#333;color:#333;}#mermaid-svg-CayHKHU1tMjPCK4G .node rect,#mermaid-svg-CayHKHU1tMjPCK4G .node circle,#mermaid-svg-CayHKHU1tMjPCK4G .node ellipse,#mermaid-svg-CayHKHU1tMjPCK4G .node polygon,#mermaid-svg-CayHKHU1tMjPCK4G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CayHKHU1tMjPCK4G .rough-node .label text,#mermaid-svg-CayHKHU1tMjPCK4G .node .label text,#mermaid-svg-CayHKHU1tMjPCK4G .image-shape .label,#mermaid-svg-CayHKHU1tMjPCK4G .icon-shape .label{text-anchor:middle;}#mermaid-svg-CayHKHU1tMjPCK4G .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CayHKHU1tMjPCK4G .rough-node .label,#mermaid-svg-CayHKHU1tMjPCK4G .node .label,#mermaid-svg-CayHKHU1tMjPCK4G .image-shape .label,#mermaid-svg-CayHKHU1tMjPCK4G .icon-shape .label{text-align:center;}#mermaid-svg-CayHKHU1tMjPCK4G .node.clickable{cursor:pointer;}#mermaid-svg-CayHKHU1tMjPCK4G .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CayHKHU1tMjPCK4G .arrowheadPath{fill:#333333;}#mermaid-svg-CayHKHU1tMjPCK4G .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CayHKHU1tMjPCK4G .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CayHKHU1tMjPCK4G .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CayHKHU1tMjPCK4G .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CayHKHU1tMjPCK4G .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CayHKHU1tMjPCK4G .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CayHKHU1tMjPCK4G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CayHKHU1tMjPCK4G .cluster text{fill:#333;}#mermaid-svg-CayHKHU1tMjPCK4G .cluster span{color:#333;}#mermaid-svg-CayHKHU1tMjPCK4G div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CayHKHU1tMjPCK4G .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CayHKHU1tMjPCK4G rect.text{fill:none;stroke-width:0;}#mermaid-svg-CayHKHU1tMjPCK4G .icon-shape,#mermaid-svg-CayHKHU1tMjPCK4G .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CayHKHU1tMjPCK4G .icon-shape p,#mermaid-svg-CayHKHU1tMjPCK4G .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CayHKHU1tMjPCK4G .icon-shape .label rect,#mermaid-svg-CayHKHU1tMjPCK4G .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CayHKHU1tMjPCK4G .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CayHKHU1tMjPCK4G .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CayHKHU1tMjPCK4G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 唤醒时间:0
唤醒时间:0
唤醒时间:微秒级
唤醒时间:毫秒级
主动模式
~80mA
全速运行
调制解调器睡眠
~20mA
关闭WiFi/蓝牙
轻度睡眠
~0.8mA
CPU时钟暂停
深度睡眠
~10μA
仅RTC保留
二、各模式详细解析与进入方式
1. 主动模式与动态电源管理
主动模式是系统正常运行的模式,CPU全速运行,所有外设可用。
但主动模式不代表只能满功耗运行,ESP-IDF 提供了动态电源管理框架(esp_pm),可以根据CPU负载自动调节时钟频率和内核电压,在不影响业务的前提下降低运行功耗。
- 调频策略:支持最高性能、自适应、最小功耗三种模式
- 自动调频:CPU负载高时提升频率,负载低时降低频率
- 适配场景:性能波动大的场景,比如平时低负载运行,通信时临时提升性能
2. 调制解调器睡眠
调制解调器睡眠的核心是关闭WiFi、蓝牙等无线调制解调器,CPU和内存保持正常运行。
- 进入方式:关闭WiFi/蓝牙后自动进入,或者通过电源管理框架配置
- 适用场景:以本地数据采集、控制为主,间隔性联网上报的设备
- 核心收益:关闭无线部分可以降低约70%的运行功耗
3. 轻度睡眠
轻度睡眠模式下,CPU时钟暂停,外设停止工作,内存内容完整保留,唤醒后可以立刻继续运行,无需重新初始化。
- 核心特点:唤醒速度快(微秒级),完全保留运行状态,功耗比调制解调器睡眠低一个数量级
- 进入方式:自动轻度睡眠(配置电源管理后,空闲自动进入),或者手动进入
- 唤醒源:定时器、GPIO外部中断、触摸中断、UART等
- 适用场景:需要快速响应、不能丢失运行状态的间歇工作设备
4. 深度睡眠
深度睡眠是功耗最低的模式,主CPU、大部分外设、主内存全部断电,只有RTC控制器、RTC内存、唤醒源电路保持工作。
- 核心特点:功耗极低(微安级),但唤醒后系统完全重启,相当于重新开机,主内存内容丢失
- 数据保留:可以将关键数据保存在RTC内存中,唤醒后可以读取
- 唤醒源:RTC定时器、GPIO外部唤醒、触摸唤醒、ULP协处理器唤醒
- 适用场景:电池供电、长续航、定时工作的采集类设备,比如温湿度节点、烟感探测器

深度睡眠与轻度睡眠状态保留对比:
#mermaid-svg-BgQmyl6anyiUpUji{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BgQmyl6anyiUpUji .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BgQmyl6anyiUpUji .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BgQmyl6anyiUpUji .error-icon{fill:#552222;}#mermaid-svg-BgQmyl6anyiUpUji .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BgQmyl6anyiUpUji .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BgQmyl6anyiUpUji .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BgQmyl6anyiUpUji .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BgQmyl6anyiUpUji .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BgQmyl6anyiUpUji .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BgQmyl6anyiUpUji .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BgQmyl6anyiUpUji .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BgQmyl6anyiUpUji .marker.cross{stroke:#333333;}#mermaid-svg-BgQmyl6anyiUpUji svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BgQmyl6anyiUpUji p{margin:0;}#mermaid-svg-BgQmyl6anyiUpUji .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BgQmyl6anyiUpUji .cluster-label text{fill:#333;}#mermaid-svg-BgQmyl6anyiUpUji .cluster-label span{color:#333;}#mermaid-svg-BgQmyl6anyiUpUji .cluster-label span p{background-color:transparent;}#mermaid-svg-BgQmyl6anyiUpUji .label text,#mermaid-svg-BgQmyl6anyiUpUji span{fill:#333;color:#333;}#mermaid-svg-BgQmyl6anyiUpUji .node rect,#mermaid-svg-BgQmyl6anyiUpUji .node circle,#mermaid-svg-BgQmyl6anyiUpUji .node ellipse,#mermaid-svg-BgQmyl6anyiUpUji .node polygon,#mermaid-svg-BgQmyl6anyiUpUji .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BgQmyl6anyiUpUji .rough-node .label text,#mermaid-svg-BgQmyl6anyiUpUji .node .label text,#mermaid-svg-BgQmyl6anyiUpUji .image-shape .label,#mermaid-svg-BgQmyl6anyiUpUji .icon-shape .label{text-anchor:middle;}#mermaid-svg-BgQmyl6anyiUpUji .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BgQmyl6anyiUpUji .rough-node .label,#mermaid-svg-BgQmyl6anyiUpUji .node .label,#mermaid-svg-BgQmyl6anyiUpUji .image-shape .label,#mermaid-svg-BgQmyl6anyiUpUji .icon-shape .label{text-align:center;}#mermaid-svg-BgQmyl6anyiUpUji .node.clickable{cursor:pointer;}#mermaid-svg-BgQmyl6anyiUpUji .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BgQmyl6anyiUpUji .arrowheadPath{fill:#333333;}#mermaid-svg-BgQmyl6anyiUpUji .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BgQmyl6anyiUpUji .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BgQmyl6anyiUpUji .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BgQmyl6anyiUpUji .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BgQmyl6anyiUpUji .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BgQmyl6anyiUpUji .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BgQmyl6anyiUpUji .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BgQmyl6anyiUpUji .cluster text{fill:#333;}#mermaid-svg-BgQmyl6anyiUpUji .cluster span{color:#333;}#mermaid-svg-BgQmyl6anyiUpUji div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BgQmyl6anyiUpUji .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BgQmyl6anyiUpUji rect.text{fill:none;stroke-width:0;}#mermaid-svg-BgQmyl6anyiUpUji .icon-shape,#mermaid-svg-BgQmyl6anyiUpUji .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BgQmyl6anyiUpUji .icon-shape p,#mermaid-svg-BgQmyl6anyiUpUji .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BgQmyl6anyiUpUji .icon-shape .label rect,#mermaid-svg-BgQmyl6anyiUpUji .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BgQmyl6anyiUpUji .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BgQmyl6anyiUpUji .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BgQmyl6anyiUpUji :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 深度睡眠 Deep Sleep
主CPU断电
大部分外设断电
主内存断电
仅RTC控制器/内存工作
轻度睡眠 Light Sleep
CPU时钟暂停
外设停止工作
内存内容完整保留
唤醒后立即继续运行
唤醒时间:微秒级
无需重新初始化
唤醒时间:毫秒级
系统完全重启
三、实战1:深度睡眠 + 定时唤醒(最常用)
深度睡眠 + 定时唤醒工作流程:
#mermaid-svg-QhufK95CAWMcbE0M{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QhufK95CAWMcbE0M .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QhufK95CAWMcbE0M .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QhufK95CAWMcbE0M .error-icon{fill:#552222;}#mermaid-svg-QhufK95CAWMcbE0M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QhufK95CAWMcbE0M .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QhufK95CAWMcbE0M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QhufK95CAWMcbE0M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QhufK95CAWMcbE0M .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QhufK95CAWMcbE0M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QhufK95CAWMcbE0M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QhufK95CAWMcbE0M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QhufK95CAWMcbE0M .marker.cross{stroke:#333333;}#mermaid-svg-QhufK95CAWMcbE0M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QhufK95CAWMcbE0M p{margin:0;}#mermaid-svg-QhufK95CAWMcbE0M .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QhufK95CAWMcbE0M .cluster-label text{fill:#333;}#mermaid-svg-QhufK95CAWMcbE0M .cluster-label span{color:#333;}#mermaid-svg-QhufK95CAWMcbE0M .cluster-label span p{background-color:transparent;}#mermaid-svg-QhufK95CAWMcbE0M .label text,#mermaid-svg-QhufK95CAWMcbE0M span{fill:#333;color:#333;}#mermaid-svg-QhufK95CAWMcbE0M .node rect,#mermaid-svg-QhufK95CAWMcbE0M .node circle,#mermaid-svg-QhufK95CAWMcbE0M .node ellipse,#mermaid-svg-QhufK95CAWMcbE0M .node polygon,#mermaid-svg-QhufK95CAWMcbE0M .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QhufK95CAWMcbE0M .rough-node .label text,#mermaid-svg-QhufK95CAWMcbE0M .node .label text,#mermaid-svg-QhufK95CAWMcbE0M .image-shape .label,#mermaid-svg-QhufK95CAWMcbE0M .icon-shape .label{text-anchor:middle;}#mermaid-svg-QhufK95CAWMcbE0M .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QhufK95CAWMcbE0M .rough-node .label,#mermaid-svg-QhufK95CAWMcbE0M .node .label,#mermaid-svg-QhufK95CAWMcbE0M .image-shape .label,#mermaid-svg-QhufK95CAWMcbE0M .icon-shape .label{text-align:center;}#mermaid-svg-QhufK95CAWMcbE0M .node.clickable{cursor:pointer;}#mermaid-svg-QhufK95CAWMcbE0M .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QhufK95CAWMcbE0M .arrowheadPath{fill:#333333;}#mermaid-svg-QhufK95CAWMcbE0M .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QhufK95CAWMcbE0M .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QhufK95CAWMcbE0M .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QhufK95CAWMcbE0M .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QhufK95CAWMcbE0M .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QhufK95CAWMcbE0M .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QhufK95CAWMcbE0M .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QhufK95CAWMcbE0M .cluster text{fill:#333;}#mermaid-svg-QhufK95CAWMcbE0M .cluster span{color:#333;}#mermaid-svg-QhufK95CAWMcbE0M div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QhufK95CAWMcbE0M .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QhufK95CAWMcbE0M rect.text{fill:none;stroke-width:0;}#mermaid-svg-QhufK95CAWMcbE0M .icon-shape,#mermaid-svg-QhufK95CAWMcbE0M .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QhufK95CAWMcbE0M .icon-shape p,#mermaid-svg-QhufK95CAWMcbE0M .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QhufK95CAWMcbE0M .icon-shape .label rect,#mermaid-svg-QhufK95CAWMcbE0M .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QhufK95CAWMcbE0M .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QhufK95CAWMcbE0M .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QhufK95CAWMcbE0M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 首次上电
定时唤醒
外部唤醒
定时器/GPIO触发
设备上电启动
检查唤醒原因
初始化计数=0
唤醒计数++
处理外部事件
模拟采集与上报
保存关键数据到RTC内存
配置定时唤醒源
10秒
配置外部唤醒源
GPIO0低电平
进入深度睡眠
esp_deep_sleep_start
系统断电
仅RTC工作
这是低功耗场景最高频的用法:设备定时唤醒,完成采集、上报后立刻进入深度睡眠,绝大多数时间处于低功耗状态,实现超长续航。
1. 实现功能
- 每10秒唤醒一次,打印唤醒原因
- 模拟传感器采集与数据上报
- 完成后自动进入深度睡眠
- 关键数据保存在RTC内存中,唤醒后累计计数
2. 完整可编译源码
c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_sleep.h"
#include "esp_log.h"
#define TAG "DEEP_SLEEP"
#define SLEEP_TIME_SEC 10 // 休眠时间:10秒
// RTC内存变量:深度休眠后数据不丢失
// 注意:不能用普通全局变量,深度休眠后主内存断电会丢失
RTC_DATA_ATTR uint32_t wakeup_count = 0;
void app_main(void)
{
// 获取唤醒原因
esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason) {
case ESP_SLEEP_WAKEUP_TIMER:
wakeup_count++;
ESP_LOGI(TAG, "定时唤醒,第 %lu 次唤醒", wakeup_count);
break;
case ESP_SLEEP_WAKEUP_EXT0:
ESP_LOGI(TAG, "外部中断唤醒");
break;
default:
ESP_LOGI(TAG, "首次上电启动");
wakeup_count = 0;
break;
}
// ===== 模拟业务处理:采集、上报 =====
ESP_LOGI(TAG, "执行业务处理...");
vTaskDelay(pdMS_TO_TICKS(500)); // 模拟业务耗时
ESP_LOGI(TAG, "业务处理完成,进入深度休眠");
// 配置定时唤醒源
esp_sleep_enable_timer_wakeup(SLEEP_TIME_SEC * 1000000); // 单位:微秒
// 配置外部唤醒源(可选):GPIO0低电平唤醒
esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0);
// 进入深度睡眠,函数不会返回
esp_deep_sleep_start();
}
3. 关键说明
RTC_DATA_ATTR:修饰的变量存放在RTC内存中,深度睡眠后数据保留,普通全局变量会丢失- 唤醒源可以同时配置多个,任意一个满足都可以唤醒
esp_deep_sleep_start()调用后不会返回,系统直接进入休眠- 唤醒后相当于重新启动,从
app_main开始执行,通过唤醒原因区分不同启动场景
四、实战2:轻度睡眠 + 自动电源管理

轻度睡眠 + 自动电源管理工作流程:
#mermaid-svg-3sZlBdmtocY9pHV2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3sZlBdmtocY9pHV2 .error-icon{fill:#552222;}#mermaid-svg-3sZlBdmtocY9pHV2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3sZlBdmtocY9pHV2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3sZlBdmtocY9pHV2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3sZlBdmtocY9pHV2 .marker.cross{stroke:#333333;}#mermaid-svg-3sZlBdmtocY9pHV2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3sZlBdmtocY9pHV2 p{margin:0;}#mermaid-svg-3sZlBdmtocY9pHV2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3sZlBdmtocY9pHV2 .cluster-label text{fill:#333;}#mermaid-svg-3sZlBdmtocY9pHV2 .cluster-label span{color:#333;}#mermaid-svg-3sZlBdmtocY9pHV2 .cluster-label span p{background-color:transparent;}#mermaid-svg-3sZlBdmtocY9pHV2 .label text,#mermaid-svg-3sZlBdmtocY9pHV2 span{fill:#333;color:#333;}#mermaid-svg-3sZlBdmtocY9pHV2 .node rect,#mermaid-svg-3sZlBdmtocY9pHV2 .node circle,#mermaid-svg-3sZlBdmtocY9pHV2 .node ellipse,#mermaid-svg-3sZlBdmtocY9pHV2 .node polygon,#mermaid-svg-3sZlBdmtocY9pHV2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3sZlBdmtocY9pHV2 .rough-node .label text,#mermaid-svg-3sZlBdmtocY9pHV2 .node .label text,#mermaid-svg-3sZlBdmtocY9pHV2 .image-shape .label,#mermaid-svg-3sZlBdmtocY9pHV2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-3sZlBdmtocY9pHV2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3sZlBdmtocY9pHV2 .rough-node .label,#mermaid-svg-3sZlBdmtocY9pHV2 .node .label,#mermaid-svg-3sZlBdmtocY9pHV2 .image-shape .label,#mermaid-svg-3sZlBdmtocY9pHV2 .icon-shape .label{text-align:center;}#mermaid-svg-3sZlBdmtocY9pHV2 .node.clickable{cursor:pointer;}#mermaid-svg-3sZlBdmtocY9pHV2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3sZlBdmtocY9pHV2 .arrowheadPath{fill:#333333;}#mermaid-svg-3sZlBdmtocY9pHV2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3sZlBdmtocY9pHV2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3sZlBdmtocY9pHV2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3sZlBdmtocY9pHV2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3sZlBdmtocY9pHV2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3sZlBdmtocY9pHV2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3sZlBdmtocY9pHV2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3sZlBdmtocY9pHV2 .cluster text{fill:#333;}#mermaid-svg-3sZlBdmtocY9pHV2 .cluster span{color:#333;}#mermaid-svg-3sZlBdmtocY9pHV2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3sZlBdmtocY9pHV2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3sZlBdmtocY9pHV2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-3sZlBdmtocY9pHV2 .icon-shape,#mermaid-svg-3sZlBdmtocY9pHV2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3sZlBdmtocY9pHV2 .icon-shape p,#mermaid-svg-3sZlBdmtocY9pHV2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3sZlBdmtocY9pHV2 .icon-shape .label rect,#mermaid-svg-3sZlBdmtocY9pHV2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3sZlBdmtocY9pHV2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3sZlBdmtocY9pHV2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3sZlBdmtocY9pHV2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否(有任务)
是(任务延时)
否
是
系统启动
配置电源管理策略
esp_pm_configure
配置按键GPIO唤醒源
主循环执行业务
系统是否空闲?
CPU自动调频
提升至合适频率
自动进入轻度睡眠
~0.8mA
按键是否按下?
GPIO中断唤醒系统
恢复运行状态
微秒级响应
适合需要快速响应、保留运行状态的场景,设备空闲时自动进入轻度睡眠,有事件时立刻唤醒处理,兼顾功耗与响应性。
1. 实现功能
- 开启自动轻度睡眠,系统空闲时自动进入低功耗
- 配置动态调频,根据负载自动调整CPU频率
- 按键外部中断可以随时唤醒,响应按键事件
2. 完整源码
c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_pm.h"
#include "driver/gpio.h"
#include "esp_log.h"
#define TAG "LIGHT_SLEEP"
#define KEY_PIN GPIO_NUM_5
// 按键中断唤醒
static void key_isr_handler(void* arg)
{
// 中断触发唤醒,轻度睡眠下自动唤醒
// 仅做事件标记,业务逻辑在任务中处理
}
void app_main(void)
{
// ===== 1. 配置电源管理策略 =====
esp_pm_config_t pm_config = {
.max_freq_mhz = 160, // 最高频率160MHz
.min_freq_mhz = 40, // 最低频率40MHz
.light_sleep_enable = true // 开启自动轻度睡眠
};
esp_pm_configure(&pm_config);
// ===== 2. 配置按键唤醒 =====
gpio_config_t io_conf = {
.pin_bit_mask = 1ULL << KEY_PIN,
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.intr_type = GPIO_INTR_NEGEDGE
};
gpio_config(&io_conf);
gpio_install_isr_service(0);
gpio_isr_handler_add(KEY_PIN, key_isr_handler, NULL);
// 配置GPIO为唤醒源
gpio_wakeup_enable(KEY_PIN, GPIO_INTR_LOW_LEVEL);
esp_sleep_enable_gpio_wakeup();
ESP_LOGI(TAG, "自动轻度睡眠模式已开启");
// 主循环模拟业务
uint32_t cnt = 0;
while(1) {
cnt++;
ESP_LOGI(TAG, "系统运行中,计数:%lu", cnt);
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
3. 效果说明
- 任务运行时,CPU自动提升到合适的频率
- 任务延时、系统空闲时,自动进入轻度睡眠,功耗大幅降低
- 按键按下触发中断,立刻唤醒系统,响应延迟微秒级
- 整个过程完全自动,业务代码无需感知休眠
自动轻度睡眠运行时序:
GPIO按键 电源管理框架 CPU GPIO按键 电源管理框架 CPU #mermaid-svg-w8L5VS0ePU8kONx1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-w8L5VS0ePU8kONx1 .error-icon{fill:#552222;}#mermaid-svg-w8L5VS0ePU8kONx1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-w8L5VS0ePU8kONx1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-w8L5VS0ePU8kONx1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-w8L5VS0ePU8kONx1 .marker.cross{stroke:#333333;}#mermaid-svg-w8L5VS0ePU8kONx1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-w8L5VS0ePU8kONx1 p{margin:0;}#mermaid-svg-w8L5VS0ePU8kONx1 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-w8L5VS0ePU8kONx1 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-w8L5VS0ePU8kONx1 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-w8L5VS0ePU8kONx1 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-w8L5VS0ePU8kONx1 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-w8L5VS0ePU8kONx1 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-w8L5VS0ePU8kONx1 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-w8L5VS0ePU8kONx1 .sequenceNumber{fill:white;}#mermaid-svg-w8L5VS0ePU8kONx1 #sequencenumber{fill:#333;}#mermaid-svg-w8L5VS0ePU8kONx1 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-w8L5VS0ePU8kONx1 .messageText{fill:#333;stroke:none;}#mermaid-svg-w8L5VS0ePU8kONx1 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-w8L5VS0ePU8kONx1 .labelText,#mermaid-svg-w8L5VS0ePU8kONx1 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-w8L5VS0ePU8kONx1 .loopText,#mermaid-svg-w8L5VS0ePU8kONx1 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-w8L5VS0ePU8kONx1 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-w8L5VS0ePU8kONx1 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-w8L5VS0ePU8kONx1 .noteText,#mermaid-svg-w8L5VS0ePU8kONx1 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-w8L5VS0ePU8kONx1 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-w8L5VS0ePU8kONx1 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-w8L5VS0ePU8kONx1 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-w8L5VS0ePU8kONx1 .actorPopupMenu{position:absolute;}#mermaid-svg-w8L5VS0ePU8kONx1 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-w8L5VS0ePU8kONx1 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-w8L5VS0ePU8kONx1 .actor-man circle,#mermaid-svg-w8L5VS0ePU8kONx1 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-w8L5VS0ePU8kONx1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 运行阶段(高负载) 空闲休眠阶段 中断唤醒阶段 任务执行中,请求高性能提升频率至160MHz任务延时/空闲自动进入轻度睡眠(~0.8mA)降低频率至40MHz按键按下(下降沿中断)唤醒系统恢复运行状态(微秒级)继续执行任务
五、进阶:工程化低功耗优化要点
低功耗不是只配置休眠模式就行,实际工程中很多细节都会影响最终功耗,甚至出现"休眠电流比运行还大"的情况。
1. GPIO状态配置(最容易忽略的漏电点)
休眠时GPIO的状态对功耗影响极大:
- 浮空输入:最容易漏电,电平不确定,内部缓冲器耗电,必须避免
- 正确做法:不用的GPIO全部配置为下拉输入或者模拟输入
- 外部电路配合:确保休眠时外部电平稳定,没有浮空、半高电平
- 输出引脚:根据外部电路需求,设置为确定的高电平或低电平,避免大电流回路
2. 外设电源管理
- 不用的外设全部关闭时钟和电源,比如SPI、I2C、UART、ADC等
- 模拟外设(ADC、DAC、比较器)不用时必须关闭,模拟电路漏电远大于数字电路
- 无线外设(WiFi、蓝牙)不用时彻底关闭,不要只是待机
- 外部传感器、模块可以通过MOS管控制电源,休眠时彻底断电
3. 时钟源优化
- 休眠时的低速时钟优先选用外部32.768kHz晶振,比内部RC振荡器更精准、功耗更低
- 主动模式下根据性能需求选择合适的主频,不是越高越好
- 不用的时钟域全部关闭
4. 唤醒策略优化
- 尽量减少唤醒频率,能批量处理的事件就合并处理,减少唤醒次数
- 唤醒后快速处理业务,处理完立刻休眠,尽量缩短唤醒时间
- 避免频繁小唤醒,功耗开销远大于节省的电量
- 数据可以累计多次后一次性上报,减少无线通信的次数
5. 功耗测试方法
- 用万用表串联电源回路测试平均电流
- 用示波器、电流探头测试瞬时功耗,定位唤醒时的峰值和休眠时的底值
- 分模块测试:逐个关闭外设和功能,定位最大的功耗点
六、工程最佳实践
- 模式选型原则
- 年续航、电池供电的采集类设备:优先深度睡眠
- 需要快速响应、保留状态的设备:优先轻度睡眠
- 本地处理为主、间歇联网:调制解调器睡眠
- 高性能需求场景:主动模式+动态调频
- 深度休眠设计原则
- 关键数据用
RTC_DATA_ATTR保存,不要用普通全局变量 - 唤醒后快速处理业务,尽量控制在毫秒级
- 多唤醒源同时配置,兼顾定时和外部触发
- 配合看门狗,避免唤醒后业务异常卡死
- 关键数据用
- 功耗优化流程
- 先测基准功耗,再逐个模块排查
- 先优化休眠功耗,再优化运行功耗
- 先解决大的漏电点,再优化细节
- 保留足够的功耗余量,应对个体差异和温度变化
七、新手高频踩坑汇总
- 休眠电流特别大,远高于标称值
- GPIO浮空输入,产生漏电,这是最常见的原因
- 外设、模拟模块没有关闭,仍然在耗电
- 外部电路有漏电、半导通状态
- 电源域配置错误,不该上电的域上电了
- 深度休眠后数据全丢了
- 用了普通全局变量,深度休眠主内存断电丢失
- 必须用
RTC_DATA_ATTR修饰变量,存放在RTC内存中 - RTC内存容量有限,不能保存大量数据
- 轻度睡眠功耗达不到预期
- 中断太频繁,频繁唤醒,系统根本睡不深
- 外设时钟没关,仍然在工作耗电
- 自动轻度睡眠没有正确开启,或者被任务阻塞
- 唤醒失败、唤醒后异常
- 唤醒源没有正确配置,或者电平不匹配
- 深度睡眠唤醒后,外设没有重新初始化
- 唤醒后内存、寄存器状态和预期不一致
- 添加低功耗后系统不稳定
- 唤醒后外设、时钟没有恢复到正常状态
- 休眠前没有保存关键状态,唤醒后逻辑异常
- 中断、定时器和休眠模式的兼容性问题
下一篇预告(20篇)
ESP-IDF保姆级入门20|Flash存储与文件系统全解:NVS参数存储、SPIFFS文件系统、FATFS大容量存储、磨损均衡与掉电保护,掌握嵌入式非易失存储的工程化应用,实现数据可靠持久化!