mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
64 lines
2.0 KiB
C
64 lines
2.0 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
|
*/
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "esp_check.h"
|
|
#include "esp_sleep.h"
|
|
#include "driver/gpio.h"
|
|
|
|
/* Most development boards have "boot" button attached to GPIO0.
|
|
* You can also change this to another pin.
|
|
*/
|
|
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32H2 \
|
|
|| CONFIG_IDF_TARGET_ESP32C6
|
|
#define BOOT_BUTTON_NUM 9
|
|
#elif CONFIG_IDF_TARGET_ESP32C5
|
|
#define BOOT_BUTTON_NUM 28
|
|
#elif CONFIG_IDF_TARGET_ESP32P4
|
|
#define BOOT_BUTTON_NUM 35
|
|
#else
|
|
#define BOOT_BUTTON_NUM 0
|
|
#endif
|
|
|
|
/* Use boot button as gpio input */
|
|
#define GPIO_WAKEUP_NUM BOOT_BUTTON_NUM
|
|
/* "Boot" button is active low */
|
|
#define GPIO_WAKEUP_LEVEL 0
|
|
|
|
static const char *TAG = "gpio_wakeup";
|
|
|
|
void example_wait_gpio_inactive(void)
|
|
{
|
|
printf("Waiting for GPIO%d to go high...\n", GPIO_WAKEUP_NUM);
|
|
while (gpio_get_level(GPIO_WAKEUP_NUM) == GPIO_WAKEUP_LEVEL) {
|
|
vTaskDelay(pdMS_TO_TICKS(10));
|
|
}
|
|
}
|
|
|
|
esp_err_t example_register_gpio_wakeup(void)
|
|
{
|
|
/* Initialize GPIO */
|
|
gpio_config_t config = {
|
|
.pin_bit_mask = BIT64(GPIO_WAKEUP_NUM),
|
|
.mode = GPIO_MODE_INPUT,
|
|
.pull_down_en = false,
|
|
.pull_up_en = false,
|
|
.intr_type = GPIO_INTR_DISABLE
|
|
};
|
|
ESP_RETURN_ON_ERROR(gpio_config(&config), TAG, "Initialize GPIO%d failed", GPIO_WAKEUP_NUM);
|
|
|
|
/* Enable wake up from GPIO */
|
|
ESP_RETURN_ON_ERROR(gpio_wakeup_enable(GPIO_WAKEUP_NUM, GPIO_WAKEUP_LEVEL == 0 ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL),
|
|
TAG, "Enable gpio wakeup failed");
|
|
ESP_RETURN_ON_ERROR(esp_sleep_enable_gpio_wakeup(), TAG, "Configure gpio as wakeup source failed");
|
|
|
|
/* Make sure the GPIO is inactive and it won't trigger wakeup immediately */
|
|
example_wait_gpio_inactive();
|
|
ESP_LOGI(TAG, "gpio wakeup source is ready");
|
|
|
|
return ESP_OK;
|
|
}
|