2. ESP32硬件基础
要真正把ESP32的低功耗设计做好,不能只停留在“调用esp_deep_sleep_start()”这一层,而必须理解芯片内部哪些硬件单元在耗电、哪些时钟在运行、哪些电源域可以被关闭。ESP32的低功耗能力,本质上是芯片架构、电源域划分、时钟系统与外设资源共同作用的结果。本节从硬件视角梳理这些基础,为后续的睡眠模式、唤醒源与功耗测量打下根基。
一、双核架构与低功耗的关系
经典ESP32采用Xtensa LX6双核架构,包含PRO_CPU与APP_CPU两个核心,二者共享内存与外设总线。在低功耗场景中,双核并非“越多越好”:多一个核心运行就意味着额外的动态功耗。因此ESP32提供了多种运行配置:
- 双核全开:性能最高,功耗也最高,适合需要实时处理与网络并行的场景。
- 单核运行:通过
CONFIG_FREERTOS_UNICORE配置,仅保留PRO_CPU,可显著降低动态功耗。 - 核心暂停:在轻睡眠(Light Sleep)期间,CPU时钟被门控,核心停止取指,功耗从数十毫安降至数百微安级别。
此外,ESP32内部还集成了ULP(Ultra Low Power)协处理器,它是一颗独立于主CPU的极简状态机,可在主CPU深度睡眠时继续运行,用于轮询传感器、比较阈值、触发唤醒。ULP的引入,使得“主核睡觉、协处理器值班”成为ESP32低功耗设计的核心范式。
二、电源域划分:谁在耗电,谁能被关掉
ESP32内部并非铁板一块,而是被划分为多个电源域(Power Domain)。理解这些域的供电关系,是判断“睡眠时到底还剩什么在耗电”的关键。
- 数字核心域:包含CPU、内存、数字外设,是动态功耗的主要来源,睡眠时可被大幅关断。
- RTC域:包含RTC控制器、RTC内存(RTC Slow Memory / RTC Fast Memory)、RTC外设(RTC GPIO、RTC Timer、RTC I2C等)。该域在深度睡眠时仍可由RTC电源维持,是唤醒逻辑的“值班区域”。
- 模拟域:包含Wi-Fi/蓝牙射频、ADC、DAC、温度传感器等。射频是峰值功耗大户,睡眠时应确保其被关闭。
- 电源管理单元:负责各域供电切换、电压调节与掉电检测,是低功耗配置的硬件执行者。
RTC_DATA_ATTR修饰的变量中。三、时钟系统:低功耗的“心跳”来源
时钟是数字电路功耗的直接驱动因素。ESP32的时钟系统由多个振荡源构成,不同睡眠模式下使用不同时钟,直接决定了唤醒精度与功耗水平。
| 时钟源 | 频率 | 特点 | 典型用途 |
|---|---|---|---|
| XTAL晶振 | 40MHz | 精度高、功耗较高 | 正常运行、射频 |
| PLL | 最高240MHz | 由XTAL倍频,功耗高 | CPU高速运行 |
| RC_FAST | 约17.5MHz | 精度低、启动快 | 轻睡眠、快速唤醒 |
| RC_SLOW | 约150kHz | 功耗极低、精度差 | 深度睡眠RTC计时 |
| 外部32.768kHz | 32.768kHz | 精度高、需外接晶振 | 精准RTC计时 |
在深度睡眠中,主晶振与PLL通常被关闭,RTC域依靠RC_SLOW或外部32.768kHz晶振维持计时。若应用对唤醒时间精度要求高(如定时采集),应外接32.768kHz晶振;若只做粗略延时,RC_SLOW即可,且成本更低。
四、外设资源与低功耗硬件特性
ESP32集成了丰富的外设,但并非所有外设都能在睡眠中工作。低功耗设计需要区分“睡眠中可用的外设”与“必须唤醒主核才能使用的外设”。
- RTC GPIO:可在深度睡眠中作为唤醒源,支持电平触发与边沿触发,是按键唤醒、传感器中断唤醒的基础。
- RTC Timer:可在深度睡眠中定时唤醒,配合ULP可实现周期性采样。
- Touch Sensor:电容触摸通道可在睡眠中监测触摸事件并唤醒。
- ULP协处理器:可访问RTC GPIO、RTC I2C、ADC等,实现睡眠中的轻量级数据采集与判断。
- Wi-Fi/蓝牙:射频模块功耗高,睡眠前必须确保其已断开并进入省电状态,否则会抵消睡眠收益。
esp_wifi_stop()、esp_bluedroid_disable(),再进入睡眠。五、典型场景:电池供电的温湿度节点
假设一个使用ESP32的温湿度采集节点,每5分钟上报一次数据,其余时间深度睡眠。其硬件层面的功耗路径如下:
- 主核与Wi-Fi工作,采集SHT30数据并通过MQTT上报,持续约2秒,平均电流约120mA。
- 关闭Wi-Fi、蓝牙,配置RTC Timer为5分钟唤醒源。
- 进入深度睡眠,数字核心域掉电,RTC域维持计时,整机电流降至约10µA(使用RC_SLOW)或约5µA(使用外部32.768kHz并关闭RC_SLOW)。
- 5分钟后RTC Timer触发唤醒,系统重新初始化并进入下一轮采集。
按此模型,平均电流约为(120mA × 2s + 0.01mA × 298s) / 300s ≈ 0.81mA,若使用2000mAh电池,理论续航约100天。若忽略Wi-Fi关闭,睡眠电流升至数毫安,续航将骤降至数天。
// 进入深度睡眠前的关键硬件配置
esp_wifi_stop();
esp_bluedroid_disable();
esp_bt_controller_disable();
esp_sleep_enable_timer_wakeup(300 * 1000000ULL); // 5分钟
esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0); // 按键唤醒
esp_deep_sleep_start();
六、复盘:硬件基础决定低功耗上限
很多开发者把低功耗问题归结为“软件没写好”,但实际项目中,硬件选型与配置往往决定了功耗的下限。例如:未外接32.768kHz晶振导致RTC精度差、RTC GPIO上拉电阻持续耗电、LDO静态电流过大、外设芯片未断电等,都会让深度睡眠电流远高于预期。因此,在写第一行睡眠代码之前,先确认芯片架构、电源域、时钟源与外设的硬件状态,才是低功耗设计正确的起点。