forked from espressif/esp-idf
pcnt: replace isr register with isr service in example
This commit is contained in:
@@ -14,6 +14,8 @@
|
|||||||
#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 "soc/soc_caps.h"
|
||||||
|
#if SOC_PCNT_SUPPORTED
|
||||||
#include "driver/periph_ctrl.h"
|
#include "driver/periph_ctrl.h"
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "driver/pcnt.h"
|
#include "driver/pcnt.h"
|
||||||
@@ -21,12 +23,9 @@
|
|||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "soc/gpio_periph.h"
|
#include "soc/gpio_periph.h"
|
||||||
#include "soc/soc_caps.h"
|
|
||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "esp_rom_gpio.h"
|
#include "esp_rom_gpio.h"
|
||||||
|
|
||||||
#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3)
|
|
||||||
|
|
||||||
#define PULSE_IO 21
|
#define PULSE_IO 21
|
||||||
#define PCNT_INPUT_IO 4
|
#define PCNT_INPUT_IO 4
|
||||||
#define PCNT_CTRL_VCC_IO 5
|
#define PCNT_CTRL_VCC_IO 5
|
||||||
@@ -673,4 +672,4 @@ TEST_CASE("PCNT counting mode test", "[pcnt]")
|
|||||||
count_mode_test(PCNT_CTRL_GND_IO);
|
count_mode_test(PCNT_CTRL_GND_IO);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // #if SOC_PCNT_SUPPORTED
|
||||||
|
@@ -9,18 +9,16 @@
|
|||||||
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||||
CONDITIONS OF ANY KIND, either express or implied.
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/portmacro.h"
|
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "freertos/queue.h"
|
#include "freertos/queue.h"
|
||||||
#include "driver/periph_ctrl.h"
|
|
||||||
#include "driver/ledc.h"
|
#include "driver/ledc.h"
|
||||||
#include "driver/gpio.h"
|
|
||||||
#include "driver/pcnt.h"
|
#include "driver/pcnt.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
static const char *TAG = "example";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TEST CODE BRIEF
|
* TEST CODE BRIEF
|
||||||
*
|
*
|
||||||
@@ -43,7 +41,6 @@
|
|||||||
* - reaches 'l_lim' value or 'h_lim' value,
|
* - reaches 'l_lim' value or 'h_lim' value,
|
||||||
* - will be reset to zero.
|
* - will be reset to zero.
|
||||||
*/
|
*/
|
||||||
#define PCNT_TEST_UNIT PCNT_UNIT_0
|
|
||||||
#define PCNT_H_LIM_VAL 10
|
#define PCNT_H_LIM_VAL 10
|
||||||
#define PCNT_L_LIM_VAL -10
|
#define PCNT_L_LIM_VAL -10
|
||||||
#define PCNT_THRESH1_VAL 5
|
#define PCNT_THRESH1_VAL 5
|
||||||
@@ -53,7 +50,6 @@
|
|||||||
#define LEDC_OUTPUT_IO 18 // Output GPIO of a sample 1 Hz pulse generator
|
#define LEDC_OUTPUT_IO 18 // Output GPIO of a sample 1 Hz pulse generator
|
||||||
|
|
||||||
xQueueHandle pcnt_evt_queue; // A queue to handle pulse counter events
|
xQueueHandle pcnt_evt_queue; // A queue to handle pulse counter events
|
||||||
pcnt_isr_handle_t user_isr_handle = NULL; //user's ISR service handle
|
|
||||||
|
|
||||||
/* A sample structure to pass events from the PCNT
|
/* A sample structure to pass events from the PCNT
|
||||||
* interrupt handler to the main program.
|
* interrupt handler to the main program.
|
||||||
@@ -69,24 +65,13 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
static void IRAM_ATTR pcnt_example_intr_handler(void *arg)
|
static void IRAM_ATTR pcnt_example_intr_handler(void *arg)
|
||||||
{
|
{
|
||||||
uint32_t intr_status = PCNT.int_st.val;
|
int pcnt_unit = (int)arg;
|
||||||
int i;
|
|
||||||
pcnt_evt_t evt;
|
pcnt_evt_t evt;
|
||||||
portBASE_TYPE HPTaskAwoken = pdFALSE;
|
evt.unit = pcnt_unit;
|
||||||
|
/* Save the PCNT event type that caused an interrupt
|
||||||
for (i = 0; i < PCNT_UNIT_MAX; i++) {
|
to pass it to the main program */
|
||||||
if (intr_status & (BIT(i))) {
|
pcnt_get_event_status(pcnt_unit, &evt.status);
|
||||||
evt.unit = i;
|
xQueueSendFromISR(pcnt_evt_queue, &evt, NULL);
|
||||||
/* Save the PCNT event type that caused an interrupt
|
|
||||||
to pass it to the main program */
|
|
||||||
evt.status = PCNT.status_unit[i].val;
|
|
||||||
PCNT.int_clr.val = BIT(i);
|
|
||||||
xQueueSendFromISR(pcnt_evt_queue, &evt, &HPTaskAwoken);
|
|
||||||
if (HPTaskAwoken == pdTRUE) {
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Configure LED PWM Controller
|
/* Configure LED PWM Controller
|
||||||
@@ -120,7 +105,7 @@ static void ledc_init(void)
|
|||||||
* - set up the input filter
|
* - set up the input filter
|
||||||
* - set up the counter events to watch
|
* - set up the counter events to watch
|
||||||
*/
|
*/
|
||||||
static void pcnt_example_init(void)
|
static void pcnt_example_init(int unit)
|
||||||
{
|
{
|
||||||
/* Prepare configuration for the PCNT unit */
|
/* Prepare configuration for the PCNT unit */
|
||||||
pcnt_config_t pcnt_config = {
|
pcnt_config_t pcnt_config = {
|
||||||
@@ -128,7 +113,7 @@ static void pcnt_example_init(void)
|
|||||||
.pulse_gpio_num = PCNT_INPUT_SIG_IO,
|
.pulse_gpio_num = PCNT_INPUT_SIG_IO,
|
||||||
.ctrl_gpio_num = PCNT_INPUT_CTRL_IO,
|
.ctrl_gpio_num = PCNT_INPUT_CTRL_IO,
|
||||||
.channel = PCNT_CHANNEL_0,
|
.channel = PCNT_CHANNEL_0,
|
||||||
.unit = PCNT_TEST_UNIT,
|
.unit = unit,
|
||||||
// What to do on the positive / negative edge of pulse input?
|
// What to do on the positive / negative edge of pulse input?
|
||||||
.pos_mode = PCNT_COUNT_INC, // Count up on the positive edge
|
.pos_mode = PCNT_COUNT_INC, // Count up on the positive edge
|
||||||
.neg_mode = PCNT_COUNT_DIS, // Keep the counter value on the negative edge
|
.neg_mode = PCNT_COUNT_DIS, // Keep the counter value on the negative edge
|
||||||
@@ -143,39 +128,40 @@ static void pcnt_example_init(void)
|
|||||||
pcnt_unit_config(&pcnt_config);
|
pcnt_unit_config(&pcnt_config);
|
||||||
|
|
||||||
/* Configure and enable the input filter */
|
/* Configure and enable the input filter */
|
||||||
pcnt_set_filter_value(PCNT_TEST_UNIT, 100);
|
pcnt_set_filter_value(unit, 100);
|
||||||
pcnt_filter_enable(PCNT_TEST_UNIT);
|
pcnt_filter_enable(unit);
|
||||||
|
|
||||||
/* Set threshold 0 and 1 values and enable events to watch */
|
/* Set threshold 0 and 1 values and enable events to watch */
|
||||||
pcnt_set_event_value(PCNT_TEST_UNIT, PCNT_EVT_THRES_1, PCNT_THRESH1_VAL);
|
pcnt_set_event_value(unit, PCNT_EVT_THRES_1, PCNT_THRESH1_VAL);
|
||||||
pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_THRES_1);
|
pcnt_event_enable(unit, PCNT_EVT_THRES_1);
|
||||||
pcnt_set_event_value(PCNT_TEST_UNIT, PCNT_EVT_THRES_0, PCNT_THRESH0_VAL);
|
pcnt_set_event_value(unit, PCNT_EVT_THRES_0, PCNT_THRESH0_VAL);
|
||||||
pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_THRES_0);
|
pcnt_event_enable(unit, PCNT_EVT_THRES_0);
|
||||||
/* Enable events on zero, maximum and minimum limit values */
|
/* Enable events on zero, maximum and minimum limit values */
|
||||||
pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_ZERO);
|
pcnt_event_enable(unit, PCNT_EVT_ZERO);
|
||||||
pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_H_LIM);
|
pcnt_event_enable(unit, PCNT_EVT_H_LIM);
|
||||||
pcnt_event_enable(PCNT_TEST_UNIT, PCNT_EVT_L_LIM);
|
pcnt_event_enable(unit, PCNT_EVT_L_LIM);
|
||||||
|
|
||||||
/* Initialize PCNT's counter */
|
/* Initialize PCNT's counter */
|
||||||
pcnt_counter_pause(PCNT_TEST_UNIT);
|
pcnt_counter_pause(unit);
|
||||||
pcnt_counter_clear(PCNT_TEST_UNIT);
|
pcnt_counter_clear(unit);
|
||||||
|
|
||||||
/* Register ISR handler and enable interrupts for PCNT unit */
|
/* Install interrupt service and add isr callback handler */
|
||||||
pcnt_isr_register(pcnt_example_intr_handler, NULL, 0, &user_isr_handle);
|
pcnt_isr_service_install(0);
|
||||||
pcnt_intr_enable(PCNT_TEST_UNIT);
|
pcnt_isr_handler_add(unit, pcnt_example_intr_handler, (void *)unit);
|
||||||
|
|
||||||
/* Everything is set up, now go to counting */
|
/* Everything is set up, now go to counting */
|
||||||
pcnt_counter_resume(PCNT_TEST_UNIT);
|
pcnt_counter_resume(unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_main(void)
|
void app_main(void)
|
||||||
{
|
{
|
||||||
|
int pcnt_unit = PCNT_UNIT_0;
|
||||||
/* Initialize LEDC to generate sample pulse signal */
|
/* Initialize LEDC to generate sample pulse signal */
|
||||||
ledc_init();
|
ledc_init();
|
||||||
|
|
||||||
/* Initialize PCNT event queue and PCNT functions */
|
/* Initialize PCNT event queue and PCNT functions */
|
||||||
pcnt_evt_queue = xQueueCreate(10, sizeof(pcnt_evt_t));
|
pcnt_evt_queue = xQueueCreate(10, sizeof(pcnt_evt_t));
|
||||||
pcnt_example_init();
|
pcnt_example_init(pcnt_unit);
|
||||||
|
|
||||||
int16_t count = 0;
|
int16_t count = 0;
|
||||||
pcnt_evt_t evt;
|
pcnt_evt_t evt;
|
||||||
@@ -186,31 +172,26 @@ void app_main(void)
|
|||||||
*/
|
*/
|
||||||
res = xQueueReceive(pcnt_evt_queue, &evt, 1000 / portTICK_PERIOD_MS);
|
res = xQueueReceive(pcnt_evt_queue, &evt, 1000 / portTICK_PERIOD_MS);
|
||||||
if (res == pdTRUE) {
|
if (res == pdTRUE) {
|
||||||
pcnt_get_counter_value(PCNT_TEST_UNIT, &count);
|
pcnt_get_counter_value(pcnt_unit, &count);
|
||||||
printf("Event PCNT unit[%d]; cnt: %d\n", evt.unit, count);
|
ESP_LOGI(TAG, "Event PCNT unit[%d]; cnt: %d", evt.unit, count);
|
||||||
if (evt.status & PCNT_EVT_THRES_1) {
|
if (evt.status & PCNT_EVT_THRES_1) {
|
||||||
printf("THRES1 EVT\n");
|
ESP_LOGI(TAG, "THRES1 EVT");
|
||||||
}
|
}
|
||||||
if (evt.status & PCNT_EVT_THRES_0) {
|
if (evt.status & PCNT_EVT_THRES_0) {
|
||||||
printf("THRES0 EVT\n");
|
ESP_LOGI(TAG, "THRES0 EVT");
|
||||||
}
|
}
|
||||||
if (evt.status & PCNT_EVT_L_LIM) {
|
if (evt.status & PCNT_EVT_L_LIM) {
|
||||||
printf("L_LIM EVT\n");
|
ESP_LOGI(TAG, "L_LIM EVT");
|
||||||
}
|
}
|
||||||
if (evt.status & PCNT_EVT_H_LIM) {
|
if (evt.status & PCNT_EVT_H_LIM) {
|
||||||
printf("H_LIM EVT\n");
|
ESP_LOGI(TAG, "H_LIM EVT");
|
||||||
}
|
}
|
||||||
if (evt.status & PCNT_EVT_ZERO) {
|
if (evt.status & PCNT_EVT_ZERO) {
|
||||||
printf("ZERO EVT\n");
|
ESP_LOGI(TAG, "ZERO EVT");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pcnt_get_counter_value(PCNT_TEST_UNIT, &count);
|
pcnt_get_counter_value(pcnt_unit, &count);
|
||||||
printf("Current counter value :%d\n", count);
|
ESP_LOGI(TAG, "Current counter value :%d", count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(user_isr_handle) {
|
|
||||||
//Free the ISR service handle.
|
|
||||||
esp_intr_free(user_isr_handle);
|
|
||||||
user_isr_handle = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user