【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面试题] 您将如何设计一个人工智能系统来预测电信公司的客户流失?
文心一言 设计一个人工智能系统来预测电信公司的客户流失,是一个复杂但至关重要的任务,它涉及到多个步骤和关键要素。以下是一个详细的设计方案: 一、明确需求和目标 在设计智能系统之前,需要明确系统的需求和目标,…...
 
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
 
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
