I'd like to set up a few gpio inputs pins to trigger on both rising and falling edges.
Once the ISR is called, I'd like to know what exactly triggered the interrupt. The gpio interrupt example shows how to the GPIO pin that triggered, but reading the status of said gpio at the time of ISR execution does not guarantee that the pin-state has not changed since the moment the trigger occurred.
It feels like this is a simple thing, can someone point me in the right direction?
thx
-a
Is it possible to receive GPIO edge type in an interrupt handler (ISR)?
Re: Is it possible to receive GPIO edge type in an interrupt handler (ISR)?
Following the gpio interrupt example, and just to be clear this one here.
https://github.com/espressif/esp-idf/bl ... ple_main.c
In the following task below from that example, you can add this to it to re-read the pin.
https://github.com/espressif/esp-idf/bl ... ple_main.c
In the following task below from that example, you can add this to it to re-read the pin.
Code: Select all
static void gpio_task_example(void* arg)
{
uint32_t io_num;
for(;;) {
if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num));
printf("Re-read the pin: %d\n", gpio_get_level(GPIO_INPUT_IO_0 )); // to read IO4
}
}
}
Re: Is it possible to receive GPIO edge type in an interrupt handler (ISR)?
@username thank you for your suggestion.
It's possible that the pin value will have returned to it's original value between the trigger time and when the handler runs (interrupt latency). This means you can see gpio level 0 for rising edges and gpio level 1 for falling edge triggers.
It's possible that the pin value will have returned to it's original value between the trigger time and when the handler runs (interrupt latency). This means you can see gpio level 0 for rising edges and gpio level 1 for falling edge triggers.
Re: Is it possible to receive GPIO edge type in an interrupt handler (ISR)?
Ok but even if some register held the edge type it would be possible to have another interrupt and the edge type change before you read the register. So then there would have to be some kind of hardware queue for edge types. There will be constraints on the signal based on the hw/sw capabilities. If you use two pins you can have one as rising edge and one as falling. Even then you will be limited by interrupt latency, what if there are 3 edges before your isr runs?RMandR wrote: ↑Sun Jun 09, 2019 3:30 pm@username thank you for your suggestion.
It's possible that the pin value will have returned to it's original value between the trigger time and when the handler runs (interrupt latency). This means you can see gpio level 0 for rising edges and gpio level 1 for falling edge triggers.
Re: Is it possible to receive GPIO edge type in an interrupt handler (ISR)?
That's exactly it. Most MCU architectures pass the edge type to the interrupt handler as an argument. For exampleSo then there would have to be some kind of hardware queue for edge types
Code: Select all
//NOT ESP32 CODE: static void IRAM_ATTR gpio_isr_handler(int pin, int egeType)
Re: Is it possible to receive GPIO edge type in an interrupt handler (ISR)?
https://stackoverflow.com/questions/487 ... i-callback
But for mcu sdks that do support it is it just the upstream code that calls the handler that checks the level or is it actually hardware? Because in the first case it still comes down to latency. On esp32 you have options such as a custom high level interrupt or using rmt to capture the whole pulse train at 6ns precision.
But for mcu sdks that do support it is it just the upstream code that calls the handler that checks the level or is it actually hardware? Because in the first case it still comes down to latency. On esp32 you have options such as a custom high level interrupt or using rmt to capture the whole pulse train at 6ns precision.
Who is online
Users browsing this forum: Baidu [Spider], Majestic-12 [Bot] and 108 guests