examples/system/deep_sleep/README.md
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-H21 | ESP32-H4 | ESP32-P4 | ESP32-S2 | ESP32-S3 |
|---|
(See the README.md file in the upper level 'examples' directory for more information about examples.)
The deep sleep mode is a power saving mode that causes the CPU, majority of RAM, and digital peripherals that are clocked from APB_CLK to be powered off. Deep sleep mode can be exited using one of multiple wake up sources. This example demonstrates how to use the esp_sleep.h API to enter deep sleep mode, then wake up form different sources.
The following wake up sources are demonstrated in this example (refer to the Wakeup Sources documentation for more details regarding wake up sources):
[!NOTE] Some wake up sources can be disabled via configuration (see section on project configuration)
It is recommended to use a development board with an external USB-UART chip to debug this example. If you're using the USB-Serial-JTAG port to view logs from this example, note that the internal USB peripheral will be disabled during deep_sleep for power saving. This will result in:
- Serial output interruption
- Host-side errors like ClearCommError failed
- Windows may show "Unknown USB device"
- Even after wakeup, USB connection may not automatically recover
[!WARNING] On ESP32, touch wake up source cannot be used together with EXT0 wake up source. If they co-exist, IDF will give a runtime error and the program will crash. By default in this example, touch wake up is enabled, and the other two are disabled. You can switch to enable the other wake up >sources via menuconfig.
In this example, the
CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEPKconfig option is used, which allows you to reduce the boot time of the bootloader during waking up from deep sleep. The bootloader stores in RTC memory the address of a running partition and uses it when it wakes up (ESP32-C2 does not have RTC memory, so a running partition cannot be saved there, instead the partition table is read to select an application). This example allows you to skip all image checks and speed up the boot.
This example should be able to run on any commonly available ESP32 series development board without any extra hardware if only Timer wake up sources is used. However, the following extra connections will be required for the remaining wake up sources.
EXT0: Connect GPIO25 in ESP32 or GPIO3 in ESP32-S2/S3 to HIGH to trigger a wake up.
EXT1: GPIO2 and GPIO4 should be connected to LOW to avoid floating pins. When triggering a wake up, connect one or both of the pins to HIGH. Note that floating pins may trigger a wake up.
GPIO: If EXAMPLE_GPIO_WAKEUP_HIGH_LEVEL is selected in menuconfig, then connect EXAMPLE_GPIO_WAKEUP_PIN to HIGH to trigger a wake up; Otherwise, connect EXAMPLE_GPIO_WAKEUP_PIN to LOW to trigger a wake up.
idf.py menuconfig
Example configuration > Enable wakeup from GPIO (ext0)Example configuration > Enable wakeup from GPIO (ext1)Example configuration > Enable wakeup from GPIO
Trigger pin can be chosen via Example configuration > GPIO wakeup configuration > Enable wakeup from GPIO
Trigger level can be selected via Example configuration > GPIO wakeup configuration > Enable GPIO high-level wakeupWake up sources that are unused or unconnected should be disabled in configuration to prevent inadvertent triggering of wake up as a result of floating pins.
Build the project and flash it to the board, then run monitor tool to view serial output:
idf.py -p PORT flash monitor
(Replace PORT with the name of the serial port to use.)
(To exit the serial monitor, type Ctrl-].)
See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects.
On initial startup, this example will detect that this is the first boot and output the following log:
...
I (304) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Not a deep sleep reset
Enabling timer wakeup, 20s
Enabling EXT1 wakeup on pins GPIO2, GPIO4
Entering deep sleep
The ESP32 will then enter deep sleep. When a wake up occurs, the ESP32 must undergo the entire boot process again. However the example will detect that this boot is due to a wake up and indicate the wake up source in the output log such as the following:
...
I (304) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Wake up from timer. Time spent in deep sleep: 20313ms
Initial T=87, latest T=87
Enabling timer wakeup, 20s
Enabling EXT1 wakeup on pins GPIO2, GPIO4
Entering deep sleep