From a0e8c4692a4fa49f60b8124cf0b660a7ae211944 Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 26 Sep 2022 16:45:57 +0800 Subject: [PATCH] pcnt: rotary encoder wake up system from light sleep example --- examples/peripherals/pcnt/rotary_encoder/README.md | 2 ++ .../pcnt/rotary_encoder/main/Kconfig.projbuild | 8 ++++++++ .../rotary_encoder/main/rotary_encoder_example_main.c | 10 ++++++++++ 3 files changed, 20 insertions(+) create mode 100644 examples/peripherals/pcnt/rotary_encoder/main/Kconfig.projbuild diff --git a/examples/peripherals/pcnt/rotary_encoder/README.md b/examples/peripherals/pcnt/rotary_encoder/README.md index b358306b6f..4007b08821 100644 --- a/examples/peripherals/pcnt/rotary_encoder/README.md +++ b/examples/peripherals/pcnt/rotary_encoder/README.md @@ -53,6 +53,8 @@ The GPIO used by the example can be changed according to your board by `EXAMPLE_ ### Build and Flash +By configuring one of the EC11 GPIO (e.g. `EXAMPLE_EC11_GPIO_A`) as a wake up source, we can make the rotary encoder wake the system from light sleep. This example can illustrate this feature if you enable the `EXAMPLE_WAKE_UP_LIGHT_SLEEP` from the menuconfig. + Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. (To exit the serial monitor, type ``Ctrl-]``.) diff --git a/examples/peripherals/pcnt/rotary_encoder/main/Kconfig.projbuild b/examples/peripherals/pcnt/rotary_encoder/main/Kconfig.projbuild new file mode 100644 index 0000000000..c7e6cd1f34 --- /dev/null +++ b/examples/peripherals/pcnt/rotary_encoder/main/Kconfig.projbuild @@ -0,0 +1,8 @@ +menu "Example Configuration" + config EXAMPLE_WAKE_UP_LIGHT_SLEEP + bool "Configure the EC11 to wake up light sleep" + default "n" + help + Whether to use one of the EC11 channel to wake up the chip from light sleep. + The wake up is not triggered by PCNT peripheral, but by the digital GPIO. +endmenu diff --git a/examples/peripherals/pcnt/rotary_encoder/main/rotary_encoder_example_main.c b/examples/peripherals/pcnt/rotary_encoder/main/rotary_encoder_example_main.c index 079a803520..eea9e965a5 100644 --- a/examples/peripherals/pcnt/rotary_encoder/main/rotary_encoder_example_main.c +++ b/examples/peripherals/pcnt/rotary_encoder/main/rotary_encoder_example_main.c @@ -4,11 +4,14 @@ * SPDX-License-Identifier: CC0-1.0 */ +#include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "esp_log.h" #include "driver/pulse_cnt.h" +#include "driver/gpio.h" +#include "esp_sleep.h" static const char *TAG = "example"; @@ -81,6 +84,13 @@ void app_main(void) ESP_LOGI(TAG, "start pcnt unit"); ESP_ERROR_CHECK(pcnt_unit_start(pcnt_unit)); +#if CONFIG_EXAMPLE_WAKE_UP_LIGHT_SLEEP + // EC11 channel output high level in normal state, so we set "low level" to wake up the chip + ESP_ERROR_CHECK(gpio_wakeup_enable(EXAMPLE_EC11_GPIO_A, GPIO_INTR_LOW_LEVEL)); + ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup()); + ESP_ERROR_CHECK(esp_light_sleep_start()); +#endif + // Report counter value int pulse_count = 0; int event_count = 0;