此篇博客介绍 ESP 常用的低功耗配置选项。
1.常用功耗优化配置选项
1.1.动态调频
CPU 工作的频率越高,功耗消耗也越大。通过 DFS(dynamic frequency scaling,动态调频)可以让系统自动切换工作频率,达到功耗和性能间的平衡。开启该功能需要使能如图 1-1 的这两项,这样系统会在工作的时候切换到最大频率,在系统空闲时切换到最低频率,最大频率默认为主频,如 ESP32-C3 为 160 MHz, 最低频率为外部主晶振的频率,一般为 40 MHz。最大和最小的频率可以通过调用esp_pm_configure 进行设置。
配置项名称 | PM_ENABLE |
---|---|
配置项路径 | (Top) -> Component config -> Power Management -> Support for power management |
配置项名称 | PM_DFS_INIT_AUTO |
配置项路径 | (Top) -> Component config -> Power Management -> Support for power management -> Enable dynamic frequency scaling (DFS) at startup |
注意:如果是带有 Wi-Fi 应用的自动调频,最小频率不能小于 40 MHz。
1.2.自动 light sleep
在开启动态调频后如果需要进一步降低功耗,如图 1-2 所示,需要开启自动 light sleep。 Modem sleep 模式加上自动 light sleep 也就是我们常说的 power save 模式。
配置项名称 | FREERTOS_HZ |
---|---|
配置项路径 | (Top) -> Component config -> FreeRTOS -> Tick rate (Hz) |
配置项名称 | FREERTOS_USE_TICKLESS_IDLE |
配置项路径 | (Top) -> Component config -> FreeRTOS -> Tickless idle support |
这里涉及两个配置项,A 项为 FreeRTOS 的 Tick 频率,默认为 100,即每个 Tick 需要 1000 / 100 = 10 ms。B 项是自动进入 light sleep 状态需要的最小空闲 Tick 数,默认为 3,即
当系统检测到空闲时间大于 3 个 Tick 时就会自动进入 light sleep。如上图所示,当空闲时间大于 3 * 10 = 30 ms 时系统将自动进入 light sleep。通过增加 A 项,可以让系统更敏感地检测到空闲时间并进入睡眠。如将 tick rate 配置为 1000,即当 3 ms 内没有任务工作就进入睡眠,从而达到更低的功耗。
注意:
1.自动进入 light sleep 必须在使能 2.1 的配置项后才能进行配置。
2.在开启了自动调频和自动睡眠后,一些外设的通信会受到影响,具体可以参照编程指南。
1.3.隔离 GPIO
系统休眠过程中的 GPIO 漏电会产生电流损耗,增大系统功耗。esp-idf 中 light sleep 休眠时通过 GPIO 管脚悬空(禁止管脚内部上下拉电阻)及隔离(断开管脚输入输出)来消除 GPIO 漏电流,该功能对应的 menuconfig 配置项如下。
注意:该配置项必须在使能 2.2 的自动睡眠后才能启用。
配置项名称 | PM_SLP_DISABLE_GPIO |
---|---|
配置项路径 | (Top) -> Component config -> Power Management -> Disable all GPIO when chip at sleep |
打开该选项,系统休眠过程中所有 GPIO 管脚将被禁用,消除了 GPIO 漏电对休眠功耗的影响,但也导致了休眠过程中 GPIO 无法进行信号输入和输出,然而在一些应用中,应用层希望在系统休眠过程中能够正常使用 GPIO 功能(输入/输出/内部上下拉),因此 IDF 中提供了一组 API 用于管理休眠过程中的 GPIO 状态,相关 API 参考如下: |
休眠过程 GPIO 管理 API:
-
设置休眠状态下的 GPIO 输入输出状态
gpio_sleep_set_direction
-
设置休眠状态下的 GPIO 上下拉状态
gpio_sleep_set_pull_mode
-
使能自动 GPIO 状态切换
gpio_sleep_sel_en
-
禁止自动 GPIO 状态切换
gpio_sleep_sel_dis
如果想在睡眠时保持 GPIO 管脚的状态,比如控制灯输出,控制开关闭合,可以使用 gpio_hold_en
和 gpio_hold_dis
两个 API,在进入睡眠前对需要保持电平的 GPIO 进行 hold,醒来后进行 hold_dis
。
1.4. flash 下电
ESP32 通过外接 flash 和 PSRAM 来增大系统存储器资源。flash 具有掉电后数据不丢失特性,PSRAM 掉电后数据无法保持,当系统中没有使用到 PSRAM 时,可以使能 flash 下电功能来降低芯片休眠电流,相关 menuconfig 选项如下:
配置项名称 | ESP_SYSTEM_PD_FLASH (release/v4.3) ESP_SLEEP_POWER_DOWN_FLASH (4.4以后) |
---|---|
配置项路径 | (Top) -> Component config -> ESP System Settings -> PD flash at light sleep when there is no SPIRAM (release/v4.3) (Top) -> Component config -> Hardware Settings -> Sleep Config -> Power down flash in light sleep when there is no SPIRAM (4.4以后) |
注意:现实情况中 flash 断电所需的时间很难预测,即使可以预知 flash 彻底断电所需的时间,有时也不能通过设置足够长的睡眠时间来确保 flash 断电的安全(比如,突发的异步唤醒源会使得实际的睡眠时间不可控),因此可以对配置项进行以下调整:
这种方式比断电 flash 更好,相比之下增加了十几 μA 的底电流消耗,但同时兼顾了安全性和功耗。
2. Wi-Fi / 蓝牙低功耗优化配置
乐鑫芯片是无线 MCU,因此大部分时候的低功耗功能都需要和 Wi-Fi / 蓝牙功能一起使用。这里对 Wi-Fi / 蓝牙相关的一些低功耗配置和参数进行解释。
2.1.蓝牙低功耗优化项
目前蓝牙端可以优化配置比较少,可以使能 BLE modem sleep
配置项名称 | BT_CTRL_MODEM_SLEEP |
---|---|
配置项路径 | (Top) -> Component config -> Bluetooth -> Bluetooth -> Bluetooth controller -> MODEM SLEEP Options |
如果想在保活的时候不是进入 modem sleep 而是 light sleep,参考2.2的做法即可。
蓝牙需要使用 32 K 外接晶振。
2.2. Wi-Fi 低功耗优化项
Wi-Fi 优化涉及的配置项较多,比较通用的有以下几点:
2.2.1.无线数字电路掉电
在使能自动 light sleep 后,可以开启这个选项,让无线数字电路模块在关闭物理层的时候也相应的掉电。
配置项名称 | ESP_PHY_MAC_BB_PD |
---|---|
配置项路径 | (Top) -> Component config -> PHY -> Power down MAC and baseband of Wi-Fi and Bluetooth when PHY is disabled |
2.2.2.更改最小等待时间和最大保活时间
当 ESP32 作为 STA 和 AP进行通信时,接收完一次数据后需要等待一段时间再关闭 RF,这个时间称为 Minimum active time,默认值为50 ms, 在保证每次数据吞吐量的基础上,可以适当减少这个等待时间来降低功耗。
而当 ESP32 处于power save 模式下时,需要周期性的给 AP 发送一个 keep alive 包来告诉 AP 自己还保持着连接。Maximum keep alive time就是发送这个 keep alive 包的时间周期,默认为 10 s,可以通过增大该参数来减少发包从而降低功耗。
配置项名称 | ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME |
---|---|
配置项路径 | (Top) -> Component config -> Wi-Fi -> WiFi SLP IRAM speed optimization -> Minimum active time |
配置项名称 | ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME |
配置项路径 | (Top) -> Component config -> Wi-Fi -> WiFi SLP IRAM speed optimization -> Maximum keep alive time |
推荐配置:Minimum active time = 15~20,Maximum keep alive time = 60。
2.2.3.开启断连电源管理
使能该配置项后,发生断连时依旧可以保持 Modem sleep 状态。
配置项名称 | ESP_WIFI_STA_DISCONNECTED_PM_ENABLE |
---|---|
配置项路径 | (Top) -> Component config -> Wi-Fi -> Power Management for station at disconnected |
2.2.4.开启 Beacon lost 优化(仅release/v4.4 及以上)
配置项名称 | ESP_WIFI_SLP_BEACON_LOST_OPT |
---|---|
配置项路径 | (Top) -> Component config -> Wi-Fi -> Wifi sleep optimize when beacon lost |
3.补充内容
3.1. DTIM 和 listen interval 的区别
当芯片作为 STA 和路由器建立连接的时候,会被告知路由器的 DTIM,即每隔多少时间路由器会发送一个 beacon, STA 需要在这个时间起来接收 beacon,查看是否有需要自己处理的信息。而 listen interval 则是 STA 告诉路由,我需要隔多少时间起来接受 beacon,即前者是根据路由端来定的,后者是可以自己配置到芯片里的。时间间隔为DTIM 或者 listen interval 的数字 * 100 ms,如果当 DTIM = 10,即每次唤醒的时间间隔为 10 * 100 ms = 1 s。
3.2.外接 32 KHz 晶振
使用外接 32 KHz 晶振可以获得更低的功耗。主要有以下几个原因:
内部的晶振容易受到干扰,相比之下外接晶振的精度更高,并可以在各种睡眠情况下使用。
对于时间精度要求比较高的应用,如蓝牙和 Wi-Fi 的保活,需要定时起来接受 beacon,一旦时钟漂移过大,错过了接收的点,会导致打开RF等待的窗口期变长,从而大大增加功耗。
使能外部时钟源需要如下配置:
配置项名称 | ESP32C3_RTC_CLK_SRC_EXT_CRYS |
---|---|
配置项路径 | (Top) -> Component config -> ESP32XX-Specific -> RTC clock source |
外部晶振有两种,External 32 kHz crystal 为外部无源晶振,也是大部分时候推荐的晶振,External 32 kHz oscillator at 32K_XP pin 为外部有源晶振,价格更贵,同时会造成底电流上升晶振的布局可以参考各芯片对应的硬件设计指南。