forked from espressif/esp-idf
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
|
||||
*/
|
||||
@@ -90,8 +90,11 @@ static void test_gpio_intr_callback(void *args)
|
||||
NOINLINE_ATTR IRAM_ATTR static void test_gpio_simulate_glitch_pulse(void)
|
||||
{
|
||||
// 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(
|
||||
"csrrsi zero, %0, 0x1\n"
|
||||
"csrrsi zero, %0, 0x1\n"
|
||||
"csrrsi zero, %0, 0x1\n"
|
||||
"csrrsi zero, %0, 0x1\n"
|
||||
"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]")
|
||||
{
|
||||
const gpio_num_t test_gpio = 0;
|
||||
const gpio_num_t test_gpio = 2;
|
||||
|
||||
printf("initialize GPIO for input and out\r\n");
|
||||
gpio_config_t gpio_cfg = {
|
||||
@@ -132,15 +135,19 @@ TEST_CASE("GPIO flex glitch filter enable/disable", "[gpio_filter]")
|
||||
.window_width_ns = 500,
|
||||
};
|
||||
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");
|
||||
gpio_install_isr_service(0);
|
||||
SemaphoreHandle_t sem = xSemaphoreCreateBinary();
|
||||
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");
|
||||
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
|
||||
TEST_ASSERT_EQUAL(pdFALSE, xSemaphoreTake(sem, pdMS_TO_TICKS(1000)));
|
||||
|
Reference in New Issue
Block a user