ESP32睡眠模式及其功耗详解
ESP32睡眠模式及其功耗详解
ESP32作为一款高性能的WiFi/MCU系统级芯片,在物联网项目中广泛应用。然而,其功耗问题一直是开发者关注的重点。本文将详细介绍ESP32的五种睡眠模式及其功耗特点,帮助开发者更好地优化项目功耗,延长电池寿命。
什么是ESP32睡眠模式?
ESP32睡眠模式是一种省电状态,当设备不使用时可以进入该状态。在睡眠模式下,ESP32会切断所有不必要的数字外设电源,同时RAM接收到的电源仅够保留数据。
ESP32芯片内部
ESP32芯片的核心是一个双核32位微处理器,带有448 KB的ROM、520 KB的SRAM和4MB的闪存。它还包含WiFi模块、蓝牙模块、加密加速器、RTC模块和许多外围设备。
ESP32电源模式
ESP32提供了5种可配置的电源模式:
- 活动模式
- 调制解调器睡眠模式
- 浅睡眠模式
- 深度睡眠模式
- 休眠模式
每种模式都有其独特的功能和节能效果。让我们逐一了解这些模式。
ESP32活动模式
活动模式下,芯片的所有功能都处于激活状态。由于需要保持WiFi模块、处理核心和蓝牙模块始终开启,芯片需要240mA以上的电流才能工作。如果同时使用WiFi和蓝牙功能,有时会出现高达790mA的高功率峰值。
根据ESP32数据表,在射频工作的情况下,活动模式下的功耗如下:
显然,这是最耗电的模式。为了节省电力,必须在不使用时禁用这些功能。
ESP32调制解调器睡眠
在调制解调器睡眠模式下,WiFi、蓝牙和无线通信被禁用,而CPU保持运行状态,时钟可配置。在这种模式下,芯片在低速时消耗约3mA,在高速时消耗20mA。
为了保持WiFi/蓝牙连接处于活动状态,CPU、Wi-Fi、蓝牙和无线通信将按预定义的时间间隔唤醒。这就是所谓的关联睡眠模式。在此睡眠模式期间,电源模式在活动模式和调制解调器睡眠模式之间切换。
ESP32只有在以Station模式连接到路由器时才能进入调制解调器睡眠模式。ESP32通过DTIM信标机制保持与路由器的连接。为了省电,ESP32在两个DTIM信标间隔之间禁用Wi-Fi模块,并在下一个信标到达之前自动唤醒。睡眠时间由路由器的DTIM信标间隔时间决定,通常为100ms到1000ms。
什么是DTIM信标机制?
DTIM是英文Delivery Traffic Indication Message的缩写。在DTIM信标机制中,接入点(AP)/路由器定期发送信标帧。每个帧包含有关网络的所有信息。它用于宣布无线网络的存在并同步所有连接的成员。
ESP32轻度睡眠
轻度睡眠的工作模式与调制解调器睡眠的工作模式相似。该芯片还遵循关联睡眠模式。区别在于,在轻睡眠模式下,数字外围设备、大多数RAM和CPU都是时钟选通的。
什么是时钟选通?
时钟选通是一种降低动态功耗的技术。它通过关闭时钟脉冲来禁用部分电路,这样电路中的触发器就不必切换状态。切换状态是需要消耗功率的,如果不切换,功耗将变为零。
在轻度睡眠模式下,CPU通过关闭其时钟脉冲来暂停,而RTC和ULP协处理器保持活动状态。这导致功耗低于调制解调器睡眠模式(约0.8mA)。
在进入轻度睡眠模式之前,ESP32保持其内部状态,并在退出睡眠后恢复操作。这被称为全RAM保留。esp_light_sleep_start()函数可用于在配置唤醒源后进入轻度睡眠。
ESP32深度睡眠
在深度睡眠模式下,CPU、大部分RAM和所有数字外围设备都会断电。芯片上唯一保持通电的部分是:RTC控制器、RTC外围设备(包括ULP协处理器)和RTC内存(慢和快)。芯片功耗约为0.15 mA(如果ULP协处理器已通电)至10µA。
在深度睡眠模式下,主CPU断电,而ULP协处理器根据传感器的测量数据进行传感器测量并唤醒主系统。这种睡眠模式称为ULP传感器监测模式。
除了CPU之外,芯片的主存储器也被禁用。因此,存储在该内存中的所有内容都将被擦除,无法访问。但是,RTC内存保持通电状态。因此,它的内容在深度睡眠时被保存下来,在我们叫醒芯片后可以取回。这就是原因,该芯片在禁用Wi-Fi和蓝牙连接数据之前,会将其存储在RTC内存中。
因此,如果要在重新启动时使用数据,请通过定义具有RTC_DATA_ATTR属性的全局变量将其存储到RTC内存中。例如,RTC_DATA_ATTR int bootCount = 0;
在深度睡眠模式下,除RTC模块外,整个芯片的电源被切断。因此,任何不在RTC恢复内存中的数据都将丢失,因此芯片将通过重置重新启动。这意味着程序再次从头开始执行。
提示
ESP32支持在深度睡眠结束后运行深度睡眠唤醒存根stub。该函数在芯片唤醒后立即运行–在任何正常初始化之前,引导加载程序代码运行。唤醒存根运行后,芯片可以恢复睡眠或继续正常启动。
stub的官方说明:
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/deep-sleep-stub.html
与其他睡眠模式不同,系统无法自动进入深度睡眠模式。esp_deep_sleep_start()函数可用于在配置唤醒源后立即进入深度睡眠。
默认情况下,ESP32将自动关闭唤醒源不需要的外围设备的电源。但您可以选择关闭/保持哪些外围设备。有关更多信息,请查看API文档:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/
要了解有关ESP32深度睡眠及其唤醒来源的更多信息,请访问以下教程。
https://lastminuteengineers.com/esp32-deep-sleep-wakeup-sources/
ESP32深度睡眠实验
这里有一篇实验文章《ESP32深度睡眠电流怎样低于10uA》
https://zhuanlan.zhihu.com/p/521640890
https://blog.csdn.net/chentuo2000/article/details/125033711?spm=1001.2014.3001.5502
ESP32休眠模式
与深度睡眠模式不同,在休眠模式下,芯片还禁用内部8MHz振荡器和ULP协处理器。RTC恢复内存也已断电,这意味着我们无法在休眠模式下保留任何数据。除慢时钟上只有一个RTC计时器和一些RTC GPIO处于活动状态外(他们负责将芯片从休眠模式唤醒),其他所有功能均已关闭。这进一步降低了功耗。该芯片仅在休眠模式下消耗约2.5µA。
本文原文来自:https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/