Merge branch 'feature/pcnt_light_sleep' into 'master'

pcnt: rotary encoder wake up system from light sleep example

Closes IDFGH-8592

See merge request espressif/esp-idf!20338
This commit is contained in:
morris
2022-10-27 11:54:25 +08:00
5 changed files with 22 additions and 2 deletions

View File

@@ -227,7 +227,7 @@ You can check current count value at any time by calling :cpp:func:`pcnt_unit_ge
.. note::
The returned count value is a **signed** integer, where the sign can be used to reflect the direction. The internal counter will overflow when it reaches high or low limit, but this function doesn't compensate for that loss.
The returned count value is a **signed** integer, where the sign can be used to reflect the direction. The internal counter will be cleared to zero automatically when it reaches high or low limit, but this function doesn't compensate for that loss.
.. code:: c

View File

@@ -227,7 +227,7 @@ PCNT 单元的滤波器可滤除信号中的短时毛刺,:cpp:type:`pcnt_glitc
.. note::
返回的计数器数值是一个 **带符号** 的整数,符号代表计数方向。计数器的数值大于等于最大值或小于等于最小值时,计数器会溢出
返回的计数器数值是一个 **带符号** 的整数,符号代表计数方向。计数器的数值大于等于最大值或小于等于最小值时,计数器会自动清零
.. code:: c

View File

@@ -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-]``.)

View File

@@ -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

View File

@@ -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;