| 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 | ESP32-S31 |
|---|
Power Management Example
(See the README.md file in the upper level 'examples' directory for more information about examples.)
This example demonstrates power management (PM) locks with multiple tasks: one task holds ESP_PM_CPU_FREQ_MAX during a short critical section, another holds ESP_PM_NO_LIGHT_SLEEP during a short awake window, and a third task periodically dumps PM config and lock/mode stats. Locks are used only where needed so the system can lower CPU frequency or enter light sleep the rest of the time.
How to Use Example
Hardware Required
Any supported ESP development board.
Configure the Project
Run idf.py menuconfig. Under Example Configuration you can set:
- Max CPU frequency (MHz) — CPU frequency when ESP_PM_CPU_FREQ_MAX PM lock is held.
- Min CPU frequency (MHz) — CPU frequency when no PM lock is held.
- Enable automatic light sleep when idle — When enabled (and tickless idle is enabled), the chip may enter light sleep when no PM lock is held. Default is on if tickless idle is enabled.
Enable PM under Component config → Power Management → Support for power management. The example uses sdkconfig.defaults to set CONFIG_PM_ENABLE and CONFIG_FREERTOS_USE_TICKLESS_IDLE. PM is not supported with SMP FreeRTOS; the example sets CONFIG_FREERTOS_SMP=n.
Build and Flash
Build the project, flash it to the board, and run the serial monitor:
idf.py -p PORT flash monitor
(Replace PORT with your serial port. Exit monitor with Ctrl-].)
Example Output
At startup the example prints the PM config. The pm_dump task then prints PM config and lock/mode stats every 10 seconds; the two demo tasks do not log.
=== Power Management Example (multi-task) ===
I (319) pm: Frequency switching config: CPU_MAX: 400, APB_MAX: 100, APB_MIN: 40, Light sleep: ENABLED
PM configured: max=400 min=40 MHz, light_sleep_enable=1
I (330) main_task: Returned from app_main()
--- PM: max_freq=400 min_freq=40 MHz, light_sleep=1 ---
Time since boot up: 10044534 us
Lock stats:
Name Type Arg Active Total_count Time(us) Time(%)
background NO_LIGHT_SLEEP 0 0 20 2998011 30 %
critical_work CPU_FREQ_MAX 0 1 21 1000507 10 %
rtos1 CPU_FREQ_MAX 0 1 4087 141343 2 %
rtos0 CPU_FREQ_MAX 0 0 4076 184970 2 %
Mode stats:
Mode CPU_freq Time(us) Time(%)
SLEEP 40 M 5958343 59%
APB_MIN 40 M 2848902 28%
APB_MAX 100M 0 0 %
CPU_MAX 400M 1205696 11%
Sleep stats:
light_sleep_counts:40 light_sleep_reject_counts:0
The same block repeats every 10 seconds.