Calling gpio_config() with intr_type = GPIO_INTR_HIGH/LOW_LEVEL causes reboot

sdt991
Posts: 3
Joined: Thu May 25, 2023 5:50 pm

Calling gpio_config() with intr_type = GPIO_INTR_HIGH/LOW_LEVEL causes reboot

Postby sdt991 » Fri Jun 23, 2023 7:27 pm

ESP32S3, esp-idf-v5.0.1 - GPIO inputs with interrupts

Calling gpio_config() with intr_type of GPIO_INTR_XXXEDGE or GFLAG_INPUT_CHANGING has worked fine for me, and the interrupt functions work as expected.

However, after reading the ESP32 Errata section "The ESP32 GPIO peripheral may not trigger interrupts correctly." I tried to implement the workaround where using GPIO_INTR_HIGH/LOW_LEVEL interrupts and flipping the level each time the ISR is called.
See https://github.com/espressif/esp-idf/issues/9746 for a great explanation.

The problem I'm seeing is that if gpio_config() is called with GPIO_INTR_LOW_LEVEL and the pin is already low or if it's called with GPIO_INTR_HIGH_LEVEL and the pin is already high the interrupt occurs within gpio_config() and the code seems to get stuck in an endless ISR loop, before rebooting.

I have tried configuring the GPIO and an input and reading its value prior to selecting GPIO_INTR_HIGH/LOW_LEVEL but this still leaves a race condition.

There appears to be a workaround of using gpio_config() to setup the GPIO as an input (pullup, pulldown etc) with intr_type = GPIO_INTR_DISABLE, and then following this by calling gpio_set_intr_type(GPIO_INTR_HIGH/LOW_LEVEL) and gpio_intr_enable(pin#);

Has anyone else encountered this ? Either I was doing something wrong when calling gpio_config() with GPIO_INTR_HIGH/LOW_LEVEL, or those interrupt types are incompatible with gpio_config() (in which case there's a bug in esp-idf - and this incompatibility should be documented).

Who is online

Users browsing this forum: jcolebaker and 72 guests