1. 前言
最近笔者实践了 ESP32 的电源管理,故在此简要记录一些相关知识。如果需要系统的了解电源管理,请查看 espressif 官方文档之电源管理。
2. 电源管理使用方式
主要是在代码中添加如下代码段:
#if CONFIG_PM_ENABLE
// Configure dynamic frequency scaling:
// maximum and minimum frequencies are set in sdkconfig,
// automatic light sleep is enabled if tickless idle support is enabled.
esp_pm_config_esp32_t pm_config = {
.max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ,
.min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ,
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
.light_sleep_enable = true
#endif
};
ESP_ERROR_CHECK( esp_pm_configure(&pm_config) );
#endif // CONFIG_PM_ENABLE
编译时可使用 CONFIG_PM_ENABLE 选项启用电源管理功能。应用程序可以通过调用 esp_pm_configure()
函数启用动态调频 (Dynamic Frequency Scaling) 功能和自动 Light-sleep 模式。
此函数的参数为 esp_pm_config_esp32_t
,定义了频率调节的相关设置。需要初始化里面的参数。此结构体的参数解释如下:
max_freq_mhz
:最大 CPU 频率 (MHz),即获取ESP_PM_CPU_FREQ_MAX
锁后所使用的频率。该字段通常设置为CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ
。min_freq_mhz
:最小 CPU 频率 (MHz),即仅获取ESP_PM_APB_FREQ_MAX
锁后所使用的频率。该字段可设置为晶振 (XTAL) 频率值,或者 XTAL 频率值除以整数。注意,10 MHz 是生成 1 MHz 的REF_TICK
默认时钟所需的最小频率。light_sleep_enable
:没有获取任何管理锁时,决定系统是否需要自动进入 Light-sleep 状态 (true/false)。
注:自动 Light-sleep 模式基于 FreeRTOS Tickless Idle 功能,因此如果在 menuconfig 中没有启用 CONFIG_FREERTOS_USE_TICKLESS_IDLE 选项,在请求自动 Light-sleep 时,esp_pm_configure() 将会返回 ESP_ERR_NOT_SUPPORTED 错误。
在 Light-sleep 状态下,外设设有时钟门控,不会产生来自 GPIO 和内部外设的中断。Sleep Modes 文档中所提到的唤醒源可用于从 Light-sleep 状态触发唤醒。例如,EXT0 和 EXT1 唤醒源就可以通过 GPIO 唤醒芯片。
3. 电源管理锁
应用程序可以通过获取或释放管理锁来控制电源管理算法。应用程序获取电源管理锁后,电源管理算法的操作将受到下面的限制。释放电源管理锁后,限制解除。ESP32 支持以下三种电源管理锁。
ESP_PM_CPU_FREQ_MAX
:请求使用 esp_pm_configure() 将 CPU 频率设置为最大值。ESP32 可以将该值设置为 80 MHz、160 MHz 或 240 MHz。ESP_PM_APB_FREQ_MAX
:请求将 APB 频率设置为最大值,ESP32 支持的最大频率为 80 MHz。ESP_PM_NO_LIGHT_SLEEP
:禁止自动切换至 Light-sleep 模式。
注:APB 为 Advanced Peripheral Bus。
来源:CSDN
作者:BigZombieZ
链接:https://blog.csdn.net/zztiger123/article/details/103804052