ESP32-C6-Super Mini浅睡眠唤醒失败(ESP32-WROOM正常)
ESP32-C6-Super Mini浅睡眠唤醒失败问题排查
问题描述
ESP32-C6-Super Mini开发板可正常进入浅睡眠(电流从约60mA降至20mA),但无法通过按键(EXT1唤醒)或定时器唤醒设备。相同逻辑在ESP32-WROOM开发板上可正常运行。
测试代码与现象
ESP32-WROOM正常运行代码(EXT0唤醒)
#include "esp_sleep.h" #include <Arduino.h> struct Button { uint8_t pin; bool pressed; void init() { pinMode(pin, INPUT_PULLUP); pressed = false; } bool update() { bool now = (digitalRead(pin) == LOW); if (now && !pressed) { pressed = true; return true; } if (!now) { pressed = false; } return false; } }; Button btn = {25, false}; enum State { STATE_AWAKE, STATE_WAIT_RELEASE, STATE_ENTER_SLEEP, STATE_SLEEPING, STATE_WAKEUP }; State currentState = STATE_AWAKE; void setup() { Serial.begin(115200); delay(1000); Serial.println("ESP32-C6 Light Sleep Toggle (EXT1 Wakeup)"); btn.init(); // Using EXT0 wakeup here on pin 25 esp_sleep_enable_ext0_wakeup((gpio_num_t)btn.pin, 0); } void loop() { switch (currentState) { case STATE_AWAKE: if (btn.update()) { Serial.println("Button pressed in awake state."); currentState = STATE_WAIT_RELEASE; } break; case STATE_WAIT_RELEASE: if (digitalRead(btn.pin) == HIGH) { Serial.println("Button released. Preparing to enter light sleep..."); currentState = STATE_ENTER_SLEEP; } break; case STATE_ENTER_SLEEP: Serial.println("Entering light sleep mode (EXT1)..."); currentState = STATE_SLEEPING; esp_light_sleep_start(); currentState = STATE_WAKEUP; break; case STATE_WAKEUP: Serial.println("Woke up from light sleep via EXT1!"); currentState = STATE_AWAKE; break; } delay(10); }
串口输出:
Button pressed in awake state. Button released. Preparing to enter light sleep... Entering light sleep mode (EXT1)... Woke up from light sleep via EXT1!
ESP32-C6-Super Mini按键唤醒失败代码(EXT1唤醒)
#include "esp_sleep.h" #include <Arduino.h> struct Button { uint8_t pin; bool pressed; void init() { pinMode(pin, INPUT_PULLUP); pressed = false; } bool update() { bool current = (digitalRead(pin) == LOW); if (current && !pressed) { pressed = true; return true; } if (!current) { pressed = false; } return false; } }; Button btn = {7, false}; // Using GPIO 7 enum State { STATE_AWAKE, STATE_WAIT_RELEASE, STATE_ENTER_SLEEP, STATE_SLEEPING, STATE_WAKEUP }; State currentState = STATE_AWAKE; void setup() { Serial.begin(115200); delay(1000); Serial.println("ESP32 Light Sleep Toggle Example"); btn.init(); // Keep RTC peripheral power on for internal pull-up stability esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); // EXT1 wakeup configuration: wake up when GPIO7 goes LOW esp_sleep_enable_ext1_wakeup((1ULL << btn.pin), ESP_EXT1_WAKEUP_ANY_LOW); } void loop() { switch (currentState) { case STATE_AWAKE: if (btn.update()) { Serial.println("Button pressed in awake state."); currentState = STATE_WAIT_RELEASE; } break; case STATE_WAIT_RELEASE: if (digitalRead(btn.pin) == HIGH) { Serial.println("Button released. Preparing to enter light sleep..."); currentState = STATE_ENTER_SLEEP; } break; case STATE_ENTER_SLEEP: Serial.println("Entering light sleep mode..."); currentState = STATE_SLEEPING; esp_light_sleep_start(); currentState = STATE_WAKEUP; break; case STATE_WAKEUP: Serial.println("Woke up from light sleep!"); currentState = STATE_AWAKE; break; } delay(10); }
串口输出:
ESP32 Light Sleep Toggle Example Button pressed in awake state. Button released. Preparing to enter light sleep... Entering light sleep mode... After entering sleep, the board never wakes up—even when I try pressing the button.
ESP32-C6-Super Mini定时器唤醒失败测试代码
#include <Arduino.h> #include "esp_sleep.h" const int BUTTON_PIN = 7; void setup() { Serial.begin(115200); delay(1000); pinMode(BUTTON_PIN, INPUT_PULLUP); // Default HIGH gpio_wakeup_enable((gpio_num_t)BUTTON_PIN, GPIO_INTR_LOW_LEVEL); esp_sleep_enable_gpio_wakeup(); // Timer wakeup after 5 seconds esp_sleep_enable_timer_wakeup(5000000ULL); Serial.println("Entering Light Sleep in 3 seconds..."); delay(3000); Serial.println("Now sleeping..."); esp_light_sleep_start(); Serial.println("Woke up!"); } void loop() { delay(1000); Serial.println("Sleep again..."); esp_light_sleep_start(); Serial.println("Woke up again!"); }
串口输出:
Entering Light Sleep in 3 seconds... Now sleeping... After entering sleep, no wakeup occurs.
问题总结与疑问
总结
ESP32-WROOM可正常实现浅睡眠及按键/定时器唤醒;ESP32-C6-Super Mini能正常进入浅睡眠,但所有唤醒方式均失效。
疑问
- ESP32-C6的Arduino核心是否存在唤醒函数(
esp_light_sleep_start()、EXT1、GPIO唤醒、定时器唤醒)的bug或未实现功能? - ESP32-C6-Super Mini的引脚映射或RTC配置是否与代码假设不符?
调试建议与解决方案
- 更新Arduino核心版本:确保使用v2.0.10及以上版本的ESP32 Arduino核心,旧版本对ESP32-C6系列的睡眠唤醒支持存在兼容性问题。
- 验证RTC GPIO引脚:ESP32-C6的EXT1唤醒仅支持RTC功能引脚,需查阅ESP32-C6 datasheet确认GPIO7是否属于RTC引脚,若为普通GPIO则无法触发EXT1唤醒。
- 调整RTC电源域配置:除了开启RTC外设电源域,建议同时配置RTC内存域保持供电,避免唤醒逻辑丢失:
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_ON); - 简化测试代码:先排除状态机逻辑干扰,使用极简代码验证单一唤醒方式,比如仅测试定时器唤醒,确认基础功能是否正常。
- 检查硬件连接:确认GPIO7的按键连接无短路、虚焊,在唤醒前验证按键可被正常读取,排除引脚映射错误。
- 切换至ESP-IDF原生测试:若Arduino核心问题无法定位,尝试用ESP-IDF编写浅睡眠唤醒代码,验证芯片本身功能是否正常。
- 确认睡眠模式:确保调用的是
esp_light_sleep_start()而非深度睡眠函数,深度睡眠会关闭更多外设,唤醒条件与浅睡眠不同。
内容的提问来源于stack exchange,提问作者정진우
相关产品推荐
相关产品推荐

