# Sleep Modes

[中文]

## Overview

ESP32-H2 supports two major power saving modes: Light-sleep and Deep-sleep. According to the features used by an application, there are some sub sleep modes. See Sleep Modes for these sleep modes and sub sleep modes. Additionally, there are some power-down options that can be configured to further reduce the power consumption. See Power-down Options for more details.

There are several wakeup sources in the sleep modes. These sources can also be combined so that the chip will wake up when any of the sources are triggered. Wakeup Sources describes these wakeup sources and configuration APIs in detail.

The configuration of power-down options and wakeup sources are optional. They can be configured at any moment before entering the sleep modes.

Then the application can call sleep start APIs to enter one of the sleep modes. See Entering Sleep for more details. When the wakeup condition is met, the application is awoken from sleep. See Checking Sleep Wakeup Cause on how to get the wakeup cause, and Disable Sleep Wakeup Source on how to handle the wakeup sources after wakeup.

## Sleep Modes

In Light-sleep mode, the digital peripherals, most of the RAM, and CPUs are clock-gated and their supply voltage is reduced. Upon exit from Light-sleep, the digital peripherals, RAM, and CPUs resume operation and their internal states are preserved.

In Deep-sleep mode, the CPUs, most of the RAM, and all digital peripherals that are clocked from APB_CLK are powered off. The only parts of the chip that remain powered on are:

> - RTC controller

> - RTC FAST memory

## Wakeup Sources

Wakeup sources can be enabled using `esp_sleep_enable_X_wakeup` APIs. Wakeup sources are not disabled after wakeup, you can disable them using `esp_sleep_disable_wakeup_source()` API if you do not need them any more. See Disable Sleep Wakeup Source.

Following are the wakeup sources supported on ESP32-H2.

### Timer

The RTC controller has a built-in timer which can be used to wake up the chip after a predefined amount of time. Time is specified at microsecond precision, but the actual resolution depends on the clock source selected for RTC_SLOW_CLK.

RTC peripherals or RTC memories do not need to be powered on during sleep in this wakeup mode.

`esp_sleep_enable_timer_wakeup()` function can be used to enable sleep wakeup using a timer.

### External Wakeup (`ext1`)

The RTC controller contains the logic to trigger wakeup using multiple RTC GPIOs. One of the following two logic functions can be used to trigger ext1 wakeup:

- wake up if any of the selected pins is high (`ESP_EXT1_WAKEUP_ANY_HIGH`)

- wake up if any of the selected pins is low (`ESP_EXT1_WAKEUP_ANY_LOW`)

This wakeup source is controlled by the RTC controller. It supports wakeup even when the RTC peripheral is powered down. Although the power domain of the RTC peripheral, where RTC IOs are located, is powered down during sleep modes, ESP-IDF will automatically lock the state of the wakeup pin before the system enters sleep modes and unlock upon exiting sleep modes. Therefore, the internal pull-up or pull-down resistors can still be configured for the wakeup pin:

    esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
    rtc_gpio_pullup_dis(gpio_num);
    rtc_gpio_pulldown_en(gpio_num);

If we turn off the `RTC_PERIPH` domain, we will use the HOLD feature to maintain the pull-up and pull-down on the pins during sleep. HOLD feature will be acted on the pin internally before the system enters sleep modes, and this can further reduce power consumption:

    rtc_gpio_pullup_dis(gpio_num);
    rtc_gpio_pulldown_en(gpio_num);

If certain chips lack the `RTC_PERIPH` domain, we can only use the HOLD feature to maintain the pull-up and pull-down on the pins during sleep modes:

    gpio_pullup_dis(gpio_num);
    gpio_pulldown_en(gpio_num);

`esp_sleep_enable_ext1_wakeup_io()` function can be used to append ext1 wakeup IO and set corresponding wakeup level.

`esp_sleep_disable_ext1_wakeup_io()` function can be used to remove ext1 wakeup IO.

The RTC controller also supports triggering wakeup, allowing configurable IO to use different wakeup levels simultaneously. This can be configured with `esp_sleep_enable_ext1_wakeup_io()`.

Warning

- To use the EXT1 wakeup, the IO pad(s) are configured as RTC IO. Therefore, before using these pads as digital GPIOs, users need to reconfigure them by calling the `rtc_gpio_deinit()` function.

- If the RTC peripherals are configured to be powered down (which is by default), the wakeup IOs will be set to the holding state before entering sleep. Therefore, after the chip wakes up from Light-sleep, please call `rtc_gpio_hold_dis` to disable the hold function to perform any pin re-configuration. For Deep-sleep wakeup, this is already being handled at the application startup stage.

### GPIO Wakeup

Any IO can be used as the external input to wake up the chip from Light-sleep. Each pin can be individually configured using `gpio_wakeup_enable()` (low/high level only). Then the `esp_sleep_enable_gpio_wakeup()` function should be called to enable this wakeup source.

### UART Wakeup (Light-sleep Only)

When ESP32-H2 receives UART input from external devices, it is often necessary to wake up the chip when input data is available. The UART peripheral supports multiple wakeup modes that can wake up the chip from Light-sleep. The wakeup mode and its parameters can be configured using `uart_wakeup_setup()` function.

The UART wakeup supports the following modes:

Mode 0 (UART_WK_MODE_ACTIVE_THRESH) - Active Edge Threshold Wakeup

> When all clocks are powered down, the chip can be woken up by toggling the RXD pin for a certain number of cycles. The chip wakes up when the number of rising edges is greater than or equal to threshold value. The threshold value can be configured using the `rx_edge_threshold` field in `uart_wakeup_cfg_t` structure.

Mode 1 (UART_WK_MODE_FIFO_THRESH) - RX FIFO Threshold Wakeup

> Since the UART Core clock remains active, the UART RX can still receive data and store it in the RX FIFO. The chip can be woken up from Light-sleep when the number of bytes in the RX FIFO exceeds the configured threshold. The threshold value can be configured using the `rx_fifo_threshold` field in `uart_wakeup_cfg_t` structure.

Mode 2 (UART_WK_MODE_START_BIT) - Start Bit Detection Wakeup

> The chip wakes up when the UART RX detects a start bit.

Mode 3 (UART_WK_MODE_CHAR_SEQ) - Character Sequence Detection Wakeup

> The chip wakes up when the UART RX receives a specific character sequence. The character sequence can be configured using the `wake_chars_seq` field in `uart_wakeup_cfg_t` structure. The character sequence supports wildcard matching using '*' to represent any symbol.

`esp_sleep_enable_uart_wakeup()` function can be used to enable this wakeup source.

After waking-up from UART wakeup mode 0, you should send some extra data through the UART port or reset the UART module in Active mode, otherwise, the next UART wake-up would trigger with two less rising edges than the configured threshold value.

Note

In Light-sleep mode, setting Kconfig option CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP will invalidate UART wakeup.

### Disable Sleep Wakeup Source

Previously configured wakeup sources can be disabled later using `esp_sleep_disable_wakeup_source()` API. This function deactivates trigger for the given wakeup source. Additionally, it can disable all triggers if the argument is `ESP_SLEEP_WAKEUP_ALL`.

## Power-down Options

The application can force specific powerdown modes for RTC peripherals and RTC memories. In Deep-sleep mode, we can also isolate some IOs to further reduce current consumption.

### Power-down of RTC Peripherals and Memories

By default, `esp_deep_sleep_start()` and `esp_light_sleep_start()` functions power down all RTC power domains which are not needed by the enabled wakeup sources. To override this behaviour, `esp_sleep_pd_config()` function is provided.

In ESP32-H2, there is only RTC FAST memory, so if some variables in the program are marked by `RTC_DATA_ATTR`, `RTC_SLOW_ATTR` or `RTC_FAST_ATTR` attributes, all of them go to RTC FAST memory. It will be kept powered on by default. This can be overridden using `esp_sleep_pd_config()` function, if desired.

### Flash Entering Deep Power-Down Mode

For Light-sleep, ESP-IDF recommends lowering SPI Flash sleep current using Deep Power-Down (DPD) first: enable CONFIG_ESP_SLEEP_SET_FLASH_DPD so the SPI Flash enters its deep power-down command mode while the supply rail remains on. Current draw is typically very low (often below 1 µA for many SPI Flash devices), without the wake-up delay of fully cycling the SPI Flash supply.

In almost all use cases, DPD offers better overall trade-offs than cutting SPI Flash supply power—both safer for execution and still very low power.

Note

Mutually exclusive strategies: Power-down SPI Flash during Light-sleep (CONFIG_ESP_SLEEP_POWER_DOWN_FLASH or `esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_OFF)`) cannot be combined with DPD. Kconfig exposes CONFIG_ESP_SLEEP_SET_FLASH_DPD only when CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is disabled.

Warning

Before using this feature, check the datasheet of the SPI Flash device used on your chip to ensure it supports the Deep Power-Down mode.

### Power-down of Flash

By default, to avoid potential issues, `esp_light_sleep_start()` function does not power down SPI Flash. To be more specific, it takes time to power down the SPI Flash and during this period the system may be woken up, which then actually powers up the SPI Flash before this SPI Flash could be powered down completely. As a result, there is a chance that the SPI Flash may not work properly.

So, in theory, it is ok if you only wake up the system after the SPI Flash is completely powered down. However, in reality, the SPI Flash power-down period can be hard to predict (for example, this period can be much longer when you add filter capacitors to the SPI Flash's power supply circuit) and uncontrollable (for example, the asynchronous wake-up signals make the actual sleep time uncontrollable).

Warning

If a filter capacitor is added to your SPI Flash power supply circuit, please do everything possible to avoid powering down SPI Flash.

Therefore, it is recommended not to power down SPI Flash when using ESP-IDF. For power-sensitive applications, it is recommended to use Kconfig option CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND to reduce the power consumption of the SPI Flash during Light-sleep, instead of powering down the SPI Flash.

However, for those who have fully understood the risk and are still willing to power down the SPI Flash to further reduce the power consumption, please check the following mechanisms:

> - Setting Kconfig option CONFIG_ESP_SLEEP_POWER_DOWN_FLASH only powers down the SPI Flash when the RTC timer is the only wake-up source and the sleep time is longer than the SPI Flash power-down period.

> - Calling `esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_OFF)` powers down SPI Flash when the RTC timer is not enabled as a wakeup source or the sleep time is longer than the SPI Flash power-down period.

Note

- ESP-IDF does not provide any mechanism that can power down the SPI Flash in all conditions when Light-sleep.

- `esp_deep_sleep_start()` function forces power down SPI Flash regardless of user configuration.

### Flash Sleep Strategy Recommendations

In sleep scenarios, the SPI Flash handling method directly affects system safety, and power consumption. Different application scenarios prioritize these factors differently, so it is important to choose an appropriate SPI Flash sleep strategy.

#### Keep Flash Powered On

The standby power consumption of different SPI Flash varies. In ESP series chips, the standby power consumption of SPI Flash is typically below 30 µA. In the following scenarios, it is recommended to keep the SPI Flash powered on:

1. The system has extremely high stability requirements and cannot accept any potential risks from SPI Flash power-off.

2. Sleep duration is short or unpredictable, for example, when asynchronous wake-up sources exist (GPIO, UART, etc.).

3. Large filter capacitors exist in the SPI Flash power supply circuit, making it difficult to estimate the actual SPI Flash power-down time.

In the above cases, keeping the SPI Flash powered on is the most conservative and safest choice, but note that its standby power consumption is relatively high (about 10-30 µA).

#### Flash Entering Deep Power-Down (DPD) Mode

When standby power is still too high, prefer Deep Power-Down via CONFIG_ESP_SLEEP_SET_FLASH_DPD; see Flash Entering Deep Power-Down Mode for figures, timings, and how to enable it.

DPD mode is suitable for the following scenarios:

1. Significant reduction in SPI Flash power consumption during sleep is needed, but the risk of SPI Flash re-powering should be avoided.

2. Sleep duration is short or unpredictable, for example, when asynchronous wake-up sources exist (GPIO, UART, etc.).

3. SPI Flash chip used explicitly supports Deep Power-Down mode.

#### Power Down Flash

You can refer to Power-down of Flash to power down the SPI Flash during sleep. After the following conditions are met or after thorough evaluation, you may consider this strategy:

1. The application has strict requirements for extremely low power consumption.

2. Wake-up sources are controllable, typically only RTC timer wake-up sources are enabled.

3. It can be ensured that the actual sleep time is greater than the time required for the SPI Flash to completely power down. For ESP series chips, the time required for the SPI Flash to completely power down may be greater than 300ms. If parallel capacitors exist in the SPI Flash power supply circuit, longer sleep time may be required.

4. If the sleep time is too short, the power consumption during the SPI Flash power-on and power-down processes may exceed the power consumption when keeping it powered on.

5. There is sufficient control over SPI Flash power supply and IO states to avoid SPI Flash leakage due to pin pull-up during sleep.

Since the SPI Flash power-down process is greatly affected by hardware design, IO impedance characteristics, power supply, and environmental factors, ESP-IDF cannot guarantee that the SPI Flash will be safely powered down in Light-sleep mode. Therefore, this method is only suitable for scenarios with controllable risks and thorough verification.

### Configuring IOs (Deep-sleep Only)

Some ESP32-H2 IOs have internal pullups or pulldowns, which are enabled by default. If an external circuit drives this pin in Deep-sleep mode, current consumption may increase due to current flowing through these pullups and pulldowns.

## Entering Sleep

`esp_light_sleep_start()` or `esp_deep_sleep_start()` functions can be used to enter Light-sleep or Deep-sleep modes correspondingly. After that, the system configures the parameters of RTC controller according to the requested wakeup sources and power-down options.

It is also possible to enter sleep modes with no wakeup sources configured. In this case, the chip will be in sleep modes indefinitely until external reset is applied.

Note

The sleep process will disable the cache, so the task stack of the task requesting sleep must be located in internal memory (DRAM or RTC fast memory). If a task with its stack in PSRAM requests Light-sleep or Deep-sleep, it will be rejected and an error will be returned.

### UART Output Handling

Before entering sleep, the sleep flow prepares the console UART (the UART used for debug output, selected by CONFIG_ESP_CONSOLE_UART_NUM) so that APB clock changes or power-down do not cause garbled output or undefined behavior. The strategy applied is configurable and affects data integrity, sleep entry time, and power consumption.

Default behavior (auto mode)

If you do not call `esp_sleep_set_console_uart_handling_mode()`, the following default strategy is used:

- Deep-sleep: Always wait until all data in the console UART FIFO has been transmitted before entering sleep, so that all debug output is sent and no data is lost.

- Light-sleep: Behavior depends on whether the UART power domain is powered down:

    - If the UART remains powered (e.g. HP peripheral domain not powered down): UART output is suspended after the current frame completes; after wakeup it is resumed and any remaining data in the UART TX FIFO before sleep continues to be sent.

    - If the UART power domain is powered down: The sleep flow waits until all data in the console UART TX FIFO has been transmitted before entering sleep; data in other UARTs is discarded to enter sleep faster.

Configuring console UART handling

You can override the default by calling `esp_sleep_set_console_uart_handling_mode()` and choosing one of the following modes (see `esp_sleep_uart_handling_mode_t`):

- `ESP_SLEEP_AUTO_FLUSH_SUSPEND_UART` (default): Automatically choose flush or suspend based on sleep type and power domain, as described above.

- `ESP_SLEEP_ALWAYS_FLUSH_UART` : Always wait until all data in the console UART TX FIFO has been transmitted before entering sleep. Use when you must guarantee that all debug output is visible; sleep entry will take longer and the chip will stay in Active state longer, increasing power consumption.

- `ESP_SLEEP_ALWAYS_SUSPEND_UART` : Wait for the current UART frame to complete, then suspend the UART. If the UART stays powered during Light-sleep, transmission continues after wake. If the UART power domain is powered down, unsent data will be lost.

- `ESP_SLEEP_ALWAYS_DISCARD_UART` : Discard all unsent data in the console UART FIFO and enter sleep immediately. Use for the fastest sleep entry and lowest power when debug output can be discarded.

- `ESP_SLEEP_NO_HANDLING` : Do not perform any handling on the console UART before sleep. Use only when the UART state is known to be safe (e.g. no pending output or the console UART is disabled).

Note

The sleep flow runs in a critical section. When using a mode that flushes the console UART (e.g. `ESP_SLEEP_ALWAYS_FLUSH_UART` , or the default behavior for Light-sleep/Deep-sleep when the HP peripheral domain is powered down), set CONFIG_ESP_INT_WDT_TIMEOUT_MS to be greater than `SOC_UART_FIFO_LEN` × (time to send one character at the current baud rate). Otherwise, if too much data is queued in the TX FIFO, the flush may take longer than the interrupt watchdog timeout and trigger a watchdog reset during sleep entry.

Example: ensure all debug output is sent before every sleep:

    .. code-block:: C

> fflush(stdout); esp_sleep_set_console_uart_handling_mode(ESP_SLEEP_ALWAYS_FLUSH_UART); esp_light_sleep_start();

Example: minimize sleep entry time and allow discarding console output:

    .. code-block:: C

> esp_sleep_set_console_uart_handling_mode(ESP_SLEEP_ALWAYS_DISCARD_UART); esp_deep_sleep_start();

## Checking Sleep Wakeup Cause

`esp_sleep_get_wakeup_cause()` function can be used to check which wakeup source has triggered wakeup from sleep mode.

For ext1 wakeup sources, it is possible to identify which GPIO has caused wakeup using `esp_sleep_get_ext1_wakeup_status()` functions.

## Application Examples

- protocols/sntp demonstrates the implementation of basic functionality of Deep-sleep, where ESP module is periodically waken up to retrieve time from NTP server.

- bluetooth/nimble/power_save demonstrates the usage of Bluetooth Modem-sleep mode and automatic Light-sleep feature to maintain Bluetooth connections.

- system/deep_sleep demonstrates the usage of Deep-sleep wakeup triggered by various sources, such as the RTC timer and EXT1, supported by ESP32-H2.

- system/light_sleep demonstrates the usage of Light-sleep wakeup triggered by various sources, such as the timer, GPIOs, supported by ESP32-H2.

- lowpower/vbat demonstrates the use of backup battery power (VBAT) during Deep-sleep, allowing the RTC timer to keep running after the main power is removed.

## API Reference

### Header File

- components/esp_hw_support/include/esp_sleep.h

- This header file can be included with:

  >     #include "esp_sleep.h"

### Functions

esp_err_t esp_sleep_disable_wakeup_source(esp_sleep_source_t source)

  Disable wakeup source.

  This function is used to deactivate wake up trigger for source defined as parameter of the function.

  See docs/sleep-modes.rst for details.

  Note

  This function does not modify wake up configuration in RTC. It will be performed in esp_deep_sleep_start/esp_light_sleep_start function.

  Parameters:

    source -- - number of source to disable of type esp_sleep_source_t

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_STATE if trigger was not active

esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us)

  Enable wakeup by timer.

  Note

  The valid `time_in_us` value depends on the bit width of the lp_timer/rtc_timer counter and the current slow clock source selection (Refer RTC clock source configuration in menuconfig). Valid values should be positive values less than RTC slow clock period * (2 ^ RTC timer bitwidth).

  Parameters:

    time_in_us -- time before wakeup, in microseconds

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if value is out of range.

esp_err_t esp_sleep_enable_vbat_under_volt_wakeup(void)

  Wakeup chip is VBAT power voltage is lower than the configured brownout_threshold value.

  Returns:

    - ESP_OK on success

bool esp_sleep_is_valid_wakeup_gpio(gpio_num_t gpio_num)

  Returns true if a GPIO number is valid for use as wakeup source.

  Note

  For SoCs with RTC IO capability, this can be any valid RTC IO input pin.

  Parameters:

    gpio_num -- Number of the GPIO to test for wakeup source capability

  Returns:

    True if this GPIO number will be accepted as a sleep wakeup source.

esp_err_t esp_sleep_enable_ext1_wakeup(uint64_t io_mask, esp_sleep_ext1_wakeup_mode_t level_mode)

  Enable wakeup using multiple pins.

  This function uses external wakeup feature of RTC controller. It will work even if RTC peripherals are shut down during sleep.

  This feature can monitor any number of pins which are in RTC IOs. Once selected pins go into the state given by level_mode argument, the chip will be woken up.

  Note

  This function does not modify pin configuration. The pins are configured in esp_deep_sleep_start/esp_light_sleep_start, immediately before entering sleep mode.

  Note

  Internal pullups and pulldowns don't work when RTC peripherals are shut down. In this case, external resistors need to be added. Alternatively, RTC peripherals (and pullups/pulldowns) may be kept enabled using esp_sleep_pd_config function. If we turn off the `RTC_PERIPH` domain or certain chips lack the `RTC_PERIPH` domain, we will use the HOLD feature to maintain the pull-up and pull-down on the pins during sleep. HOLD feature will be acted on the pin internally before the system entering sleep, and this can further reduce power consumption.

  Note

  Call this func will reset the previous ext1 configuration.

  Note

  This function will be deprecated in release/v6.0. Please switch to use `esp_sleep_enable_ext1_wakeup_io` and `esp_sleep_disable_ext1_wakeup_io`

  Note

  On ESP32-H2, although GPIO7 is an RTC GPIO, it is not led out for external wakeup.

  Parameters:

    - io_mask -- Bit mask of GPIO numbers which will cause wakeup. Only GPIOs which have RTC functionality can be used in this bit map. For different SoCs, the related GPIOs are:

      - ESP32: 0, 2, 4, 12-15, 25-27, 32-39

      - ESP32-S2: 0-21

      - ESP32-S3: 0-21

      - ESP32-C6: 0-7

      - ESP32-H2: 7-14

    - level_mode -- Select logic function used to determine wakeup condition:

      - When target chip is ESP32:

        - ESP_EXT1_WAKEUP_ALL_LOW: wake up when all selected GPIOs are low

        - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high

      - When target chip is ESP32-S2, ESP32-S3, ESP32-C6 or ESP32-H2:

        - ESP_EXT1_WAKEUP_ANY_LOW: wake up when any of the selected GPIOs is low

        - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if io_mask is zero, or mode is invalid

esp_err_t esp_sleep_enable_ext1_wakeup_io(uint64_t io_mask, esp_sleep_ext1_wakeup_mode_t level_mode)

  Enable ext1 wakeup pins with IO masks.

  This will append selected IOs to the wakeup IOs, it will not reset previously enabled IOs. To reset specific previously enabled IOs, call esp_sleep_disable_ext1_wakeup_io with the io_mask. To reset all the enabled IOs, call esp_sleep_disable_ext1_wakeup_io(0).

  This function uses external wakeup feature of RTC controller. It will work even if RTC peripherals are shut down during sleep.

  This feature can monitor any number of pins which are in RTC IOs. Once selected pins go into the state given by level_mode argument, the chip will be woken up.

  Note

  This function does not modify pin configuration. The pins are configured in esp_deep_sleep_start/esp_light_sleep_start, immediately before entering sleep mode.

  Note

  Internal pullups and pulldowns don't work when RTC peripherals are shut down. In this case, external resistors need to be added. Alternatively, RTC peripherals (and pullups/pulldowns) may be kept enabled using esp_sleep_pd_config function. If we turn off the `RTC_PERIPH` domain or certain chips lack the `RTC_PERIPH` domain, we will use the HOLD feature to maintain the pull-up and pull-down on the pins during sleep. HOLD feature will be acted on the pin internally before the system entering sleep, and this can further reduce power consumption.

  Note

  On ESP32-H2, although GPIO7 is an RTC GPIO, it is not led out for external wakeup.

  Parameters:

    - io_mask -- Bit mask of GPIO numbers which will cause wakeup. Only GPIOs which have RTC functionality can be used in this bit map. For different SoCs, the related GPIOs are:

      - ESP32: 0, 2, 4, 12-15, 25-27, 32-39

      - ESP32-S2: 0-21

      - ESP32-S3: 0-21

      - ESP32-C6: 0-7

      - ESP32-H2: 7-14

    - level_mode -- Select logic function used to determine wakeup condition:

      - When target chip is ESP32:

        - ESP_EXT1_WAKEUP_ALL_LOW: wake up when all selected GPIOs are low

        - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high

      - When target chip is ESP32-S2, ESP32-S3, ESP32-C6 or ESP32-H2:

        - ESP_EXT1_WAKEUP_ANY_LOW: wake up when any of the selected GPIOs is low

        - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if any of the selected GPIOs is not an RTC GPIO, or mode is invalid

    - ESP_ERR_NOT_ALLOWED when wakeup level will become different between ext1 IOs if !SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN

esp_err_t esp_sleep_disable_ext1_wakeup_io(uint64_t io_mask)

  Disable ext1 wakeup pins with IO masks. This will remove selected IOs from the wakeup IOs.

  Note

  On ESP32-H2, although GPIO7 is an RTC GPIO, it is not led out for external wakeup.

  Parameters:

    io_mask -- Bit mask of GPIO numbers which will cause wakeup. Only GPIOs which have RTC functionality can be used in this bit map. If value is zero, this func will remove all previous ext1 configuration. For different SoCs, the related GPIOs are:

    - ESP32: 0, 2, 4, 12-15, 25-27, 32-39

    - ESP32-S2: 0-21

    - ESP32-S3: 0-21

    - ESP32-C6: 0-7

    - ESP32-H2: 7-14

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if any of the selected GPIOs is not an RTC GPIO.

esp_err_t esp_sleep_enable_ext1_wakeup_with_level_mask(uint64_t io_mask, uint64_t level_mask)

  Enable wakeup using multiple pins, allows different trigger mode per pin.

  This function uses external wakeup feature of RTC controller. It will work even if RTC peripherals are shut down during sleep.

  This feature can monitor any number of pins which are in RTC IOs. Once selected pins go into the state given by level_mode argument, the chip will be woken up.

  Note

  This function does not modify pin configuration. The pins are configured in esp_deep_sleep_start/esp_light_sleep_start, immediately before entering sleep mode.

  Note

  Internal pullups and pulldowns don't work when RTC peripherals are shut down. In this case, external resistors need to be added. Alternatively, RTC peripherals (and pullups/pulldowns) may be kept enabled using esp_sleep_pd_config function. If we turn off the `RTC_PERIPH` domain or certain chips lack the `RTC_PERIPH` domain, we will use the HOLD feature to maintain the pull-up and pull-down on the pins during sleep. HOLD feature will be acted on the pin internally before the system entering sleep, and this can further reduce power consumption.

  Note

  On ESP32-H2, although GPIO7 is an RTC GPIO, it is not led out for external wakeup.

  Parameters:

    - io_mask -- Bit mask of GPIO numbers which will cause wakeup. Only GPIOs which have RTC functionality can be used in this bit map. For different SoCs, the related GPIOs are:

      - ESP32-C6: 0-7

      - ESP32-H2: 7-14

    - level_mask -- Select logic function used to determine wakeup condition per pin. Each bit of the level_mask corresponds to the respective GPIO. Each bit's corresponding position is set to 0, the wakeup level will be low, on the contrary, each bit's corresponding position is set to 1, the wakeup level will be high.

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if any of the selected GPIOs is not an RTC GPIO, or mode is invalid

esp_err_t esp_sleep_enable_gpio_wakeup(void)

  Enable wakeup from light sleep using GPIOs.

  Each GPIO supports wakeup function, which can be triggered on either low level or high level. This method can be used with any IO (RTC or digital), whereas external RTC wakeup is limited to RTC GPIOs. It can only be used to wakeup from light sleep though.

  To enable wakeup, first call gpio_wakeup_enable, specifying gpio number and wakeup level, for each GPIO which is used for wakeup. Then call this function to enable wakeup feature.

  Note

  1. On ESP32, GPIO wakeup source can not be used together with touch or ULP wakeup sources.

  1. If PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is enabled (if target supported), this API is unavailable since the GPIO module is powered down during sleep. You can use `esp_sleep_enable_gpio_wakeup_on_hp_periph_powerdown` instead, or use EXT1 wakeup source by `esp_sleep_enable_ext1_wakeup_io` to achieve the same function. (Only GPIOs which have RTC functionality can be used)

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_STATE if wakeup triggers conflict

esp_err_t esp_sleep_enable_uart_wakeup(int uart_num)

  Enable wakeup from light sleep using UART.

  Use uart_wakeup_setup function to configure UART wakeup mode and parameters.

  Wakeup from light sleep takes some time, so not every character sent to the UART can be received by the application.

  Note

  1. ESP32 does not support wakeup from UART2.

  1. Wakeup mode 0(Active threshold) don't need source clock, but other modes need.

  2. If PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is enabled (if target supported), this API is unavailable since the UART module is powered down during sleep.

  Parameters:

    uart_num -- UART port to wake up from

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if wakeup from given UART is not supported

esp_err_t esp_sleep_enable_bt_wakeup(void)

  Enable wakeup by bluetooth.

  Returns:

    - ESP_OK on success

    - ESP_ERR_NOT_SUPPORTED if wakeup from bluetooth is not supported

esp_err_t esp_sleep_disable_bt_wakeup(void)

  Disable wakeup by bluetooth.

  Returns:

    - ESP_OK on success

    - ESP_ERR_NOT_SUPPORTED if wakeup from bluetooth is not supported

esp_err_t esp_sleep_enable_usb_wakeup(void)

  Enable wakeup by High-Speed USB-OTG.

  Returns:

    - ESP_OK on success

    - ESP_ERR_NOT_SUPPORTED if wakeup from USB is not supported

esp_err_t esp_sleep_disable_usb_wakeup(void)

  Disable wakeup by High-Speed USB-OTG.

  Returns:

    - ESP_OK on success

    - ESP_ERR_NOT_SUPPORTED if wakeup from USB is not supported

esp_err_t esp_sleep_enable_wifi_wakeup(void)

  Enable wakeup by WiFi MAC.

  Returns:

    - ESP_OK on success

esp_err_t esp_sleep_disable_wifi_wakeup(void)

  Disable wakeup by WiFi MAC.

  Returns:

    - ESP_OK on success

esp_err_t esp_sleep_enable_wifi_beacon_wakeup(void)

  Enable beacon wakeup by WiFi MAC, it will wake up the system into modem state.

  Returns:

    - ESP_OK on success

esp_err_t esp_sleep_disable_wifi_beacon_wakeup(void)

  Disable beacon wakeup by WiFi MAC.

  Returns:

    - ESP_OK on success

uint64_t esp_sleep_get_ext1_wakeup_status(void)

  Get the bit mask of GPIOs which caused wakeup (ext1)

  If wakeup was caused by another source, this function will return 0.

  Returns:

    bit mask, if GPIOn caused wakeup, BIT(n) will be set

gpio_num_t esp_sleep_wakeup_io_bit2num(uint32_t bit)

  Convert RTC IO status bit index to GPIO number.

  Used to interpret the bit mask returned by esp_sleep_get_gpio_wakeup_status().

  Parameters:

    bit -- RTC IO bit index (0 to SOC_RTCIO_PIN_COUNT-1).

  Returns:

    GPIO number, or GPIO_NUM_NC if bit is invalid or has no corresponding GPIO.

esp_err_t esp_sleep_pd_config(esp_sleep_pd_domain_t domain, esp_sleep_pd_option_t option)

  Configure power domain options for sleep mode.

  This function provides power domain management for sleep mode, allowing users to control which power domains remain active during sleep to maintain required functionality. The function supports:

  - Automatic power management (ESP_PD_OPTION_AUTO): Power domains are controlled automatically based on system requirements and other peripheral usage.

  - Manual power control (ESP_PD_OPTION_ON/ESP_PD_OPTION_OFF): User can force specific power domains to stay on or off during sleep.

  The management strategy uses reference counting when in manual mode, allowing multiple subsystems to request and release power domain resources safely without interfering with each other. Power domains will only change state when all users have released their requirements.

  Parameters:

    - domain -- power domain to configure

    - option -- power down option (ESP_PD_OPTION_OFF, ESP_PD_OPTION_ON, or ESP_PD_OPTION_AUTO)

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if either of the arguments is out of range

esp_err_t esp_deep_sleep_try_to_start(void)

  Enter deep sleep with the configured wakeup options.

  The reason for the rejection can be such as a short sleep time.

  Note

  In general, the function does not return, but if the sleep is rejected, then it returns from it.

  Returns:

    - No return - If the sleep is not rejected.

    - ESP_ERR_NOT_ALLOWED Since the sleep process disables the cache, the task requesting to enter sleep must have its stack located in internal RAM. Tasks with their stacks in PSRAM are not allowed to request sleep.

    - ESP_ERR_INVALID_STATE VBAT power does not meet the requirements for entering deepsleep

    - ESP_ERR_SLEEP_REJECT sleep request is rejected(wakeup source set before the sleep request)

void esp_deep_sleep_start(void)

  Enter deep sleep with the configured wakeup options.

  Note

  The function does not do a return (no rejection). Even if wakeup source set before the sleep request it goes to deep sleep anyway.

esp_err_t esp_light_sleep_start(void)

  Enter light sleep with the configured wakeup options.

  Returns:

    - ESP_OK on success (returned after wakeup)

    - ESP_ERR_NOT_ALLOWED Since the sleep process disables the cache, the task requesting to enter sleep must have its stack located in internal RAM. Tasks with their stacks in PSRAM are not allowed to request sleep.

    - ESP_ERR_SLEEP_REJECT sleep request is rejected(wakeup source set before the sleep request)

    - ESP_ERR_SLEEP_TOO_SHORT_SLEEP_DURATION after deducting the sleep flow overhead, the final sleep duration is too short to cover the minimum sleep duration of the chip, when rtc timer wakeup source enabled

esp_err_t esp_deep_sleep_try(uint64_t time_in_us)

  Enter deep-sleep mode.

  The device will automatically wake up after the deep-sleep time Upon waking up, the device calls deep sleep wake stub, and then proceeds to load application.

  Call to this function is equivalent to a call to esp_deep_sleep_enable_timer_wakeup followed by a call to esp_deep_sleep_start.

  The reason for the rejection can be such as a short sleep time.

  Note

  In general, the function does not return, but if the sleep is rejected, then it returns from it.

  Parameters:

    time_in_us -- deep-sleep time, unit: microsecond

  Returns:

    - No return - If the sleep is not rejected.

    - ESP_ERR_SLEEP_REJECT sleep request is rejected(wakeup source set before the sleep request)

void esp_deep_sleep(uint64_t time_in_us)

  Enter deep-sleep mode.

  The device will automatically wake up after the deep-sleep time Upon waking up, the device calls deep sleep wake stub, and then proceeds to load application.

  Call to this function is equivalent to a call to esp_deep_sleep_enable_timer_wakeup followed by a call to esp_deep_sleep_start.

  Note

  The function does not do a return (no rejection).. Even if wakeup source set before the sleep request it goes to deep sleep anyway.

  Parameters:

    time_in_us -- deep-sleep time, unit: microsecond

esp_err_t esp_deep_sleep_register_hook(esp_deep_sleep_cb_t new_dslp_cb)

  Register a callback to be called from the deep sleep prepare.

  Warning

  deepsleep callbacks should without parameters, and MUST NOT, UNDER ANY CIRCUMSTANCES, CALL A FUNCTION THAT MIGHT BLOCK.

  Parameters:

    new_dslp_cb -- Callback to be called

  Returns:

    - ESP_OK: Callback registered to the deepsleep misc_modules_sleep_prepare

    - ESP_ERR_NO_MEM: No more hook space for register the callback

void esp_deep_sleep_deregister_hook(esp_deep_sleep_cb_t old_dslp_cb)

  Unregister an deepsleep callback.

  Parameters:

    old_dslp_cb -- Callback to be unregistered

esp_sleep_wakeup_cause_t esp_sleep_get_wakeup_cause(void)

  Get the wakeup source which caused wakeup from sleep.

  Note

  !!! This API will only return one wakeup source. If multiple wakeup sources wake up at the same time, the wakeup source information may be lost.

  Returns:

    cause of wake up from last sleep (deep sleep or light sleep)

uint32_t esp_sleep_get_wakeup_causes(void)

  Get all wakeup sources bitmap which caused wakeup from sleep.

  Returns:

    The bitmap of the wakeup sources of the last wakeup from sleep. (deep sleep or light sleep)

void esp_wake_deep_sleep(void)

  Default stub to run on wake from deep sleep.

  Allows for executing code immediately on wake from sleep, before the software bootloader or ESP-IDF app has started up.

  This function is weak-linked, so you can implement your own version to run code immediately when the chip wakes from sleep.

  See docs/deep-sleep-stub.rst for details.

void esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub)

  Install a new stub at runtime to run on wake from deep sleep.

  If implementing esp_wake_deep_sleep() then it is not necessary to call this function.

  However, it is possible to call this function to substitute a different deep sleep stub. Any function used as a deep sleep stub must be marked RTC_IRAM_ATTR, and must obey the same rules given for esp_wake_deep_sleep().

void esp_set_deep_sleep_wake_stub_default_entry(void)

  Set wake stub entry to default `esp_wake_stub_entry`

esp_deep_sleep_wake_stub_fn_t esp_get_deep_sleep_wake_stub(void)

  Get current wake from deep sleep stub.

  Returns:

    Return current wake from deep sleep stub, or NULL if no stub is installed.

void esp_default_wake_deep_sleep(void)

  The default esp-idf-provided esp_wake_deep_sleep() stub.

  See docs/deep-sleep-stub.rst for details.

void esp_deep_sleep_disable_rom_logging(void)

  Disable logging from the ROM code after deep sleep.

  Using LSB of RTC_STORE4.

esp_err_t esp_sleep_set_console_uart_handling_mode(esp_sleep_uart_handling_mode_t handling_mode)

  Configure how the console UART is handled when entering sleep.

  This function configures the handling behavior for the console UART (CONFIG_ESP_CONSOLE_UART_NUM) during sleep modes. The console UART is typically used for debug output, so its handling mode affects whether debug messages are preserved or discarded before sleep.

  Note

  When CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is enabled, the console UART will always be flushed regardless of the configured mode to ensure debug output is visible even when cache is disabled.

  Parameters:

    handling_mode -- Handling method, one of the following strategies:

    - ESP_SLEEP_AUTO_FLUSH_SUSPEND_UART (default): Automatically selects the appropriate strategy based on sleep type and power domain:

      - Deep sleep: Always flush to avoid data loss

      - Light sleep: Suspend if UART remains powered, flush if UART power domain is powered down

    - ESP_SLEEP_ALWAYS_FLUSH_UART: Wait for all data in TX FIFO to be fully transmitted before entering sleep. Ensures all debug output is visible but increases sleep entry time and power consumption.

    - ESP_SLEEP_ALWAYS_SUSPEND_UART: Wait for current UART frame to complete, then suspend the UART state machine. If UART remains powered during light sleep, transmission resumes after wake. If UART power domain is powered down, unsent data will be lost.

    - ESP_SLEEP_ALWAYS_DISCARD_UART: Discard all unsent data in UART FIFO and enter sleep immediately. Fastest sleep entry and lowest power, but all unsent debug output is lost.

    - ESP_SLEEP_NO_HANDLING: Do not perform any handling on the console UART before sleep. Can be used to disable the default UART handling behavior.

  Returns:

    - ESP_OK on success

    - ESP_ERR_INVALID_ARG if handling_mode is not valid

    - ESP_ERR_NOT_SUPPORTED if no console UART is configured (CONFIG_ESP_CONSOLE_UART_NUM == -1)

esp_err_t esp_sleep_cpu_retention_init(void)

  CPU Power down initialize.

  Returns:

    - ESP_OK on success

    - ESP_ERR_NO_MEM not enough retention memory

esp_err_t esp_sleep_cpu_retention_deinit(void)

  CPU Power down de-initialize.

  Release system retention memory.

  Returns:

    - ESP_OK on success

void esp_sleep_config_gpio_isolate(void)

  Configure to isolate all GPIO pins in sleep state.

void esp_sleep_enable_gpio_switch(bool enable)

  Enable or disable GPIO pins status switching between slept status and waked status.

  Parameters:

    enable -- decide whether to switch status or not

### Macros

ESP_PD_DOMAIN_RTC8M

### Type Definitions

typedef void (*esp_deep_sleep_cb_t)(void)

typedef esp_sleep_source_t esp_sleep_wakeup_cause_t

typedef void (*esp_deep_sleep_wake_stub_fn_t)(void)

  Function type for stub to run on wake from sleep.

### Enumerations

enum esp_sleep_ext1_wakeup_mode_t

  Logic function used for EXT1 wakeup mode.

  Values:

  enumerator ESP_EXT1_WAKEUP_ANY_LOW

    Wake the chip when any of the selected GPIOs go low.

  enumerator ESP_EXT1_WAKEUP_ANY_HIGH

    Wake the chip when any of the selected GPIOs go high.

  enumerator ESP_EXT1_WAKEUP_ALL_LOW

enum esp_sleep_pd_domain_t

  Power domains which can be powered down in sleep mode.

  Values:

  enumerator ESP_PD_DOMAIN_XTAL

    XTAL oscillator.

  enumerator ESP_PD_DOMAIN_XTAL32K

    External 32 kHz XTAL oscillator.

  enumerator ESP_PD_DOMAIN_RC32K

    Internal 32 kHz RC oscillator.

  enumerator ESP_PD_DOMAIN_RC_FAST

    Internal Fast oscillator.

  enumerator ESP_PD_DOMAIN_CPU

    CPU core.

  enumerator ESP_PD_DOMAIN_VDDSDIO

    VDD_SDIO.

  enumerator ESP_PD_DOMAIN_MODEM

    MODEM, includes WiFi, Bluetooth and IEEE802.15.4.

  enumerator ESP_PD_DOMAIN_TOP

    SoC TOP.

  enumerator ESP_PD_DOMAIN_MAX

    Number of domains.

enum esp_sleep_pd_option_t

  Power down options.

  Values:

  enumerator ESP_PD_OPTION_OFF

    Power down the power domain in sleep mode.

  enumerator ESP_PD_OPTION_ON

    Keep power domain enabled during sleep mode.

  enumerator ESP_PD_OPTION_AUTO

    Keep power domain enabled in sleep mode, if it is needed by one of the wakeup options. Otherwise power it down.

enum esp_sleep_source_t

  Sleep wakeup cause.

  Values:

  enumerator ESP_SLEEP_WAKEUP_UNDEFINED

    In case of deep sleep, reset was not caused by exit from deep sleep.

  enumerator ESP_SLEEP_WAKEUP_ALL

    Not a wakeup cause, used to disable all wakeup sources with esp_sleep_disable_wakeup_source.

  enumerator ESP_SLEEP_WAKEUP_EXT0

    Wakeup caused by external signal using RTC_IO.

  enumerator ESP_SLEEP_WAKEUP_EXT1

    Wakeup caused by external signal using RTC_CNTL.

  enumerator ESP_SLEEP_WAKEUP_TIMER

    Wakeup caused by timer.

  enumerator ESP_SLEEP_WAKEUP_TOUCHPAD

    Wakeup caused by touchpad.

  enumerator ESP_SLEEP_WAKEUP_ULP

    Wakeup caused by ULP program.

  enumerator ESP_SLEEP_WAKEUP_GPIO

    Wakeup caused by GPIO (light sleep only on ESP32, S2 and S3)

  enumerator ESP_SLEEP_WAKEUP_UART0

    Wakeup caused by UART0 (light sleep only)

  enumerator ESP_SLEEP_WAKEUP_UART
  enumerator ESP_SLEEP_WAKEUP_UART1

    Wakeup caused by UART1 (light sleep only)

  enumerator ESP_SLEEP_WAKEUP_WIFI

    Wakeup caused by WIFI (light sleep only)

  enumerator ESP_SLEEP_WAKEUP_COCPU

    Wakeup caused by COCPU int.

  enumerator ESP_SLEEP_WAKEUP_COCPU_TRAP_TRIG

    Wakeup caused by COCPU crash.

  enumerator ESP_SLEEP_WAKEUP_BT

    Wakeup caused by BT (light sleep only)

  enumerator ESP_SLEEP_WAKEUP_VAD

    Wakeup caused by VAD.

  enumerator ESP_SLEEP_WAKEUP_VBAT_UNDER_VOLT

    Wakeup caused by VDD_BAT under voltage.

  enumerator ESP_SLEEP_WAKEUP_USB

    Wakeup caused by USB HS (light sleep only)

enum esp_sleep_mode_t

  Sleep mode.

  Values:

  enumerator ESP_SLEEP_MODE_LIGHT_SLEEP

    light sleep mode

  enumerator ESP_SLEEP_MODE_DEEP_SLEEP

    deep sleep mode

enum esp_sleep_uart_handling_mode_t

  UART handling mode before entering sleep.

  These modes define how UARTs are handled when the chip enters sleep mode. The behavior affects data integrity, power consumption, and sleep entry time.

  Values:

  enumerator ESP_SLEEP_AUTO_FLUSH_SUSPEND_UART

    Automatically select flush or suspend based on sleep type and power domain configuration. For deep sleep, always flush. For light sleep, suspend if UART remains powered, flush/discard if UART power domain is powered down.

  enumerator ESP_SLEEP_ALWAYS_FLUSH_UART

    Always wait for all data in TX FIFO to be transmitted before sleep. Ensures data integrity but increases power consumption and sleep entry time.

  enumerator ESP_SLEEP_ALWAYS_SUSPEND_UART

    Suspend UART transmission after current frame completes. If UART remains powered during sleep, transmission resumes after wake. If UART power domain is powered down, unsent data will be lost.

  enumerator ESP_SLEEP_ALWAYS_DISCARD_UART

    Discard all data in TX/RX FIFOs and enter sleep immediately. Fastest sleep entry and lowest power, but all unsent data is lost.

  enumerator ESP_SLEEP_NO_HANDLING

    Do not perform any UART handling before sleep. UART state is not modified.

Was this page helpful?

- Thank you! We received your feedback.
- If you have any comments, fill in Espressif Documentation Feedback Form.

- We value your feedback.
- Let us know how we can improve this page by filling in Espressif Documentation Feedback Form.