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;