mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
feat(example): update gpio edge wakeup support in deepsleep example
This commit is contained in:
@@ -275,12 +275,38 @@ menu "Example Configuration"
|
||||
You need to ensure that the set IO can be configured as a GPIO wake-up source,
|
||||
refer SOC_GPIO_HP_PERIPH_PD_SLEEP_WAKEABLE_MASK in soc_caps.h.
|
||||
|
||||
config EXAMPLE_GPIO_WAKEUP_HIGH_LEVEL
|
||||
bool "Enable GPIO high-level wakeup"
|
||||
default y
|
||||
choice EXAMPLE_GPIO_WAKEUP_TRIGGER
|
||||
prompt "GPIO wakeup trigger type"
|
||||
default EXAMPLE_GPIO_WAKEUP_TRIGGER_HIGH
|
||||
help
|
||||
This option set the gpio wake-up trigger signal, In deep sleep, only high or low level wake-up is
|
||||
supported. If this option is enabled, it is a high level wake up, otherwise it is a low level wake up.
|
||||
Selects esp_sleep_gpio_wake_up_mode_t for
|
||||
esp_sleep_enable_gpio_wakeup_on_hp_periph_powerdown.
|
||||
Edge choices require SOC_RTC_GPIO_EDGE_WAKEUP_SUPPORTED on the target.
|
||||
|
||||
config EXAMPLE_GPIO_WAKEUP_TRIGGER_LOW
|
||||
bool "Low level"
|
||||
config EXAMPLE_GPIO_WAKEUP_TRIGGER_HIGH
|
||||
bool "High level"
|
||||
config EXAMPLE_GPIO_WAKEUP_TRIGGER_POSEDGE
|
||||
bool "Rising edge (posedge)"
|
||||
depends on SOC_RTC_GPIO_EDGE_WAKEUP_SUPPORTED
|
||||
config EXAMPLE_GPIO_WAKEUP_TRIGGER_NEGEDGE
|
||||
bool "Falling edge (negedge)"
|
||||
depends on SOC_RTC_GPIO_EDGE_WAKEUP_SUPPORTED
|
||||
config EXAMPLE_GPIO_WAKEUP_TRIGGER_ANYEDGE
|
||||
bool "Any edge"
|
||||
depends on SOC_RTC_GPIO_EDGE_WAKEUP_SUPPORTED
|
||||
endchoice
|
||||
|
||||
config EXAMPLE_GPIO_WAKEUP_MODE
|
||||
int
|
||||
default 0 if EXAMPLE_GPIO_WAKEUP_TRIGGER_LOW
|
||||
default 1 if EXAMPLE_GPIO_WAKEUP_TRIGGER_HIGH
|
||||
default 2 if EXAMPLE_GPIO_WAKEUP_TRIGGER_POSEDGE
|
||||
default 3 if EXAMPLE_GPIO_WAKEUP_TRIGGER_NEGEDGE
|
||||
default 4 if EXAMPLE_GPIO_WAKEUP_TRIGGER_ANYEDGE
|
||||
help
|
||||
esp_sleep_gpio_wake_up_mode_t index (0=LOW, 1=HIGH, 2=POSEDGE, 3=NEGEDGE, 4=ANYEDGE);
|
||||
endmenu
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -1,34 +1,54 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "driver/gpio.h"
|
||||
#include "hal/gpio_types.h"
|
||||
#include "esp_sleep.h"
|
||||
#include "soc/soc_caps.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#if CONFIG_EXAMPLE_GPIO_WAKEUP
|
||||
#define DEFAULT_WAKEUP_PIN CONFIG_EXAMPLE_GPIO_WAKEUP_PIN
|
||||
#ifdef CONFIG_EXAMPLE_GPIO_WAKEUP_HIGH_LEVEL
|
||||
#define DEFAULT_WAKEUP_LEVEL ESP_GPIO_WAKEUP_GPIO_HIGH
|
||||
#else
|
||||
#define DEFAULT_WAKEUP_LEVEL ESP_GPIO_WAKEUP_GPIO_LOW
|
||||
#define WAKEUP_PIN CONFIG_EXAMPLE_GPIO_WAKEUP_PIN
|
||||
#define WAKEUP_MODE CONFIG_EXAMPLE_GPIO_WAKEUP_MODE
|
||||
|
||||
/* Index by esp_sleep_gpio_wake_up_mode_t */
|
||||
static const char *const s_wakeup_mode_str[] = {
|
||||
"LOW_LEVEL",
|
||||
"HIGH_LEVEL",
|
||||
#if SOC_RTC_GPIO_EDGE_WAKEUP_SUPPORTED
|
||||
"POSEDGE",
|
||||
"NEGEDGE",
|
||||
"ANYEDGE",
|
||||
#endif
|
||||
};
|
||||
|
||||
void example_deep_sleep_register_gpio_wakeup(void)
|
||||
{
|
||||
const esp_sleep_gpio_wake_up_mode_t wakeup_mode = WAKEUP_MODE;
|
||||
#if SOC_RTC_GPIO_EDGE_WAKEUP_SUPPORTED
|
||||
const gpio_pullup_t pull_up_en =
|
||||
((wakeup_mode == ESP_GPIO_WAKEUP_GPIO_LOW) || (wakeup_mode == ESP_GPIO_WAKEUP_GPIO_NEGEDGE)) ? GPIO_PULLUP_ENABLE : GPIO_PULLUP_DISABLE;
|
||||
const gpio_pulldown_t pull_down_en =
|
||||
((wakeup_mode == ESP_GPIO_WAKEUP_GPIO_HIGH) || (wakeup_mode == ESP_GPIO_WAKEUP_GPIO_POSEDGE)) ? GPIO_PULLDOWN_ENABLE : GPIO_PULLDOWN_DISABLE;
|
||||
#else
|
||||
const gpio_pullup_t pull_up_en = (wakeup_mode == ESP_GPIO_WAKEUP_GPIO_LOW) ? GPIO_PULLUP_ENABLE : GPIO_PULLUP_DISABLE;
|
||||
const gpio_pulldown_t pull_down_en = (wakeup_mode == ESP_GPIO_WAKEUP_GPIO_HIGH) ? GPIO_PULLDOWN_ENABLE : GPIO_PULLDOWN_DISABLE;
|
||||
#endif
|
||||
const gpio_config_t config = {
|
||||
.pin_bit_mask = BIT64(DEFAULT_WAKEUP_PIN),
|
||||
.pin_bit_mask = BIT64(WAKEUP_PIN),
|
||||
.mode = GPIO_MODE_INPUT,
|
||||
.pull_up_en = !DEFAULT_WAKEUP_LEVEL,
|
||||
.pull_down_en = DEFAULT_WAKEUP_LEVEL
|
||||
.pull_up_en = pull_up_en,
|
||||
.pull_down_en = pull_down_en,
|
||||
.intr_type = GPIO_INTR_DISABLE,
|
||||
};
|
||||
|
||||
ESP_ERROR_CHECK(gpio_config(&config));
|
||||
ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup_on_hp_periph_powerdown(BIT(DEFAULT_WAKEUP_PIN), DEFAULT_WAKEUP_LEVEL));
|
||||
ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup_on_hp_periph_powerdown(BIT64(WAKEUP_PIN), wakeup_mode));
|
||||
|
||||
printf("Enabling GPIO wakeup on pins GPIO%d\n", DEFAULT_WAKEUP_PIN);
|
||||
printf("Enabling GPIO wakeup on GPIO%d, trigger=%s\n", WAKEUP_PIN, s_wakeup_mode_str[wakeup_mode]);
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user