☰
ESP32-S3-RTC_CNTL(低功耗管理)
2026/10/1 8:06:31 网站建设 项目流程

文章目录

  • 一、RTC_CNTL
    • 1、RTC_CNTL
    • 2、主要功能
      • 1.电源域管理
      • 2.睡眠模式控制
      • 3.唤醒源检测与触发
      • 4.复位系统
      • 5.时钟管理
      • 6.RTC GPIO 管理
      • 7.RTC WDT(RTC 看门狗)控制
      • 8.掉电检测、电压监控
    • 3、主要特性
    • 4、模块构成
  • 二、RTC_CNTL原理
    • 1、RTC_CNTL结构图
    • 2、供电说明
    • 3、RTC Power Management Unit(RTC_CNTL 电源管理单元)
    • 4、片上LDO稳压器
    • 5、RTC Fast Memory / Slow Memory
  • 三、工作模式
    • 1、ESP32-S3 四种工作模式
    • 2、Light-sleep 轻度睡眠
      • 1. RTC_CNTL 执行动作
      • 2. 核心特性
      • 3. 使用场景
      • 4.最简代码
    • 3、Deep-sleep 深度睡眠
      • 1. RTC_CNTL 执行动作
      • 2. 核心特性
      • 3. 使用场景
      • 4.最简代码
    • 4、Light-sleep(轻度睡眠) vs Deep-sleep(深度睡眠)核心对比
  • 四、睡眠模式API
    • 1、头文件
    • 2、结构体
      • 1. 唤醒源类型 esp_sleep_wakeup_cause_t(别名esp_sleep_source_t)
      • 2. EXT1 多引脚唤醒模式
      • 3. 电源域 esp_sleep_pd_domain_t
      • 4. 电源域控制选项
      • 5. UART 睡眠前处理模式
      • 6. 睡眠模式
    • 3、唤醒源启用 / 关闭 API(核心)
      • 1. 通用关闭唤醒源
      • 2. 定时器唤醒
      • 3. EXT0 单 RTC 引脚唤醒(Deep/Light Sleep 均可)
      • 4. EXT1 多 RTC 引脚掩码唤醒(推荐低功耗)
      • 5. 普通 GPIO 唤醒(仅 Light-sleep)
      • 6. UART 唤醒(仅 Light-sleep)
      • 7. 触摸传感器唤醒
      • 8. ULP 唤醒
      • 9. WiFi / BT 唤醒(Light-sleep)
    • 4、进入睡眠函数
    • 5、电源域控制 API
    • 6、唤醒信息查询
    • 7、GPIO 休眠相关配置
    • 8、DeepSleep 钩子 & 唤醒 Stub(高级)
      • 1. 休眠前回调(进入 DeepSleep 之前执行)
      • 2. 唤醒 Stub(Boot 阶段最早执行,C 代码还未初始化)
    • 9、串口休眠行为配置
    • 10、辅助工具函数
  • 五、示例代码
    • 1、Light-sleep 定时唤醒
      • 1.示例代码
      • 2.执行结果
    • 2、Deep-sleep 定时唤醒
      • 1.示例代码
      • 2.执行结果
    • 3、Light-sleep 普通 GPIO 外部按键唤醒
      • 1.示例代码
      • 2.执行结果
    • 4、EXT0 单 RTC 引脚唤醒(同时支持 Light-sleep / Deep-sleep)
      • 1.示例代码
      • 2.执行结果
    • 5、 EXT1 多 RTC 引脚掩码唤醒(推荐低功耗)
      • 1.示例代码
      • 2.执行结果

一、RTC_CNTL

1、RTC_CNTL

RTC_CNTL(RTC Controller,RTC控制器)是ESP32-S3芯片的全局低功耗核心管理外设,独立于主CPU、APB总线与高速外设,是芯片休眠、唤醒、功耗管控、RTC计时、低速外设控制的底层核心模块。

2、主要功能

1.电源域管理

控制主电源域(VDD_A)、RTC 电源域上电 / 下电;DeepSleep 时切断主电源域。

2.睡眠模式控制

配置进入 Light-sleep / Deep-sleep,管理各类唤醒源。

3.唤醒源检测与触发

RTC 定时器、RTC GPIO、触摸信号到达后,触发芯片唤醒。

4.复位系统

上电复位、外部引脚复位、看门狗复位、软件复位。

5.时钟管理

RTC 时钟源选择(32k XTAL / Internal RC)、时钟门控。

6.RTC GPIO 管理

休眠期间 IO 保持、上下拉、电平配置、IO 唤醒触发。

7.RTC WDT(RTC 看门狗)控制

Bootloader RTC 看门狗开启、喂狗、关闭控制。

8.掉电检测、电压监控

3、主要特性

4 种预设功耗模式,可满足多种典型应用场景需求。
高达 16 KB 保留内存 (retention memory),含快速内存和慢速内存。
8 个 32 位保留寄存器 (retention register)。
支持 RTC Boot 功能,用于快速唤醒。
各功耗模式下均支持超低功耗协处理器。

4、模块构成

功耗管理单元 (PMU):
控制向模拟、RTC 和数字类电源域的供电。
电源隔离单元:
保证各电源域的独立工作,防止掉电电源域影响其他电源域的工作。
低功耗时钟:
为低功耗模式下工作的电源域提供时钟信号。
定时器:
RTC 定时器:在专用寄存器中记录 RTC 主状态机的状态。
ULP 定时器:在预设时间唤醒超低功耗协处理器。
触摸传感器定时器:在预设时间唤醒触摸传感器。
8 个 32 位 “always-on” 保留寄存器:
即这 8 个寄存器永远处于工作状态,不受 deep-sleep 等低功耗模式的影响,可用于存储一些不能丢失的数据。
22 个 “always-on” 管脚:
即这 22 个管脚永远处于工作状态,不受 deep-sleep 等低功耗模式的影响,可用作低功耗模式下的唤醒源,也作为正常 GPIO 使用。
RTC 慢速内存:
8 KB SRAM,工作时钟为 RTC 快速时钟 (rtc_fast_clk),可用作扩展内存或存储 ULP 指令和数据内存。
RTC 快速内存:
8 KB SRAM,工作时钟与 CPU 时钟 (CPU_CLK) 同频,可用作扩展内存。
调压器:
调节向不同电源域的供电电压。

二、RTC_CNTL原理

1、RTC_CNTL结构图

2、供电说明

VDD3P3_RTC:
给 RTC 模拟稳压器供电;
DeepSleep 期间唯一持续供电的电源轨。
VDD3P3_CPU:
CPU 数字内核供电。
VDD3P3 / VDDA:
外设、PLL、射频、晶振、模拟电路供电。
VDD_SPI:
Flash SPI 供电。

3、RTC Power Management Unit(RTC_CNTL 电源管理单元)

内部寄存器:xpd_rtc_reg / xpd_dig_reg / xpd_cpu / xpd_wireless …
每一个 xpd_xxx 对应一路电源开关:
xpd_peri → RTC Peripherals(RTC GPIO、触摸传感器)电源开关
xpd_cpu → CPU 内核电源开关
xpd_pd_peri → 数字外设电源开关
xpd_wireless → Wi-Fi / 蓝牙无线模块电源开关
xpd_rc_osc / xpd_ex_crystal → 内部 RC 振荡器、外部晶振电源
所有进入睡眠 / 唤醒切断哪一块电源,全部由 RTC_CNTL 通过这些 xpd 寄存器控制。

4、片上LDO稳压器

Low Power Voltage Regulator(RTC 域低压 LDO):
只给 RTC 模块供电;深度睡眠持续工作。
Digital System Voltage Regulator:
数字内核(CPU、SRAM)供电。
Flash Voltage Regulator:
Flash、SPI 外设供电。

5、RTC Fast Memory / Slow Memory

连接 RTC 电源域;
DeepSleep 不断电,配合 RTC_DATA_ATTR 保存变量;
主 SRAM 属于 Digital Core,深睡断电丢失数据。

三、工作模式

1、ESP32-S3 四种工作模式

Active 活跃模式:
全模块上电,CPU 正常运行。
Modem-sleep 调制解调器休眠:
CPU 运行,仅 Wi-Fi / 蓝牙射频下电。
Light-sleep 轻度睡眠:
CPU 暂停,数字域持续供电,大部分外设时钟关闭。
Deep-sleep 深度睡眠:
仅 RTC 电源域上电,数字主域整体断电。
Modem-sleep 不属于真正 “休眠”,CPU 仍然执行任务;
日常低功耗最常用两种休眠:Light-sleep / Deep-sleep。

2、Light-sleep 轻度睡眠

1. RTC_CNTL 执行动作

CPU 冻结停止运行,关闭 APB 高速时钟;
关闭 Wi-Fi、蓝牙、PLL、高速振荡器;
数字域电源保持接通(CPU、SRAM 不断电);
RTC 域持续工作,等待唤醒信号。

2. 核心特性

内存:所有内部 SRAM 数据保留,普通全局变量有效。
程序断点:唤醒后从休眠调用处继续执行,FreeRTOS 任务上下文完整保留。
唤醒速度:微秒级,驱动无需重新初始化。
可用唤醒源:GPIO、RTC GPIO、定时器、UART、触摸、ADC 阈值触发等(种类丰富)。
典型电流:0.8mA ~ 3mA(视开启模块)。

3. 使用场景

需要快速响应外部信号。
频繁唤醒、休眠间隔短(几百 ms~ 数秒)。
需要串口、普通 GPIO 唤醒休眠。

4.最简代码

#include"esp_sleep.h"voidapp_main(void){esp_sleep_enable_timer_wakeup(5000000);// 5s定时唤醒while(1){printf("进入轻度睡眠\n");esp_light_sleep_start();printf("唤醒,继续运行\n");}}

3、Deep-sleep 深度睡眠

1. RTC_CNTL 执行动作

通过 xpd_cpu / xpd_pd_peri / xpd_wireless 寄存器切断整个数字域电源;
CPU、SRAM、外设、无线模块全部断电;
仅保留 RTC 电源域持续供电;
等待唤醒信号;唤醒后重新上电,系统复位重启。

2. 核心特性

内存:普通 SRAM 断电丢失;仅 RTC_DATA_ATTR 修饰变量保存在 RTC 内存。
程序断点:唤醒 ≈ 软重启,从头执行 app_main (),休眠后续代码不会运行。
唤醒速度:毫秒级,所有外设驱动必须重新初始化。
唤醒源限制:仅 RTC 域外设。
支持:RTC 定时器、RTC GPIO、触摸传感器。
不支持:普通 GPIO、UART、ADC。
典型电流:10μA ~ 80μA,电池设备首选。

3. 使用场景

电池供电设备,长时间休眠(分钟 / 小时级别)
追求最低静态功耗,唤醒频次低

4.最简代码

#include"esp_sleep.h"// 保存在RTC内存,重启不丢失RTC_DATA_ATTRuint32_tboot_count=0;voidapp_main(void){boot_count++;printf("上电次数:%lu\n",boot_count);esp_sleep_enable_timer_wakeup(5000000);printf("进入深度睡眠\n");esp_deep_sleep_start();// 下面代码永远无法执行}

4、Light-sleep(轻度睡眠) vs Deep-sleep(深度睡眠)核心对比

四、睡眠模式API

1、头文件

头文件:#include “esp_sleep.h”

2、结构体

1. 唤醒源类型 esp_sleep_wakeup_cause_t(别名esp_sleep_source_t)

typedefenum{ESP_SLEEP_WAKEUP_UNDEFINED,// 上电复位,非睡眠唤醒ESP_SLEEP_WAKEUP_ALL,// 仅用于esp_sleep_disable_wakeup_source,关闭全部ESP_SLEEP_WAKEUP_EXT0,// RTC IO单引脚唤醒ESP_SLEEP_WAKEUP_EXT1,// RTC IO多引脚掩码唤醒ESP_SLEEP_WAKEUP_TIMER,// RTC定时器唤醒ESP_SLEEP_WAKEUP_TOUCHPAD,// 触摸唤醒ESP_SLEEP_WAKEUP_ULP,// ULP协处理器唤醒ESP_SLEEP_WAKEUP_GPIO,// 普通GPIO唤醒【仅Light-sleep】ESP_SLEEP_WAKEUP_UART,// UART0唤醒【仅Light-sleep】ESP_SLEEP_WAKEUP_UART1,// UART1唤醒【仅Light-sleep】ESP_SLEEP_WAKEUP_UART2,// UART2唤醒【仅Light-sleep】ESP_SLEEP_WAKEUP_WIFI,// WiFi唤醒【仅Light-sleep】ESP_SLEEP_WAKEUP_BT,// 蓝牙唤醒【仅Light-sleep】}esp_sleep_source_t;

2. EXT1 多引脚唤醒模式

typedefenum{ESP_EXT1_WAKEUP_ANY_LOW=0,// 任意引脚低电平唤醒(S3使用)ESP_EXT1_WAKEUP_ANY_HIGH=1// 任意引脚高电平唤醒}esp_sleep_ext1_wakeup_mode_t;

3. 电源域 esp_sleep_pd_domain_t

typedefenum{ESP_PD_DOMAIN_RTC_PERIPH,// RTC外设(RTC IO、ULP)ESP_PD_DOMAIN_RTC_SLOW_MEM,// RTC慢速内存ESP_PD_DOMAIN_RTC_FAST_MEM,// RTC快速内存(RTC_DATA_ATTR)ESP_PD_DOMAIN_XTAL,// 主晶振ESP_PD_DOMAIN_XTAL32K,// 外部32K晶振ESP_PD_DOMAIN_RC32K,// 内部32K RCESP_PD_DOMAIN_RC_FAST,// RTC 8M RC振荡器ESP_PD_DOMAIN_VDDSDIO,// PSRAM/Flash电源域ESP_PD_DOMAIN_MODEM,// WiFi/蓝牙电源域ESP_PD_DOMAIN_TOP,// SoC TOP域ESP_PD_DOMAIN_CNNT,// 高速外设域ESP_PD_DOMAIN_MAX}esp_sleep_pd_domain_t;

4. 电源域控制选项

typedefenum{ESP_PD_OPTION_OFF,// 睡眠时下电ESP_PD_OPTION_ON,// 睡眠保持上电ESP_PD_OPTION_AUTO// 自动:唤醒源需要则保持上电,否则断电}esp_sleep_pd_option_t;

5. UART 睡眠前处理模式

typedefenum{ESP_SLEEP_AUTO_FLUSH_SUSPEND_UART,// 默认自动策略ESP_SLEEP_ALWAYS_FLUSH_UART,// 等待TX FIFO发完再休眠ESP_SLEEP_ALWAYS_SUSPEND_UART,// 暂停串口,上电后恢复ESP_SLEEP_ALWAYS_DISCARD_UART,// 直接丢弃FIFO,立刻休眠ESP_SLEEP_NO_HANDLING,// 不处理串口}esp_sleep_uart_handling_mode_t;

6. 睡眠模式

typedefenum{ESP_SLEEP_MODE_LIGHT_SLEEP,ESP_SLEEP_MODE_DEEP_SLEEP}esp_sleep_mode_t;

3、唤醒源启用 / 关闭 API(核心)

1. 通用关闭唤醒源

esp_err_t esp_sleep_disable_wakeup_source(esp_sleep_source_t source);
v6.x 移除 esp_sleep_disable_all_wakeup_sources(),需要循环逐个调用关闭。

2. 定时器唤醒

esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us);

3. EXT0 单 RTC 引脚唤醒(Deep/Light Sleep 均可)

esp_err_t esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level);
限制:需要保持 RTC_PERIPH 上电,内部上下拉可用。

4. EXT1 多 RTC 引脚掩码唤醒(推荐低功耗)

// 【旧接口,标记待废弃】重置全部引脚掩码esp_err_tesp_sleep_enable_ext1_wakeup(uint64_tio_mask,esp_sleep_ext1_wakeup_mode_tlevel_mode);// 【v6.x推荐】追加引脚,不清除旧配置esp_err_tesp_sleep_enable_ext1_wakeup_io(uint64_tio_mask,esp_sleep_ext1_wakeup_mode_tlevel_mode);// 移除指定引脚;io_mask=0 清除全部ext1配置esp_err_tesp_sleep_disable_ext1_wakeup_io(uint64_tio_mask);EXT1 优势:RTC_PERIPH 可以下电,功耗更低;内部上下拉失效,建议外部电阻。

5. 普通 GPIO 唤醒(仅 Light-sleep)

esp_err_t esp_sleep_enable_gpio_wakeup(void);
使用前提:提前调用 gpio_wakeup_enable() 逐个配置引脚;
如果开启外设下电选项,此 API 失效,改用 EXT1。

6. UART 唤醒(仅 Light-sleep)

esp_err_t esp_sleep_enable_uart_wakeup(int uart_num);

7. 触摸传感器唤醒

esp_err_t esp_sleep_enable_touchpad_wakeup(void);
int esp_sleep_get_touchpad_wakeup_status(void);

8. ULP 唤醒

esp_err_t esp_sleep_enable_ulp_wakeup(void);

9. WiFi / BT 唤醒(Light-sleep)

esp_err_t esp_sleep_enable_bt_wakeup(void);
esp_err_t esp_sleep_disable_bt_wakeup(void);

esp_err_t esp_sleep_enable_wifi_wakeup(void);
esp_err_t esp_sleep_disable_wifi_wakeup(void);
esp_err_t esp_sleep_enable_wifi_beacon_wakeup(void);
esp_err_t esp_sleep_disable_wifi_beacon_wakeup(void);

4、进入睡眠函数

// 轻度睡眠,唤醒后继续执行,函数正常返回esp_err_tesp_light_sleep_start(void);// 深度睡眠【不返回,强制进入】voidesp_deep_sleep_start(void)__attribute__((__noreturn__));// 深度睡眠【可拒绝进入】esp_err_tesp_deep_sleep_try_to_start(void);// 封装:设置定时器 + 直接进入深度睡眠voidesp_deep_sleep(uint64_ttime_in_us)__attribute__((__noreturn__));esp_err_tesp_deep_sleep_try(uint64_ttime_in_us);

5、电源域控制 API

esp_err_tesp_sleep_pd_config(esp_sleep_pd_domain_tdomain,esp_sleep_pd_option_toption);典型用法:// RTC_PERIPH保持上电 → EXT0可用、内部上下拉有效esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH,ESP_PD_OPTION_ON);// 深度睡眠追求最低功耗:设置为 ESP_PD_OPTION_OFF,只能用EXT1

6、唤醒信息查询

// 获取唤醒源【已废弃】esp_sleep_wakeup_cause_tesp_sleep_get_wakeup_cause(void);// v6.x推荐:获取唤醒源位图(支持多路同时唤醒)uint32_tesp_sleep_get_wakeup_causes(void);// 获取EXT1触发唤醒的引脚掩码uint64_tesp_sleep_get_ext1_wakeup_status(void);

7、GPIO 休眠相关配置

// 睡眠时隔离所有GPIO(高阻,减少漏电)voidesp_sleep_config_gpio_isolate(void);// 开启/关闭GPIO休眠状态自动切换voidesp_sleep_enable_gpio_switch(bool enable);

8、DeepSleep 钩子 & 唤醒 Stub(高级)

1. 休眠前回调(进入 DeepSleep 之前执行)

typedefvoid(*esp_deep_sleep_cb_t)(void);esp_err_tesp_deep_sleep_register_hook(esp_deep_sleep_cb_tnew_dslp_cb);voidesp_deep_sleep_deregister_hook(esp_deep_sleep_cb_told_dslp_cb);回调禁止阻塞、禁止长耗时、禁止 printf!

2. 唤醒 Stub(Boot 阶段最早执行,C 代码还未初始化)

// 安装自定义唤醒stubvoidesp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_tnew_stub);esp_deep_sleep_wake_stub_fn_tesp_get_deep_sleep_wake_stub(void);voidesp_set_deep_sleep_wake_stub_default_entry(void);// 默认唤醒入口(可重定义覆盖)voidesp_wake_deep_sleep(void);voidesp_default_wake_deep_sleep(void);// 关闭ROM深度睡眠日志voidesp_deep_sleep_disable_rom_logging(void);

9、串口休眠行为配置

esp_err_t esp_sleep_set_console_uart_handling_mode(esp_sleep_uart_handling_mode_t handling_mode);

10、辅助工具函数

// 判断GPIO是否可以作为休眠唤醒引脚
bool esp_sleep_is_valid_wakeup_gpio(gpio_num_t gpio_num);

五、示例代码

1、Light-sleep 定时唤醒

适用:短时休眠,快速唤醒。

1.示例代码

#include<stdio.h>#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"esp_sleep.h"#include"driver/gpio.h"voidapp_main(void){// 启用5秒定时唤醒esp_sleep_enable_timer_wakeup(5*1000000);while(1){printf("准备进入 Light-sleep\n");esp_light_sleep_start();// 唤醒执行此处printf("系统唤醒!\n");vTaskDelay(pdMS_TO_TICKS(1000));}}

2.执行结果

2、Deep-sleep 定时唤醒

1.示例代码

#include<stdio.h>#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"esp_sleep.h"#include"driver/gpio.h"// 保存在RTC内存,深睡不掉电RTC_DATA_ATTRuint32_tboot_counter=0;voidapp_main(void){boot_counter++;printf("启动次数:%lu\n",boot_counter);// 配置唤醒源:10秒定时唤醒esp_sleep_enable_timer_wakeup(10*1000000);printf("即将进入 Deep-sleep...\n");esp_deep_sleep_start();// 下面代码永远不会执行}

2.执行结果

3、Light-sleep 普通 GPIO 外部按键唤醒

1.示例代码

#include<stdio.h>#include"esp_sleep.h"#include"driver/gpio.h"#include"freertos/FreeRTOS.h"#include"freertos/task.h"#defineWAKE_GPIOGPIO_NUM_10// GPIO唤醒引脚voidapp_main(void){// 复位GPIO,恢复默认状态gpio_reset_pin(WAKE_GPIO);// 设置为输入模式gpio_set_direction(WAKE_GPIO,GPIO_MODE_INPUT);// 配置引脚低电平触发唤醒gpio_wakeup_enable(WAKE_GPIO,GPIO_INTR_LOW_LEVEL);// 清除旧唤醒配置esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_GPIO);// 使能GPIO唤醒esp_sleep_enable_gpio_wakeup();printf("已准备轻度休眠 Light Sleep\n");printf("触发方式:拉低GPIO10唤醒\n");vTaskDelay(pdMS_TO_TICKS(50));// 进入轻度睡眠,唤醒后代码继续往下执行,不会重启esp_err_tret=esp_light_sleep_start();// 唤醒后执行此处代码printf("芯片已唤醒!函数返回值:%d, 唤醒源:%d\n",(int)ret,esp_sleep_get_wakeup_cause());vTaskDelay(pdMS_TO_TICKS(1000));}

2.执行结果

4、EXT0 单 RTC 引脚唤醒(同时支持 Light-sleep / Deep-sleep)

1.示例代码

#include<stdio.h>#include"esp_sleep.h"#include"driver/gpio.h"#include"freertos/FreeRTOS.h"#include"freertos/task.h"#defineEXT0_PINGPIO_NUM_4// EXT0 RTC唤醒引脚voidapp_main(void){printf("本次唤醒源编号 = %d\n",(int)esp_sleep_get_wakeup_causes());// 关闭旧EXT0唤醒配置esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_EXT0);// EXT0唤醒硬性要求:RTC_PERIPH电源域必须保持上电// 开启后可以使用芯片内部上拉/下拉电阻esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH,ESP_PD_OPTION_ON);// 参数2:0=低电平唤醒,1=高电平唤醒esp_sleep_enable_ext0_wakeup(EXT0_PIN,1);// 额外增加8秒定时自动唤醒兜底//esp_sleep_enable_timer_wakeup(8 * 1000000ULL);printf("即将进入深度休眠 Deep Sleep\n");vTaskDelay(pdMS_TO_TICKS(100));esp_deep_sleep_start();}

2.执行结果

5、 EXT1 多 RTC 引脚掩码唤醒(推荐低功耗)

1.示例代码

#include<stdio.h>#include"esp_sleep.h"#include"driver/gpio.h"#include"freertos/FreeRTOS.h"#include"freertos/task.h"/************************ 配置区 ************************/#defineKEY1_PINGPIO_NUM_7#defineKEY2_PINGPIO_NUM_8#defineKEY3_PINGPIO_NUM_9// 构建EXT1引脚掩码:同时启用KEY1、KEY2、KEY3三路RTC引脚#defineEXT1_WAKE_MASK((1ULL<<KEY1_PIN)|(1ULL<<KEY2_PIN)|(1ULL<<KEY3_PIN))/********************************************************/voidapp_main(void){// 获取唤醒源位图uint32_twake_mask=esp_sleep_get_wakeup_causes();printf("唤醒源位图 = 0x%08X\n",(int)wake_mask);if(wake_mask==0){printf("上电冷启动,未由休眠唤醒\n");}else{if(wake_mask&ESP_SLEEP_WAKEUP_EXT1){// 获取触发唤醒的引脚掩码,可以判断是哪一个按键按下uint64_ttrigger_pin_mask=esp_sleep_get_ext1_wakeup_status();printf("EXT1唤醒,触发引脚掩码: 0x%llx\n",trigger_pin_mask);if(trigger_pin_mask&(1ULL<<KEY1_PIN)){printf("KEY1(GPIO7) 唤醒\n");}if(trigger_pin_mask&(1ULL<<KEY2_PIN)){printf("KEY2(GPIO8) 唤醒\n");}if(trigger_pin_mask&(1ULL<<KEY3_PIN)){printf("KEY3(GPIO9) 唤醒\n");}}if(wake_mask&ESP_SLEEP_WAKEUP_TIMER){printf("定时器自动唤醒\n");}}// ========== 清除旧唤醒配置,避免叠加 ==========esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_EXT1);esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER);// ========== 配置EXT1多路引脚唤醒 ==========// ESP_EXT1_WAKEUP_ANY_LOW:掩码内任意引脚拉低,触发唤醒// ESP_EXT1_WAKEUP_ALL_LOW:掩码内所有引脚同时拉低,才唤醒esp_sleep_enable_ext1_wakeup_io(EXT1_WAKE_MASK,ESP_EXT1_WAKEUP_ANY_LOW);// 附加兜底:30秒定时自动唤醒,防止按键卡死无法唤醒esp_sleep_enable_timer_wakeup(30*1000000ULL);// ========== 电源域设置 ==========// ESP_PD_OPTION_OFF:关闭RTC外设,休眠功耗最低esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH,ESP_PD_OPTION_OFF);// 如果想使用芯片内部上拉,则开启RTC_PERIPH(功耗略高)//esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);printf("\n300ms后进入DeepSleep,按下GPIO7/GPIO8/GPIO9任意按键唤醒\n");vTaskDelay(pdMS_TO_TICKS(300));esp_deep_sleep_start();}

2.执行结果

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询