mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-07 22:54:33 +02:00
Merge branch 'bugfix/gpio_glitch_filter_test' into 'master'
driver: improve gpio glitch filter test Closes IDFCI-1621 and IDFCI-1622 See merge request espressif/esp-idf!22477
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -90,8 +90,11 @@ static void test_gpio_intr_callback(void *args)
|
|||||||
NOINLINE_ATTR IRAM_ATTR static void test_gpio_simulate_glitch_pulse(void)
|
NOINLINE_ATTR IRAM_ATTR static void test_gpio_simulate_glitch_pulse(void)
|
||||||
{
|
{
|
||||||
// the following code is used to generate a short glitch pulse
|
// the following code is used to generate a short glitch pulse
|
||||||
// around 10ns @CPU160MHz
|
// around 20ns @CPU160MHz, 40ns @CPU96MHz
|
||||||
|
// pull high for 4 CPU cycles, to ensure the short pulse can be sampled by GPIO
|
||||||
asm volatile(
|
asm volatile(
|
||||||
|
"csrrsi zero, %0, 0x1\n"
|
||||||
|
"csrrsi zero, %0, 0x1\n"
|
||||||
"csrrsi zero, %0, 0x1\n"
|
"csrrsi zero, %0, 0x1\n"
|
||||||
"csrrsi zero, %0, 0x1\n"
|
"csrrsi zero, %0, 0x1\n"
|
||||||
"csrrci zero, %0, 0x1"
|
"csrrci zero, %0, 0x1"
|
||||||
@@ -101,7 +104,7 @@ NOINLINE_ATTR IRAM_ATTR static void test_gpio_simulate_glitch_pulse(void)
|
|||||||
|
|
||||||
TEST_CASE("GPIO flex glitch filter enable/disable", "[gpio_filter]")
|
TEST_CASE("GPIO flex glitch filter enable/disable", "[gpio_filter]")
|
||||||
{
|
{
|
||||||
const gpio_num_t test_gpio = 0;
|
const gpio_num_t test_gpio = 2;
|
||||||
|
|
||||||
printf("initialize GPIO for input and out\r\n");
|
printf("initialize GPIO for input and out\r\n");
|
||||||
gpio_config_t gpio_cfg = {
|
gpio_config_t gpio_cfg = {
|
||||||
@@ -132,15 +135,19 @@ TEST_CASE("GPIO flex glitch filter enable/disable", "[gpio_filter]")
|
|||||||
.window_width_ns = 500,
|
.window_width_ns = 500,
|
||||||
};
|
};
|
||||||
TEST_ESP_OK((gpio_new_flex_glitch_filter(&filter_cfg, &filter)));
|
TEST_ESP_OK((gpio_new_flex_glitch_filter(&filter_cfg, &filter)));
|
||||||
TEST_ESP_OK(gpio_glitch_filter_enable(filter));
|
|
||||||
|
|
||||||
printf("install gpio interrupt\r\n");
|
printf("install gpio interrupt\r\n");
|
||||||
gpio_install_isr_service(0);
|
gpio_install_isr_service(0);
|
||||||
SemaphoreHandle_t sem = xSemaphoreCreateBinary();
|
SemaphoreHandle_t sem = xSemaphoreCreateBinary();
|
||||||
TEST_ESP_OK(gpio_isr_handler_add(test_gpio, test_gpio_intr_callback, sem));
|
TEST_ESP_OK(gpio_isr_handler_add(test_gpio, test_gpio_intr_callback, sem));
|
||||||
|
|
||||||
|
printf("enable the glitch filter\r\n");
|
||||||
|
TEST_ESP_OK(gpio_glitch_filter_enable(filter));
|
||||||
|
|
||||||
printf("generate rising edge glitch signal\r\n");
|
printf("generate rising edge glitch signal\r\n");
|
||||||
test_gpio_simulate_glitch_pulse();
|
for (int i = 0; i < 10; i++) {
|
||||||
|
test_gpio_simulate_glitch_pulse();
|
||||||
|
}
|
||||||
|
|
||||||
// should timeout, because the glitch is filtered out
|
// should timeout, because the glitch is filtered out
|
||||||
TEST_ASSERT_EQUAL(pdFALSE, xSemaphoreTake(sem, pdMS_TO_TICKS(1000)));
|
TEST_ASSERT_EQUAL(pdFALSE, xSemaphoreTake(sem, pdMS_TO_TICKS(1000)));
|
||||||
|
Reference in New Issue
Block a user