In light sleep mode, digital peripherals, most of the RAM, and CPUs are clock-gated, and supply voltage is reduced. Upon exit from light sleep, peripherals and CPUs resume operation, their internal state is preserved.
Documentation
https://docs.espressif.com/projects/esp-idf/en/v4.4.5/esp32c3/api-reference/system/sleep_modes.html
Example light sleep function
Used with ESP32 C3
#include "esp_sleep.h"
//#include "esp_bt.h"
//#include "esp_bt_main.h"
//***************************************
//***************************************
//********** ENTER LIGHT SLEEP **********
//***************************************
//***************************************
void EnterLightSleep (void)
{
//----- SET PRE SLEEP GPIO STATE -----
//When entering light sleep GPIO pins will be shut off regardless of state unless you use gpio_hold_en() to force their state to be locked
//Once the ESP32 wakes, the pin level will be set back to whatever level it was in memory prior to entering light sleep
//Set output pin states
gpio_set_level(GPIO_NUM_0, 0);
gpio_set_level(GPIO_NUM_1, 0);
gpio_set_level(GPIO_NUM_3, 0);
//Lock the states
ESP_ERROR_CHECK(gpio_hold_en(GPIO_NUM_0));
ESP_ERROR_CHECK(gpio_hold_en(GPIO_NUM_1));
ESP_ERROR_CHECK(gpio_hold_en(GPIO_NUM_3));
//Optional isolate gpio pins to to prevent extra current draw from pull resistors
//rtc_gpio_isolate(GPIO_NUM_10)
//----- DISABLE WIFI AND BT -----
//If used
//esp_bluedroid_disable();
//esp_bluedroid_deinit();
//esp_bt_controller_disable();
//esp_bt_controller_deinit();
//esp_wifi_stop();
//----- SETUP GPIO INPUTS AS WAKEUP TRIGGERS -----
//Any IO can be used as an external input to wakeup the chip from Light-sleep
//Call gpio_wakeup_enable, specifying gpio number and wakeup level, for each GPIO which is used for wakeup
ESP_ERROR_CHECK(gpio_wakeup_enable(GPIO_NUM_8, GPIO_INTR_LOW_LEVEL)); //GPIO_INTR_LOW_LEVEL or GPIO_INTR_HIGH_LEVEL
ESP_ERROR_CHECK(gpio_wakeup_enable(GPIO_NUM_18, GPIO_INTR_LOW_LEVEL));
ESP_ERROR_CHECK(gpio_wakeup_enable(GPIO_NUM_4, GPIO_INTR_LOW_LEVEL));
//Enable this wakeup source
esp_sleep_enable_gpio_wakeup();
//----- SETUP TIMER AS WAKEUP TRIGGER -----
esp_sleep_enable_timer_wakeup(5000000); //uint64_t value in uS
//-----------------------
//----- GO TO SLEEP -----
//-----------------------
ESP_LOGI(TAG, "Entering light sleep...");
vTaskDelay(100 / portTICK_PERIOD_MS); //Delay to let the console message be sent!
//----- ENTER LIGHT SLEEP MODE -----
esp_light_sleep_start();
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> WE ARE SLEEPING! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ESP_LOGI(TAG, "Wakeup from light sleep...");
//--------------------
//----- WOKEN UP -----
//--------------------
//----- SET POST SLEEP GPIO STATE -----
//Release otuput pin states you previously locked
gpio_hold_dis(GPIO_NUM_0);
gpio_hold_dis(GPIO_NUM_1);
gpio_hold_dis(GPIO_NUM_3);
//Return any output states to normal as needed
gpio_set_level(GPIO_NUM_0, 1);
gpio_set_level(GPIO_NUM_1, 1);
gpio_set_level(GPIO_NUM_3, 1);
}
