此篇博客介绍 ESP 常用的低功耗配置选项。

1.常用功耗优化配置选项

1.1.动态调频

CPU 工作的频率越高,功耗消耗也越大。通过 DFS(dynamic frequency scaling,动态调频)可以让系统自动切换工作频率,达到功耗和性能间的平衡。开启该功能需要使能如图 1-1 的这两项,这样系统会在工作的时候切换到最大频率,在系统空闲时切换到最低频率,最大频率默认为主频,如 ESP32-C3 为 160 MHz, 最低频率为外部主晶振的频率,一般为 40 MHz。最大和最小的频率可以通过调用esp_pm_configure 进行设置。

图 1-1 动态调频配置项

配置项名称 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 模式

图 1-2 自动 light sleep 配置项

配置项名称 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 的自动睡眠后才能启用。

图 1-3 隔离 GPIO 配置项

配置项名称 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_engpio_hold_dis 两个 API,在进入睡眠前对需要保持电平的 GPIO 进行 hold,醒来后进行 hold_dis

1.4. flash 下电

ESP32 通过外接 flash 和 PSRAM 来增大系统存储器资源。flash 具有掉电后数据不丢失特性,PSRAM 掉电后数据无法保持,当系统中没有使用到 PSRAM 时,可以使能 flash 下电功能来降低芯片休眠电流,相关 menuconfig 选项如下:

图 1-4 Flash 掉电配置项

配置项名称

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 断电的安全(比如,突发的异步唤醒源会使得实际的睡眠时间不可控),因此可以对配置项进行以下调整:

图 1-5 Flash 掉电配置优化

这种方式比断电 flash 更好,相比之下增加了十几 μA 的底电流消耗,但同时兼顾了安全性和功耗。

2. Wi-Fi / 蓝牙低功耗优化配置

乐鑫芯片是无线 MCU,因此大部分时候的低功耗功能都需要和 Wi-Fi / 蓝牙功能一起使用。这里对 Wi-Fi / 蓝牙相关的一些低功耗配置和参数进行解释。

2.1.蓝牙低功耗优化项

目前蓝牙端可以优化配置比较少,可以使能 BLE modem sleep

图 2-1 蓝牙低功耗配置

配置项名称 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 后,可以开启这个选项,让无线数字电路模块在关闭物理层的时候也相应的掉电。

图 2-2 无线数字电路掉电配置

配置项名称 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,可以通过增大该参数来减少发包从而降低功耗。

图 2-3 最小等待时间和最大保活时间配置

配置项名称 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 状态。

图 2-4 开启断连电源管理

配置项名称 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等待的窗口期变长,从而大大增加功耗。

使能外部时钟源需要如下配置:

图 3-1 使能外部晶振

配置项名称 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 为外部有源晶振,价格更贵,同时会造成底电流上升晶振的布局可以参考各芯片对应的硬件设计指南。

ESP 常用的低功耗配置选项解析相关推荐

  1. 解剖 Nginx ·自动脚本篇(1)解析配置选项脚本 auto/options

    Author: Poechant Blog: blog.CSDN.net/Poechant Email: zhongchao.ustc#gmail.com (#->@) Date: March ...

  2. 常用oid节点_Oid配置、解析方法、ors客户端、oid节点及其数据库的制作方法_4

    阳203] 所述第一接收单元220,具体用于接收所述父OID节点的DNS数据库基于所述查 询请求发送的DNS资源记录:所述ORS客户端依据所述反馈信息确定OID树的服务配置信 息:所述确定单元230, ...

  3. 常用oid节点_Oid配置、解析方法、ors客户端、oid节点及其数据库的制作方法

    Oid配置.解析方法.ors客户端.oid节点及其数据库的制作方法 [技术领域] [0001] 本发明设及信息处理领域,尤其设及一种OID配置.配置方法.ORS客户端.OID节 点及其数据库. [背景 ...

  4. 理解GRUB2工作原理及配置选项与方法

    GRUB2是借鉴GRUB改写到更加安全强大到多系统引导程序,现在大部分较新的Linux发行版都是使用GRUB2作为引导程序的. GRUB2采用了模块化设计,使得GRUB2核心更加精炼,使用更加灵活,同 ...

  5. 内核编译配置选项含义

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

  6. Linux 内核编译配置选项简介(转)

    Linux 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发,但必须保留作者署名 ...

  7. [转]Linux 2.6.19.x 内核编译配置选项简介

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国,转载地址:http://lamp.linux.gov.cn/Linux/kernel_options.html 版权声明 本文作者是一 ...

  8. Linux 2.6.19.x 内核编译配置选项简介(内核裁剪)

    Linux 2.6.19.x 内核编译配置选项简介 Code maturity level options 代码成熟度选项 Prompt for development and/or incomple ...

  9. Linux 内核配置选项

    Linux 内核配置选项 第一部分 01.Code maturity level options ---> 代码成熟等级选项 01.01. [ ] Prompt for development ...

最新文章

  1. P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)
  2. aspnet中操作excel报com错误的解决方法
  3. C++中,有哪4种与类型转换相关的关键字?各有什么特点?应该在什么场合下使用?
  4. play 连接mysql_Play framework 2.x 连接mysql | 学步园
  5. Python 之 Python2 和 Python3 的区别
  6. 关于nginx upstream的几种配置方式
  7. jquery01-简介+语法+选择器+事件
  8. android 自定义窗口,Android studio如何自定义设置窗口布局?
  9. hdu 1426(DFS+坑爹的输入输出)
  10. 安卓手机上最好用的3个azw3阅读器
  11. php开发人脸识别的步骤,人脸识别的流程及主要技术
  12. 前端web设计师_Web设计师的时尚Web设计主题
  13. 卡耐基:一个人的成功,只有15%是靠专业技术
  14. 显示iPhone已停用,连接iTunes 时,如何解锁又能保留数据
  15. 能够真正骂醒你的励志视频,看完满血复活!
  16. Parsec [error-800] Internet无法访问的解决方案
  17. notifyDataSetInvalidated()和notifyDataSetChanged()有什么区别?
  18. java遍历mysql数据库_java mysql 遍历
  19. 使用本地CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box创建三个k8s集群虚拟机
  20. Revit启动后,如何把你的命令显示在Revit的Ribbon(工具栏)上?

热门文章

  1. windows 10 忘记密码
  2. 2023年Android发展前景展望
  3. MMSE (Minimum Mean Square Error)均衡原理讲解
  4. dz portal.php,discuz如何去掉portal.php
  5. 又到了打流感疫苗时,肿瘤患者能否接种?看看专家的回信!
  6. 【转】如何使用Unity创造动态的2D水体效果
  7. 全球AI企业TOP20榜单
  8. cdc跨时钟域处理-结绳握手法
  9. Android 直播中的悬浮小窗以及封装
  10. Python complex()函数