mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-04 13:14:32 +02:00
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:
@@ -227,7 +227,7 @@ You can check current count value at any time by calling :cpp:func:`pcnt_unit_ge
|
|||||||
|
|
||||||
.. note::
|
.. 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
|
.. code:: c
|
||||||
|
|
||||||
|
@@ -227,7 +227,7 @@ PCNT 单元的滤波器可滤除信号中的短时毛刺,:cpp:type:`pcnt_glitc
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
返回的计数器数值是一个 **带符号** 的整数,符号代表计数方向。计数器的数值大于等于最大值或小于等于最小值时,计数器会溢出。
|
返回的计数器数值是一个 **带符号** 的整数,符号代表计数方向。计数器的数值大于等于最大值或小于等于最小值时,计数器会自动清零。
|
||||||
|
|
||||||
.. code:: c
|
.. code:: c
|
||||||
|
|
||||||
|
@@ -53,6 +53,8 @@ The GPIO used by the example can be changed according to your board by `EXAMPLE_
|
|||||||
|
|
||||||
### Build and Flash
|
### 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.
|
Run `idf.py -p PORT flash monitor` to build, flash and monitor the project.
|
||||||
|
|
||||||
(To exit the serial monitor, type ``Ctrl-]``.)
|
(To exit the serial monitor, type ``Ctrl-]``.)
|
||||||
|
@@ -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
|
@@ -4,11 +4,14 @@
|
|||||||
* SPDX-License-Identifier: CC0-1.0
|
* SPDX-License-Identifier: CC0-1.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "sdkconfig.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "freertos/queue.h"
|
#include "freertos/queue.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "driver/pulse_cnt.h"
|
#include "driver/pulse_cnt.h"
|
||||||
|
#include "driver/gpio.h"
|
||||||
|
#include "esp_sleep.h"
|
||||||
|
|
||||||
static const char *TAG = "example";
|
static const char *TAG = "example";
|
||||||
|
|
||||||
@@ -81,6 +84,13 @@ void app_main(void)
|
|||||||
ESP_LOGI(TAG, "start pcnt unit");
|
ESP_LOGI(TAG, "start pcnt unit");
|
||||||
ESP_ERROR_CHECK(pcnt_unit_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
|
// Report counter value
|
||||||
int pulse_count = 0;
|
int pulse_count = 0;
|
||||||
int event_count = 0;
|
int event_count = 0;
|
||||||
|
Reference in New Issue
Block a user