You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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能正常进入浅睡眠,但所有唤醒方式均失效。

疑问

  1. ESP32-C6的Arduino核心是否存在唤醒函数(esp_light_sleep_start()、EXT1、GPIO唤醒、定时器唤醒)的bug或未实现功能?
  2. 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,提问作者정진우

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:18:09