前言
关于ESP32的电源管理功能使用,遇到过以下几个问题,现与大家分享出来。
一、 使用 CONFIG_PM_ENABLE选项在编译时启用电源管理:
问题一:只启用电源管理系统一定程度上会降低运行功耗吗?
回答:会
问题二:只启用电源管理系统的CPU频率、APB频率会根据电源管理算法进行调整吗?
回答:会的
二、在上述(1)的基础上,调用esp_pm_configrue()函数,在eps_pm_config_esp32_t结构体中,设置max_freq_mhz=CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ;min_freq_mhz= 40;light_sleep_enable=false;
问题一:系统在何时调用esp_pm_configrue()函数?
回答:app_main 中 nvs 初始化后调用,参考官方的 power save 例程就行。
wifi power save: examples/wifi/power_save/main/power_save.c
BLE power save: examples/bluetooth/nimble/power_save/main/main.c
问题二:只要调用了esp_pm_configrue()函数就算启动了动态调频吗?
回答:相关代码如下:参考 example/wifi/power_save 即可,里面有一段,这段就是在程序里配置动态调频,实际要用的时候,在app main 最开始加这段代码就行。
问题三:根据手册讲解,对于不受APB频率变更影响(UART、LEDC、RMT、GPTimer、TSENS),以及能够感知动态调频(SPImaster、I2C、I2S、SDMMC),以及驱动程序可占用ESP_PM_APB_FREQ_MAX锁的,这三部分,是不需要应用程序做一些操作电源锁的处理的是吗?我应用程序需要使用电源锁的只是无法感知动态调频的外设驱动是吗?
回答:这个可以参照编程指南 https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-reference/system/power_management.html#id5
问题四:light_sleep_enable的实现,必须要32.768khz的外部晶振?
回答:不必须,但是如果是蓝牙的 auto light sleep,需要用外接晶振,不然没法完全进入睡眠,功耗会增加。
三、对于电源锁的理解
问题一:例如我有两个任务,task1跟task2,如果我task1获取了ESP_PM_CPU_FREQ_MAX电源锁,task1的cpu频率是240mHz,同时task2没有获取任何电源锁,这时task2的cpu频率是esp_pm_configrue()函数这是的max_freq_mhz频率吗?
回答:1.看用的是什么锁,锁有三种,一种是禁止进入睡眠的锁,一种是CPU频率最大值的锁,一种是APB频率最大值的锁,可以一起用,可以单独用其中一种,只用禁止睡眠锁就对频率没什么影响。2.获取到锁后只有再调用释放才会恢复,所以一个task里锁住了,对其他 task 也会有影响。
问题二:动态调频完全是靠电源锁来控制的吗?如果系统的任务没有获取任何电源锁,系统的CPU频率APB频率都不会变化的是吗?
回答:锁的作用是限制住不让频率变,不用锁会自己调节。
问题三:手册里有个矛盾点,如下图对min_freq_mhz的解释是获取APB锁后使用的频率,但是在电源管理算法中,获取APB锁后,cpu频率是如下图所示的,这个区别是因为什么?
回答:关于 min_freq_mhz 这部分描述得不太准确,应该是:
使能 light sleep 时,min_freq_mhz 为最小 CPU 频率 (MHz),即仅获取ESP_PM_NO_LIGHT_SLEEP 锁后所使用的频率。未使能 light sleep 时,min_freq_mhz 为释放所有电源管理锁或仅获取ESP_PM_NO_LIGHT_SLEEP锁后 CPU 的运行频率。