此篇博客以 ESP32 为例来说明 ESP 的睡眠模式。

ESP32 芯片可以大致分成以为五个模块:

  • RF 模块,也就是射频模块,用于蓝牙 / Wi-Fi 的收发(TX / RX)功能。
  • CPU,如 Xtensa 内核 (ESP32 / ESP32-S2 / ESP32-S3),RISC-V 内核(ESP32-C3 / ESP32-C2)。
  • 无线数字模块,包括 Wi-Fi 和蓝牙的物理层,如 Wi-Fi 的 MAC,蓝牙的 Link controller。
  • 非 RTC 外设,如常用的 SPI, I2C, LEDC 等
  • RTC 相关。包括 RTC GPIO, ULP 等。
  • 处于工作状态的模块越多,芯片功耗越大,ESP32 一共有四种工作模式,按照运行时的平均功耗由高到底排序,依次为 active, modem sleep, light sleep 和 deep sleep。不同的工作模式下的各模块状态如图 1-1 所示:

    图 1-1 不同工作模式下的模块运行状态

    1.1. active 模式

    该模式下所有的模块都可以正常使用,此时芯片的底电流大约为 20 ~40 mA。

    1.2. modem sleep 模式

    该模式也就是通常的 Wi-Fi 保活模式。在该模式下 RF 射频模块将被关闭,芯片的底电流会在 20 mA 左右。该模式只能应用于 STA 模式,是否开启由 esp_err_t esp_wifi_set_ps(wifi_ps_type_t type) 这一个 API 决定。

  • type= WIFI_PS_NONE, 关闭 modem sleep,此时 RF 会一直处于打开状态。

  • type= WIFI_PS_MIN_MODEM,芯片每隔一个 DTIM 会和路由器进行一次交互,交互结束就暂时关闭 RF,然后在下一个 DTIM 再醒来。(补充内容:DTIM 和 listen interval 的区别)

  • type= WIFI_PS_MAX_MODEM,每隔一个 listen interval 会和路由器进行一次交互,交互结束就暂时关闭 RF,然后在下一个 listen interval 醒来。

  • ESP32 的 STA 默认是 WIFI_PS_MIN_MODEM,因此 modem sleep 模式是默认打开的。

    1.3. light sleep 模式

    该模式下 RF 模块会被关闭,除 RTC 相关模块外大多数模块都会被下电或者进行动态频率调节,以此来达到功耗降低的结果。此时的芯片底电流可以参考 datasheet 上的功耗,如 ESP32-C3 为 130 μA,ESP32-S3 为 240 μA。

    1.4. deep sleep 模式

    Deep sleep 模式下除 RTC 模块外全部被下电,底电流可以参考 datasheet,ESP32-C3 为 5 μA,ESP32-S3 为7 μA。

    1.5. 唤醒源

    处于 light sleep 和 deep sleep状态的芯片可以被唤醒,light sleep 和 deep sleep 唤醒源分别如表 1-1 和表 1-2 所示。各唤醒源的具体使用可以查看我们的light sleep例程以及 IDF 编程指南

    表 1-1 light sleep 唤醒源

    ESP32 ESP32-S2 ESP32-S3 ESP32-C3
    Timer
    GPIO
    EXT0
    EXT1
    UART
    Touch

    表 1-2 deep sleep 唤醒源

    ESP32 ESP32-S2 ESP32-S3 ESP32-C3
    Timer
    GPIO
    EXT0
    EXT1
    UART
    Touch
    ULP-FSM
    ULP-RISCV

    1.6.注意事项

  • EXT0 和 EXT1 只能用于 RTC GPIO,和 GPIO 唤醒相比需要保持的硬件电源域不同,实际使用体验差别不大。
  • ESP32 不支持 UART 唤醒中断,其余芯片在 IDF 版本 4.4 及以后都支持 UART 唤醒中断,但是真正可以应用 UART 中断要在最新的 master 上,如果想在 4.4 上应用 UART 中断需要自己修改驱动。
  • UART 中断需要一定数量字节用于唤醒,所以如果想要使用 UART 中断需要约定好唤醒规则。
  • Deep sleep 的唤醒源和 light sleep 类似,多了 ULP (协处理器) 唤醒。ESP32 只能使用 ULP-FSM,需要用汇编进行唤醒程序的编写,ESP32-S2 / ESP32-S3 还能使用 ULP-RISCV,运用 C 语言进行协处理器程序的编写。
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » ESP低功耗入门

    发表评论