Skip to content

Commit

Permalink
Merge branch 'feature/pcnt_light_sleep' into 'master'
Browse files Browse the repository at this point in the history
pcnt: rotary encoder wake up system from light sleep example

Closes IDFGH-8592

See merge request espressif/esp-idf!20338
  • Loading branch information
suda-morris committed Oct 27, 2022
2 parents 37c2b64 + e6e1d69 commit 2c9ded3
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 2 deletions.
2 changes: 1 addition & 1 deletion docs/en/api-reference/peripherals/pcnt.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion docs/zh_CN/api-reference/peripherals/pcnt.rst
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ PCNT 单元的滤波器可滤除信号中的短时毛刺,:cpp:type:`pcnt_glitc

.. note::

返回的计数器数值是一个 **带符号** 的整数,符号代表计数方向。计数器的数值大于等于最大值或小于等于最小值时,计数器会溢出
返回的计数器数值是一个 **带符号** 的整数,符号代表计数方向。计数器的数值大于等于最大值或小于等于最小值时,计数器会自动清零

.. code:: c
Expand Down
2 changes: 2 additions & 0 deletions examples/peripherals/pcnt/rotary_encoder/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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-]``.)
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 2c9ded3

Please sign in to comment.