【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程
1. 简介
ESP32支持5种低功耗模式,低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。
1.1 RTC单元
RTC单元是ESP32低功耗管理的核心,可用于管理低功耗模式的进入和退出,控制时钟源、PLL、电源开关和隔离单元以产生电源门控、时钟门控和复位信号。
RTC单元主要包含以下几个模块:
- RTC主状态机:记录电源状态;
- 数字和模拟电源控制器:可用于为RTC的数字模块和模拟模块生成电源门控/时钟门控信号;
- 睡眠和唤醒控制器:可处理低功耗模式的进入和退出;
- 计时器:包括RTC主计时器、ULP协处理器计时器和触摸计时器;
- 低功耗处理器和传感器控制器:ULP协处理器、触摸控制器、SAR ADC控制器等;
- 保留内存:RTC慢速内存,绝大部分用作保留内存或存储ULP协处理器的指令和数据内存;RTC快速内存,绝大部分用作保留内存;
- 保留寄存器:该寄存器永远开启,可用于数据存储;
- RTC IO管脚:18 个“always-on”管脚,通常作为唤醒源。
1.2 低功耗时钟
在低功耗模式下,ESP32的40 MHz晶振和PLL通常将断电以降低功耗,转而使用低功耗时钟维持工作。
RTC模块可以使用5个低功耗时钟源:
- 外部低速晶振时钟XTL32K_CLK(32.768 kHz);
- 外部高速晶振时钟XTAL_DIV_CLK(2 MHz ~ 40 MHz);
- 内部RC振荡器RC_SLOW_CLK(频率可调,通常为150 kHz);
- 内部8MHz振荡器RC_FAST_CLK;
- 内部31.25 kHz时钟RC_FAST_DIV_CLK(来自内部8MHz振荡器,256分频)。
以上的时钟源在RTC内部会区分成慢速时钟和快速时钟,每个RTC内部模块所使用的时钟类型是不同的;像RTC定时器、RTC主状态机和电源管理模块使用的是慢速时钟,ULP协处理器、传感器控制器、RTC内存和RTC寄存器使用的是快速时钟。
对于数字内核(无线模块)则可以使用上面的4种时钟源。
1.3 低功耗模式
1. Active模式
- CPU的工作时钟为XTAL_DIV_N(40 MHz/26 MHz)或PLL(80 MHz/160 MHz/240 MHz);
- 芯片可以接收、发射或监听信号。
2. Modem-sleep模式
- CPU可以工作,时钟可以配置;
- Wi-Fi/蓝牙基带受时钟门限控制或关闭,射频模块关闭;
- PLL 为 80 MHz 时,电流消耗:≈ 30 mA;
- XTAL 为 2 MHz 时,电流消耗:≈ 3 mA;
- 即刻唤醒;
3. Light-sleep模式
- 内部 8 MHz 振荡器、40 MHz 高速晶振、PLL 及射频模块均禁用;
- 数字内核时钟受门限限制,CPU暂停工作;
- ULP 协处理器和触摸控制器可以周期性触发,对传感器进行监测;
- 电流消耗:≈ 800 µA;
- 唤醒延迟:< 1 ms;
4. Deep-sleep模式
- 内部 8 MHz 振荡器、40 MHz 高速晶振、PLL 及射频模块均禁用;
- 数字内核断电,CPU内容丢失;
- RTC 内核的供电电压降至 0.7V;
- 8 x 32 位数据保存在通用保留寄存器中;
- RTC 内存和快速 RTC 内存可以保持;
- 电流消耗:≈ 6.5 µA;
- 唤醒延迟:< 1 ms。
5. 休眠模式
- 内部 8 MHz 振荡器、40 MHz 高速晶振、PLL 及射频模块均禁用;
- 数字内核断电,CPU 内容丢失;
- RTC 外设域断电;
- RTC 内核的供电电压降至 0.7V;
- 8 x 32 位数据保存在通用保留寄存器中;
- RTC 内存和快速 RTC 内存断电;
- 电流消耗:≈ 4.5 µA;
- 唤醒源:仅支持 RTC 计时器;
- 唤醒延迟:< 1 ms。
1.4 唤醒源
唤醒源 | Light-sleep | Deep-sleep | 休眠 |
---|---|---|---|
EXT0 | Y | Y | N |
EXT1 | Y | Y | Y |
GPIO | Y | Y | N |
RTC定时器 | Y | Y | Y |
SDIO | Y | N | N |
WiFi | Y | N | N |
UART0 | Y | N | N |
UART1 | Y | N | N |
TOUCH | Y | Y | N |
ULP协处理器 | Y | Y | N |
蓝牙 | Y | N | N |
2. 例程
2.1 RTC定时器唤醒
这个例程中配置RTC定时器,使处理器在进入深度睡眠后5秒自动唤醒。
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "esp_sleep.h"#include <string.h>#define TAG "app"int app_main()
{while (1) {ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(5 * 1000000));ESP_LOGI(TAG, "Enter deep sleep");esp_deep_sleep_start();ESP_LOGI(TAG, "Exit deep sleep");}
}
idf对低功耗的封装是比较完善的,仅需两个函数就可以完成。
esp_sleep_enable_timer_wakeup配置定时器唤醒的时间,单位为微秒。
默认情况下,RTC定时器的时钟源选择的是RC_SLOW_CLK,即内部150kHz振荡器,因为该时钟源的功耗是最小的。如果需要更改时钟源,需要修改CONFIG_RTC_CLK_SRC编译选项。
esp_deep_sleep_start使处理器进入深度睡眠模式;当然也可以调用esp_light_sleep_start进入浅睡眠模式。
下面就是程序的系统打印log。需要注意的是,因为深度睡眠下CPU会断电,内部寄存器的内容丢失,所以唤醒后程序是从头开始执行的。
2.2 按键唤醒
这个例程中配置处理器进入深度睡眠,使用GPIO按键唤醒。
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "esp_sleep.h"
#include "driver/rtc_io.h"#include <string.h>#define TAG "app"int app_main()
{esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();if (cause == ESP_SLEEP_WAKEUP_EXT0) {ESP_LOGI(TAG, "Wake up by EXT0");}while (1) {ESP_ERROR_CHECK(esp_sleep_enable_ext0_wakeup(0, 0));ESP_ERROR_CHECK(rtc_gpio_pullup_en(0)); // 内部上拉ESP_ERROR_CHECK(rtc_gpio_pulldown_dis(0));ESP_LOGI(TAG, "Enter deep sleep");esp_deep_sleep_start();}
}
如果要在深度睡眠模式下使用GPIO唤醒,必须使用RTC GPIO,ESP32中只有部分GPIO可以复用为该功能。
我使用的是IO0作为唤醒脚。esp_sleep_enable_ext0_wakeup函数传入唤醒IO号和唤醒电平;0就是低电平唤醒,1就是高电平唤醒。
rtc_gpio_pullup/pulldown_dis/en函数配置GPIO的上下拉,我设置成上拉模式。这里要注意即使板子上的IO带了硬件上下拉,但是进入深度睡眠是会关闭VDD电源的,所以还是需要配置。
同样使用esp_deep_sleep_start进入深度睡眠。
下面就是按键唤醒后的系统log。
相关文章:

【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程
1. 简介 ESP32支持5种低功耗模式,低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。 1.1 RTC单元 RTC单元是ESP32低功耗管理的核心,可用于管理低功耗模式的进入和退出,控制时钟源、PLL、电源开…...

Windows 局域网IP扫描工具:IPScaner 轻量免安装
IPScaner是一款258KB的工具,具备快捷修改IP、批量扫描、地址计算等功能,自动识别本机IP网段,快速查看IP使用情况,适用于监控维护、企业IT运维等场 软件功能介绍: 1)快捷修改本地IP、IP批量扫描、IP地址计算…...
HTML的浮动与定位
1. 浮动 浮动可以使一个元素脱离自己原本的位置,并在父元素的内容区中向左或向右移动,直到碰到父元素内容区的边界或者其它浮动元素为止。 值描述left元素向左浮动right元素向右浮动 普通文档流:浏览器在默认情况下规定一个块元素在父元素…...
【网络安全 | 漏洞挖掘】我如何通过路径遍历实现账户接管
未经许可,不得转载。 文章目录 不久前,我发现了一个我在高中时非常常用的知名应用程序,它在Intigriti上是一个私有程序,本文称之为REDACTED。 我开始参与REDACTED的漏洞赏金计划,这个应用程序在我开始进行黑客攻击之前我已经非常熟悉了。最初我并没有抱太高的期望。 我首…...

DB-GPT系列(四):DB-GPT六大基础应用场景part1
一、基础问答 进入DB-GPT后,再在线对话默认的基础功能就是对话功能。这里我们可以和使用通义千问、文心一言等在线大模型类似的方法, 来和DB-GPT进行对话。 但是值得注意的是,DB-GPT的输出结果是在内置提示词基础之上进行的回答,…...

SpringCloud篇(服务拆分 / 远程调用 - 入门案例)
目录 一、服务拆分原则 二、服务拆分示例 1. 案例需求 2. 案例要求 3. 导入SQL语句 4. 实现思路 4.1. 创建父工程 cloud-demo 管理依赖 依赖导入思路 4.2. 创建子工程 order-servic 4.3. 创建子工程 user-servic 4.4. 创建 cloud_order 数据库和表并插入数据 4.5. …...
Rust 建造者模式
在DDD中,DTO(数据传输对象)->BO(业务对象)、BO(业务对象)->PO(持久化对象,有的叫DO,即和数据表映射的实体)等等情况要做转换,这里提供以下转换方式 1、from或者try_from trait实现对象转换 需要转换对象满足接收对象的所有…...
ANN DNN CNN SNN
这些缩写代表了不同类型的人工神经网络: • ANN(Artificial Neural Network):人工神经网络,是模仿人脑神经元之间连接和交互方式的计算模型。它由节点(或称为“神经元”)组成的网络,…...
go语言进阶之并发模式
并发模式 并发模式是指在程序设计中同时处理多个任务或进程的方式,以提高效率和响应性 for select循环模式 for select循环模式通常用于处理并发操作,尤其是在需要等待多个通道时。 select的执行过程主要是以下几步 阻塞等待,直到其中一…...
Spring Cloud LoadBalancer:负载均衡的服务调用
在微服务系统中,有时候一个服务会部署多个实例,在我们调用这类实例时,如何实现负载均衡的调用呢?这时候就要用到Spring Cloud的负载均衡组件LoadBalancer了 LoadBalancer简介 LoadBalancer是Spring Cloud官方提供的负载均衡组件,通过它能使客户端在多个服务实例之间分发传…...

微信小程序之轮播图
效果图 实现 <swiper class"banner" indicator-dots"true" indicator-color"rgba(255,255,255,1)" indicator-active-color"#ff0000" autoplay"true" interval"100" circular"true"><swi…...
羲和数据集收集器1.3
为了实现所要求的功能,我们需要进一步完善代码,使其能够处理多种格式的输入文件,并生成符合要求的 JSON 格式的输出文件。具体来说,我们完善了以下内容: 增强 extract_qa_pairs_from_content 函数:使其能够识别和处理不同格式的 QA 对。 确保输出文件的格式正确:每个 Q…...
UE--IOS打包失败 AutomationTool exiting with ExitCode=9 (9)
[Remote] Executing build UATHelper: 打包 (IOS): Setting up bundled DotNet SDK UATHelper: 打包 (IOS): /Users/zyh/UE5/Builds/DESKTOP-FKKSVFQ/Y/UE/UE_5.2/Engine/Build/BatchFiles/Mac/../../../Binaries/ThirdParty/DotNet/6.0.302/mac-x64 UATHelper: 打包 (IOS)…...

第8章利用CSS制作导航菜单
8.1 水平顶部导航栏 水平菜单导航栏是应用范围最广的网站导航设计,一般位于页面顶部。它适用性强,几乎适用于所有类型的网站,且设计难度低。若导航过于普通,无法承载复杂信息结构,在内容模块较多时,则需结…...

UNIX网络编程-TCP套接字编程
概述 TCP客户端/服务器程序示例是执行如下步骤的一个回射服务器: 客户端从标准输入读入一行文本,并写给服务器。服务器从网络输入读入这行文本,并回射给客户端。客户端从网络输入读入这行回射文本,并显示在标准输出上。 TCP服务器…...

美团代付微信小程序 read.php 任意文件读取漏洞复现
0x01 产品描述: 美团代付微信小程序是美团点评旗下的一款基于微信小程序技术开发的应用程序功能,它允许用户方便快捷地请求他人为自己支付订单费用。通过微信小程序,用户可以轻松实现代付操作,无需跳转到其他应用或网页…...

centos7 node升级到node18
使用jenkins发布vue3项目提示node18安装失败 错误日志: /var/lib/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/Node18/bin/node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by /var/lib/jenkins/tools/jenkins.plugins.node…...

使用Matlab建立随机森林
综述 除了神经网络模型以外,树模型及基于树的集成学习模型是较为常用的效果较好的预测模型。我们以下构建一个随机森林模型。 随机森林是一种集成学习方法,通过构建多个决策树并结合其预测结果来提高模型的准确性和稳定性。在MATLAB中,可以…...

【江苏-无锡】《无锡市市级政务信息化建设及运行维护项目支出预算标准(试行)》 -省市费用标准解读系列10
2023年3月28日,无锡市政府投资评审中心出台《无锡市市级政务信息化建设及运行维护项目支出预算标准(试行)》,此标准是为进一步提高财政评审效率,规范评审行为,保证评审质量,节约政府投资&#x…...
2024-11-12 问AI: [AI面试题] 您将如何设计一个人工智能系统来预测电信公司的客户流失?
文心一言 设计一个人工智能系统来预测电信公司的客户流失,是一个复杂但至关重要的任务,它涉及到多个步骤和关键要素。以下是一个详细的设计方案: 一、明确需求和目标 在设计智能系统之前,需要明确系统的需求和目标,…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...