智能家居wifi芯片wifi藍牙模塊無線模塊樂鑫esp32 Deep-sleep模式,相對于Light-sleep模式,ESP32-C3無法自動進入Deep-sleep模式,調用esp_deep_sleep_start()函數可進入 Deep-sleep 模式。在 Deep-sleep 模式下,智能家居wifi芯片wifi藍牙模塊無線模塊樂鑫ESP32-C3 會斷開與 Wi-Fi和 BluetoothLE的連接,同時會關閉CPU、大部分 RAM 和所有由APB CLK 提供時鐘的數字外設,仍然可以工作的有 RTC 時鐘控制器、RTC 外設、RTC 快速內存。從 Deep-sleep 模式喚醒后,CPU將復位重啟。
Deep-sleep 可以用于低功耗的傳感器應用,或者大部分時間都不需要進行數據傳輸的情況設備可以每隔一段時間從 Deep-sleep 模式醒來測量并上傳數據,之后繼續進入 Deep-sleep模式。也可以將多個數據存儲于RTC Memory(RTC Memory 在 Deep-sleep 模式下仍然可以保存數據),然后一次發送出去。
1.Deep-sleep 模式的喚醒源
針對 Deep-sleep 模式,智能家居wifi芯片wifi藍牙模塊無線模塊樂鑫ESP32-C3 可以使用GPIO 喚醒源和定時器喚醒源,支持同時配置一個或兩個喚醒源。在這種情況下,當任何一個喚醒源被觸發時,ESP32-C3 都會被喚醒。在進入Deep-sleep 模式之前,既可以使用相應的 API 隨時配置喚醒源,也可以使用 esp sleep_disable_wakeu_ source()函數禁用某個喚醒源。在喚醒 ESP32-C3 后,可以通過esp_sleep_get_wakeup_cause()函數來檢查哪個喚醒源被觸發了。
(1)GPIO 喚醒。在 Deep-sleep 模式下,可以由外部喚醒源通過 GPIO 來喚醒智能家居wifi芯片wifi藍牙模塊無線模塊樂鑫ESP32-C3。通過esp_deep_sleep_enable_gpio_wakeup()函數可以將GPIO配置為啟高電平喚醒或低電平喚醒。需要注意的是,GPIO喚醒僅可用于RTC IO。
(2)Timer 喚醒。RTC控制器有內置的定時器,可在預定義的時間到達時喚醒ESP32-C3。定時時間以微秒為精度來指定,但實際分辨率取決于為 RTC_SLOW_CLK 選擇的時鐘源。在啟用Timer 喚醒時,不需要在 ESP32-C3 睡眠期間打開 RTC 外設或 RTC 存儲器,通過esp_sleep_enable_timer_wakeup()函數可啟用Timer 喚醒。
2.Deep-sleep 模式的配置說明
配置喚醒源后,可調用esp_deep_sleep_start()函數進入 Deep-sleep 模式。在沒有配置喚醒源的情況下也可以進入 Deep-sleep 模式,在這種情況下,智能家居wifi芯片wifi藍牙模塊無線模塊樂鑫ESP32-C3 將無限期地處于Deep-sleep 模式,直到外部復位為止。
下述代碼展示了如何配置 Deep-sleep 模式,其中啟用了 GPIO 喚醒、Timer 喚醒,在 Deep-sleep模式下將GPIO4引腳配置為高電平時喚醒,以及進入 Deep-sleep 模式20s后進行Timer 喚醒??紤]到 GPIO4引腳是在高電平時喚醒 ESP32-C3 的,所以在硬件上或者軟件配置上需要添加下拉操作,避免誤喚醒情況的發生。
1.#define DEFAULT_WAKEUP_PIN 4
2.#define DEFAULT_WAKEUP_LEVEL ESP_GPIO_WAKEUP_GPIO_HIGH
3.
4.const gpio_config_t config ={
5. .pin_bit_mask = BIT(DEFAULT_WAKEUP_PIN),
6. .mode= GPIO MODE INPUT,
7. };
8.ESP_ERROR_CHECK(gpio_config(&config));
9.ESP_ERROR_CHECK(esp_deep_sleep_enable_gpio_wakeup(BIT(DEFAULT WAKEUP PIN),
10.DEFAULT WAKEUP LEVEL)):
11.ESP_LOGI(“TAG",“Enabling GPIO wakeup on pins GPIO%d\n",
12.DEFAULT_WAKEUP_PIN):
13.
14.const int wakeup_time_sec = 20;
15.ESP_LOGI("TAG","Enabling timer wakeup, %ds\n",wakeup_time_sec);
16.esp_sleep_enable_timer_wakeup(wakeup_time_sec * 1000000);
17.
18./*Enter deep sleep*/
19.esp_deep_sleep_start();