in ESP32 C3
esp32 c3 have no disable gpio wakeup function. so, gpio wakeup masks adds only.
PROBLEM:
step 1:
esp_deep_sleep_enable_gpio_wakeup( 1<<GPIO_NUM_2 , 0 );
esp_deep_sleep_enable_gpio_wakeup( 1<<GPIO_NUM_5 , 0 );
esp_deep_sleep_start();
step 2:
wakeup
step 3:
esp_deep_sleep_enable_gpio_wakeup( 1<<GPIO_NUM_5 , 0 );
esp_deep_sleep_start();
step 4 (problem):
ESP32 can wakeup by GPIO_NUM_2 !!!!
Reason: ESP32 SDK
esp_deep_sleep_enable_gpio_wakeup does not clear for other pins.
You can modify SDK source code.
sleep_modes.c esp_deep_sleep_enable_gpio_wakeup function
esp_err_t esp_deep_sleep_enable_gpio_wakeup(uint64_t gpio_pin_mask, esp_deepsleep_gpio_wake_up_mode_t mode)
{
if (mode > ESP_GPIO_WAKEUP_GPIO_HIGH) {
ESP_LOGE(TAG, "invalid mode");
return ESP_ERR_INVALID_ARG;
}
gpio_int_type_t intr_type = ((mode == ESP_GPIO_WAKEUP_GPIO_LOW) ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL);
esp_err_t err = ESP_OK;
/*s_config.gpio_wakeup_mask = 0;
for (gpio_num_t gpio_idx = GPIO_NUM_0; gpio_idx < GPIO_NUM_MAX; gpio_idx++, gpio_pin_mask >>= 1)
{
gpio_deep_sleep_wakeup_disable(gpio_idx);
}*/
for (gpio_num_t gpio_idx = GPIO_NUM_0; gpio_idx < 6; gpio_idx++, gpio_pin_mask >>= 1) {
if ((gpio_pin_mask & 1) == 0) {
s_config.gpio_wakeup_mask &= ~BIT(gpio_idx);
gpio_deep_sleep_wakeup_disable(gpio_idx);
continue;
}
if (!esp_sleep_is_valid_wakeup_gpio(gpio_idx)) {
ESP_LOGE(TAG, "invalid mask, please ensure gpio number is no more than 5");
return ESP_ERR_INVALID_ARG;
}
err = gpio_deep_sleep_wakeup_enable(gpio_idx, intr_type);
s_config.gpio_wakeup_mask |= BIT(gpio_idx);
if (mode == ESP_GPIO_WAKEUP_GPIO_HIGH) {
s_config.gpio_trigger_mode |= (mode << gpio_idx);
} else {
s_config.gpio_trigger_mode &= ~(mode << gpio_idx);
}
}
s_config.wakeup_triggers |= RTC_GPIO_TRIG_EN;
rtc_hal_gpio_clear_wakeup_status();
return err;
}
after modify , If you want use multiple pins for wakeup source,
call esp_deep_sleep_enable_gpio_wakeup with pin bitmask.
example: esp_deep_sleep_enable_gpio_wakeup( 1<<GPIO_NUM_2 | 1<<GPIO_NUM_5 );
No comments:
Post a Comment