Skip to content

睡眠模式

ESP32 具有 Light-sleep 和 Deep-sleep 两种睡眠节能模式。根据应用所使用的功能,还有一些细分的子睡眠模式。

睡眠模式 - ESP32 - — ESP-IDF 编程指南 v5.2.2 文档 (espressif.com)

睡眠模式

在 Light-sleep 模式下,数字外设、CPU、以及大部分 RAM 都使用时钟门控,同时其供电电压降低。退出该模式后,数字外设、CPU 和 RAM 恢复运行,并且内部状态将被保留。

在 Deep-sleep 模式下,CPU、大部分 RAM、以及所有由时钟 APB_CLK 驱动的数字外设都会被断电。芯片上继续处于供电状态的部分仅包括:

  • RTC 控制器
  • ULP 协处理器
  • RTC 高速内存
  • RTC 低速内存

进入前设置

在 Light-sleep 和 Deep-sleep 模式下,无线外设会被断电。因此,在进入这两种睡眠模式前,应用程序必须调用恰当的函数

nimble_port_stop()nimble_port_deinit()esp_bluedroid_disable()esp_bluedroid_deinit()esp_bt_controller_disable()esp_bt_controller_deinit()esp_wifi_stop()来禁用 Wi-Fi 和 Bluetooth。

唤醒源

通过 API esp_sleep_enable_X_wakeup 可启用唤醒源。唤醒源在芯片被唤醒后并不会被禁用,若你不再需要某些唤醒源,可通过 API esp_sleep_disable_wakeup_source() 将其禁用

定时器唤醒

RTC 控制器中内嵌定时器,可用于在预定义的时间到达后唤醒芯片。时间精度为微秒,但其实际分辨率依赖于为 RTC_SLOW_CLK 所选择的时钟源。

调用 esp_sleep_enable_timer_wakeup() 函数可启用使用定时器唤醒睡眠模式。

ext0唤醒

可调用 esp_sleep_enable_ext0_wakeup() 函数来启用此唤醒源。

当RTC的某一个引脚设置为一个值的时候会进行唤醒

GPIO唤醒

这一个只可以在 Light-sleep 模式

可以使用 gpio_wakeup_enable()。启用该唤醒源后,可将每个管脚单独配置为在高电平或低电平时唤醒。

在进入 Light-sleep 模式前,请查看将要驱动的 GPIO 管脚的电源域。如果有管脚属于 VDD_SDIO 电源域,必须将此电源域配置为在睡眠期间保持供电。

例如,在 ESP32-WROOM-32 开发板上,GPIO16 和 GPIO17 连接到 VDD_SDIO 电源域。如果这两个管脚被配置为在睡眠期间保持高电平,则需将对应电源域配置为保持供电。为此,可以使用函数 esp_sleep_pd_config():

c
esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_ON);

串口唤醒

这一个只可以在 Light-sleep 模式

uart_set_wakeup_threshold() 函数可设置被观测上升沿的数量。请注意,触发唤醒的字符(及该字符前的所有字符)在唤醒后不会被 UART 接收,因此在发送数据之前,外部设备通常需要首先向 ESP32 额外发送一个字符以触发唤醒。

Stop bit and parity bits (if enabled) also contribute to the number of edges. For example, letter 'a' with ASCII code 97 is encoded as 0100001101 on the wire (with 8n1 configuration), start and stop bits included. This sequence has 3 positive edges (transitions from 0 to 1). Therefore, to wake up the system when 'a' is sent, set wakeup_threshold=3.

实际计算的时候, 需要看这一个字符里面的上升沿的个数

可调用 esp_sleep_enable_uart_wakeup() 函数来启用此唤醒源。

断电

应用程序可以使用 API esp_sleep_pd_config() 强制 RTC 外设和 RTC 内存进入特定断电模式。在 Deep-sleep 模式下,你还可以通过隔离一些 IO 来进一步降低功耗。

Deep Sleep启动

默认情况下,调用函数 esp_deep_sleep_start()esp_light_sleep_start() 后,所有唤醒源不需要的 RTC 电源域都会被断电。可调用函数 esp_sleep_pd_config() 来修改这一设置

Light Sleep启动

函数 esp_light_sleep_start() 可用于在配置唤醒源后进入 Light-sleep 模式,也可用于在未配置唤醒源的情况下进入 Light-sleep 模式。在后一种情况中,芯片将一直处于睡眠模式,直到从外部被复位。