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内存是深度睡眠中唯一可保留数据的SRAM区域,容量有限(约8KB Slow + 8KB Fast)。需要跨睡眠周期保存的变量,应放入RTC_DATA_ATTR修饰的变量中。

三、时钟系统:低功耗的“心跳”来源

时钟是数字电路功耗的直接驱动因素。ESP32的时钟系统由多个振荡源构成,不同睡眠模式下使用不同时钟,直接决定了唤醒精度与功耗水平。

时钟源频率特点典型用途
XTAL晶振40MHz精度高、功耗较高正常运行、射频
PLL最高240MHz由XTAL倍频,功耗高CPU高速运行
RC_FAST约17.5MHz精度低、启动快轻睡眠、快速唤醒
RC_SLOW约150kHz功耗极低、精度差深度睡眠RTC计时
外部32.768kHz32.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/蓝牙:射频模块功耗高,睡眠前必须确保其已断开并进入省电状态,否则会抵消睡眠收益。
常见误区:只调用深度睡眠函数,却没有关闭Wi-Fi与蓝牙。射频若仍处于连接保持状态,整机功耗可能仍在毫安级,深度睡眠形同虚设。正确做法是先esp_wifi_stop()、esp_bluedroid_disable(),再进入睡眠。

五、典型场景:电池供电的温湿度节点

假设一个使用ESP32的温湿度采集节点,每5分钟上报一次数据,其余时间深度睡眠。其硬件层面的功耗路径如下:

  1. 主核与Wi-Fi工作,采集SHT30数据并通过MQTT上报,持续约2秒,平均电流约120mA。
  2. 关闭Wi-Fi、蓝牙,配置RTC Timer为5分钟唤醒源。
  3. 进入深度睡眠,数字核心域掉电,RTC域维持计时,整机电流降至约10µA(使用RC_SLOW)或约5µA(使用外部32.768kHz并关闭RC_SLOW)。
  4. 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静态电流过大、外设芯片未断电等,都会让深度睡眠电流远高于预期。因此,在写第一行睡眠代码之前,先确认芯片架构、电源域、时钟源与外设的硬件状态,才是低功耗设计正确的起点。

ESP32 低功耗硬件结构:电源域 · 时钟 · 外设 数字核心域 PRO_CPU APP_CPU SRAM / 数字外设 PLL / XTAL 40MHz RTC 域(睡眠保持) RTC Timer RTC GPIO ULP 协处理器 RTC 内存 RC_SLOW / 32.768kHz 模拟 / 射频域 Wi-Fi 射频 蓝牙射频 ADC / DAC 温度传感器 睡眠时应关闭 电源管理单元 PMU 供电切换 · 电压调节 · 掉电检测 · 各域使能控制 睡眠模式与硬件状态对照 • 轻睡眠:CPU 时钟门控,数字域部分保持,RTC 域运行,唤醒快,电流约 0.8mA • 深度睡眠:数字核心域掉电,仅 RTC 域维持,电流约 10µA,唤醒后复位重启 • 休眠:仅 RTC Timer 与极少数 RTC GPIO 工作,电流最低,唤醒源最少