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

ESP32深度睡眠唤醒禁用RF是否可行?如何实现?

ESP32禁用RF唤醒的实现方法

嘿,这个问题我刚好踩过坑,从ESP8266转ESP32的时候确实会遇到API差异的问题,不过放心,ESP32完全支持禁用RF唤醒的配置,只是实现方式和8266不一样,下面给你详细拆解:

首先得明确:ESP32的深度睡眠模式里,默认RF模块是关闭的,但如果不小心开启了WiFi/蓝牙相关的唤醒源,或者唤醒后自动初始化RF,就会出现你担心的情况。咱们要做的就是两步:禁用所有RF唤醒源 + 设置唤醒后不初始化RF。

具体实现步骤

  • 第一步:关闭RF相关唤醒源
    如果你的项目里用到过WiFi或蓝牙,一定要先禁用它们的唤醒功能,防止触发RF唤醒:

    esp_wifi_disable_wakeup();  // 禁用WiFi唤醒
    esp_bt_disable_wakeup();    // 禁用蓝牙唤醒
    

    另外,进入睡眠前最好彻底关闭这些模块,避免残留配置:

    esp_wifi_stop();
    esp_bt_controller_disable();
    
  • 第二步:设置唤醒后不初始化RF
    这一步是核心,对应ESP8266的WAKE_NO_RFCAL。ESP32用esp_deep_sleep_set_option()函数来配置,其中ESP_DEEP_SLEEP_WAKEUP_NO_RFCAL选项就是让设备唤醒后跳过RF校准和初始化,完全禁用RF相关功能:

    esp_deep_sleep_set_option(ESP_DEEP_SLEEP_WAKEUP_NO_RFCAL);
    
  • 第三步:配置定时器唤醒(结合完整流程)
    把定时器唤醒和上面的配置结合起来,完整代码示例(ESP-IDF和Arduino框架都适用):

    #include <esp_deep_sleep.h>
    
    void setup() {
      // 先关闭WiFi/蓝牙模块并禁用其唤醒
      esp_wifi_stop();
      esp_bt_controller_disable();
      esp_wifi_disable_wakeup();
      esp_bt_disable_wakeup();
    
      // 设置定时器唤醒时间,比如10秒(单位:微秒)
      const uint64_t wakeup_time_us = 10ULL * 1000000;
      esp_deep_sleep_enable_timer_wakeup(wakeup_time_us);
    
      // 关键:禁用RF唤醒和初始化
      esp_deep_sleep_set_option(ESP_DEEP_SLEEP_WAKEUP_NO_RFCAL);
    
      // 进入深度睡眠
      esp_deep_sleep_start();
    }
    
    void loop() {
      // 这里永远不会执行,因为深度睡眠后设备会重启
    }
    

补充说明

  • 如果用的是Arduino框架,部分版本的ESP.deepSleep()函数也支持类似参数,比如ESP.deepSleep(wakeup_time_us, WAKE_NO_RFCAL);,但实测直接用ESP-IDF原生函数的稳定性更高,尤其是复杂项目里。
  • ESP_DEEP_SLEEP_WAKEUP_NO_RFCAL不仅会禁用RF唤醒,还会让唤醒后的设备不加载RF驱动,能有效降低功耗,和ESP8266的效果完全一致。

内容的提问来源于stack exchange,提问作者Natalie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:04:04