*/
esp_err_t esp_sleep_enable_ulp_wakeup();
-/**
+ /**
* @brief Enable wakeup by timer
* @param time_in_us time before wakeup, in microseconds
* @return
*/
esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us);
+/**
+ * @brief Disable timer wakeup
+ *
+ * This function is used to deactivate timer wakeup trigger
+ * after first sleep for example to allow wakeup from other sources.
+ *
+ * @note This function does not modify wakeup configuration in RTC.
+ * It will be performed in esp_sleep_start function.
+ *
+ * See docs/sleep-modes.rst for details.
+ *
+ * @return
+ * - ESP_OK on success
+ * - ESP_ERR_INVALID_STATE if trigger was not active
+ */
+esp_err_t esp_sleep_disable_timer_wakeup();
+
/**
* @brief Enable wakeup by touch sensor
*
return ESP_OK;
}
+esp_err_t esp_sleep_disable_timer_wakeup()
+{
+ if (s_config.wakeup_triggers & RTC_TIMER_TRIG_EN) {
+ // The only timer wakeup trigger should be disabled, setup will
+ // be performed in rtc_sleep_start() which updates wakeup options
+ // in RTC peripheral registers
+ s_config.wakeup_triggers &= ~RTC_TIMER_TRIG_EN;
+ s_config.sleep_duration = 0;
+ }
+ else {
+ ESP_LOGE(TAG, "The timer wake-up trigger is not set.");
+ return ESP_ERR_INVALID_STATE;
+ }
+ return ESP_OK;
+}
+
static void timer_wakeup_prepare()
{
uint32_t period = esp_clk_slowclk_cal_get();
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
+#define ESP_EXT0_WAKEUP_LEVEL_LOW 0
+#define ESP_EXT0_WAKEUP_LEVEL_HIGH 1
+
TEST_CASE("esp_deepsleep works", "[deepsleep][reset=DEEPSLEEP_RESET]")
{
esp_deep_sleep(2000000);
esp_deep_sleep_start();
}
-
TEST_CASE("wake up from light sleep using timer", "[deepsleep]")
{
esp_sleep_enable_timer_wakeup(2000000);
TEST_ASSERT_INT32_WITHIN(500, 2000, (int) dt);
}
+TEST_CASE("wake up disable timer for ext0 wakeup (13 low)", "[deepsleep][ignore]")
+{
+ // Setup timer to wakeup with timeout
+ esp_sleep_enable_timer_wakeup(2000000);
+ struct timeval tv_start, tv_stop;
+ gettimeofday(&tv_start, NULL);
+ esp_light_sleep_start();
+ gettimeofday(&tv_stop, NULL);
+ float dt = (tv_stop.tv_sec - tv_start.tv_sec) * 1e3f +
+ (tv_stop.tv_usec - tv_start.tv_usec) * 1e-3f;
+ printf("Timer sleep time = %d\r\n", (int)dt);
+
+ TEST_ASSERT_INT32_WITHIN(500, 2000, (int) dt);
+
+ // Setup ext0 configuration to wake up
+ ESP_ERROR_CHECK(rtc_gpio_init(GPIO_NUM_13));
+ ESP_ERROR_CHECK(gpio_pullup_en(GPIO_NUM_13));
+ ESP_ERROR_CHECK(gpio_pulldown_dis(GPIO_NUM_13));
+ ESP_ERROR_CHECK(esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, ESP_EXT0_WAKEUP_LEVEL_LOW));
+
+ // Disable timer wakeup trigger to wakeup from ext0 source
+ // instead of timer wakeup
+ ESP_ERROR_CHECK(esp_sleep_disable_timer_wakeup());
+ printf("Waiting low level on GPIO_13\r\n");
+
+ gettimeofday(&tv_start, NULL);
+ esp_light_sleep_start();
+ gettimeofday(&tv_stop, NULL);
+
+ dt = (tv_stop.tv_sec - tv_start.tv_sec) * 1e3f +
+ (tv_stop.tv_usec - tv_start.tv_usec) * 1e-3f;
+ printf("Ext0 sleep time = %d\r\n", (int)dt);
+
+ // Check error message
+ esp_err_t err_code = esp_sleep_disable_timer_wakeup();
+ TEST_ASSERT(err_code == ESP_ERR_INVALID_STATE);
+}
+
#ifndef CONFIG_FREERTOS_UNICORE
TEST_CASE("enter deep sleep on APP CPU and wake up using timer", "[deepsleep][reset=DEEPSLEEP_RESET]")
{
ESP_ERROR_CHECK(rtc_gpio_init(GPIO_NUM_13));
ESP_ERROR_CHECK(gpio_pullup_dis(GPIO_NUM_13));
ESP_ERROR_CHECK(gpio_pulldown_en(GPIO_NUM_13));
- ESP_ERROR_CHECK(esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1));
+ ESP_ERROR_CHECK(esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, ESP_EXT0_WAKEUP_LEVEL_HIGH));
esp_deep_sleep_start();
}
ESP_ERROR_CHECK(rtc_gpio_init(GPIO_NUM_13));
ESP_ERROR_CHECK(gpio_pullup_en(GPIO_NUM_13));
ESP_ERROR_CHECK(gpio_pulldown_dis(GPIO_NUM_13));
- ESP_ERROR_CHECK(esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 0));
+ ESP_ERROR_CHECK(esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, ESP_EXT0_WAKEUP_LEVEL_LOW));
esp_deep_sleep_start();
}