GPIO interrupt not working

HEckardt
Posts: 31
Joined: Wed Aug 16, 2023 3:13 pm

GPIO interrupt not working

Postby HEckardt » Thu Jan 25, 2024 11:45 am

Dear ESP-Forum Members,

for my project I need a GPIO interrupt (pressed botton). I selected the GPIO25 pin connect it though the switch to the ground. The negative edge should start the isr. Message from the GPIO configurator:
I (2283) gpio: GPIO[25]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:2

I adapted the ESP-example-code for my needs:

Code: Select all

#define GPIO_OK_Button 25  
#define ESP_INTR_FLAG_DEFAULT 0

static const char *TAG = "HE_Ctrl";

static bool ok_pressed;

static QueueHandle_t gpio_evt_queue = NULL;

static void IRAM_ATTR gpio_isr_handler(void* arg)
{
	ESP_LOGI(TAG, "gpio_isr_before queuesend");
	ESP_LOGI(TAG, "isr_arg: %lX", (uint32_t) arg);
    uint32_t gpio_num = (uint32_t) arg;
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
	ESP_LOGI(TAG, "gpio_isr_after queuesend");

}

static void OK_task(void* arg)
{
    uint32_t io_num;
    for(;;) {
        if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
			vTaskDelay(100 / portTICK_PERIOD_MS);
			printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num));
			ok_pressed = true;
        }
    }
}

static void init_ok_button(void)
{
	ok_pressed = false;
    //zero-initialize the config structure.
    gpio_config_t io_conf = {};
    io_conf.intr_type = GPIO_INTR_NEGEDGE;
    io_conf.pin_bit_mask = 1ULL<<GPIO_OK_Button;
    io_conf.mode = GPIO_MODE_INPUT;
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);


	ESP_LOGI(TAG, "BitMask: %LX", io_conf.pin_bit_mask);

	
    // create a queue to handle gpio event from isr
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
    // start gpio task
    xTaskCreate(OK_task, "gpio_task_example", 2048, NULL, 10, NULL);

    //install gpio isr service
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
    //hook isr handler for specific gpio pin
    gpio_isr_handler_add(GPIO_OK_Button, gpio_isr_handler, (void*) GPIO_OK_Button);


    printf("Minimum free heap size: %"PRIu32" bytes\n", esp_get_minimum_free_heap_size());
	

	ESP_LOGI(TAG, "gpio_initialized");

}

But when I press the switch to trigger the isr, the ESP32 is restarting and the monitor get this printout:

abort() was called at PC 0x40083043 on core 0


Backtrace: 0x40081ac6:0x3ffb1770 0x40089d6d:0x3ffb1790 0x40091686:0x3ffb17b0 0x40083043:0x3ffb1820 0x40083181:0x3ffb1850 0x400831fa:0x3ffb1870 0x4014a23a:0x3ffb18a0 0x4014d3a9:0x3ffb1bc0 0x401597d1:0x3ffb1bf0 0x4009004d:0x3ffb1c20 0x4008379d:0x3ffb1c70 0x400838b2:0x3ffb1ca0 0x40083942:0x3ffb1cd0 0x40082e35:0x3ffb1d00 0x40088b3f:0x3ffbcd00 0x400d370b:0x3ffbcd20 0x4008af41:0x3ffbcd40 0x4008c74d:0x3ffbcd60




ELF file SHA256: 43476a0f78228a12

Rebooting...
ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

I added some ESP_LOGs in the isr. These outputs are not visible, so the problem accurs befor the isr is starting.

I have no idea what could be wrong. I assume it could be a storage problem.

I attached the complete monitor printout. Please help me to interprete the error message to find the root cause for the problem.

Thank you for your support.

Greetings
Henry
Attachments
teraterm.log
complete monitor print out
(12.36 KiB) Downloaded 648 times

mikemoy
Posts: 687
Joined: Fri Jan 12, 2018 9:10 pm

Re: GPIO interrupt not working

Postby mikemoy » Thu Jan 25, 2024 12:45 pm

remove the ESP_LOGI's from the ISR handler and see what happens.

HEckardt
Posts: 31
Joined: Wed Aug 16, 2023 3:13 pm

Re: GPIO interrupt not working

Postby HEckardt » Thu Jan 25, 2024 5:21 pm

Hi mikemoy,

it is the same. I inserted the LOG output, when I recognized, that the isr failed.

greetings
Henry

h2ggabrielvicente
Posts: 3
Joined: Sun Jul 28, 2024 9:47 pm

Re: GPIO interrupt not working WTD Reset

Postby h2ggabrielvicente » Sun Jul 28, 2024 9:53 pm

I have a problem when trying to configure an interrupt on GPIO 0, and I always get a wtd reset, as follows: Minimum free heap size: 298252 bytes
cnt: 0
cnt: 1
Guru Meditation Error: Core 0 panic'ed (Interrupt wdt timeout on CPU0).

Core 0 register dump:
PC : 0x40082943 PS : 0x00050034 A0 : 0x40084666 A1 : 0x3ffb0d60, I figured I was doing something wrong in my application and I tested the example already included in the IDF and the problem persists, is anyone else experiencing this problem? I've already wasted a few hours trying to solve it but without success.
ESP-IDF: v5.1.2-dirty

Code: Untitled.c Select all


/* GPIO Example

This example code is in the Public Domain (or CC0 licensed, at your option.)

Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"

/**
* Brief:
* This test code shows how to configure gpio and how to use gpio interrupt.
*
* GPIO status:
* GPIO18: output (ESP32C2/ESP32H2 uses GPIO8 as the second output pin)
* GPIO19: output (ESP32C2/ESP32H2 uses GPIO9 as the second output pin)
* GPIO4: input, pulled up, interrupt from rising edge and falling edge
* GPIO5: input, pulled up, interrupt from rising edge.
*
* Note. These are the default GPIO pins to be used in the example. You can
* change IO pins in menuconfig.
*
* Test:
* Connect GPIO18(8) with GPIO4
* Connect GPIO19(9) with GPIO5
* Generate pulses on GPIO18(8)/19(9), that triggers interrupt on GPIO4/5
*
*/

#define GPIO_OUTPUT_IO_0 CONFIG_GPIO_OUTPUT_0
#define GPIO_OUTPUT_IO_1 CONFIG_GPIO_OUTPUT_1
#define GPIO_OUTPUT_PIN_SEL ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1))
/*
* Let's say, GPIO_OUTPUT_IO_0=18, GPIO_OUTPUT_IO_1=19
* In binary representation,
* 1ULL<<GPIO_OUTPUT_IO_0 is equal to 0000000000000000000001000000000000000000 and
* 1ULL<<GPIO_OUTPUT_IO_1 is equal to 0000000000000000000010000000000000000000
* GPIO_OUTPUT_PIN_SEL 0000000000000000000011000000000000000000
* */
#define GPIO_INPUT_IO_0 CONFIG_GPIO_INPUT_0
#define GPIO_INPUT_IO_1 CONFIG_GPIO_INPUT_1
#define GPIO_INPUT_PIN_SEL ((1ULL<<GPIO_INPUT_IO_0) | (1ULL<<GPIO_INPUT_IO_1))
/*
* Let's say, GPIO_INPUT_IO_0=4, GPIO_INPUT_IO_1=5
* In binary representation,
* 1ULL<<GPIO_INPUT_IO_0 is equal to 0000000000000000000000000000000000010000 and
* 1ULL<<GPIO_INPUT_IO_1 is equal to 0000000000000000000000000000000000100000
* GPIO_INPUT_PIN_SEL 0000000000000000000000000000000000110000
* */
#define ESP_INTR_FLAG_DEFAULT 0

static QueueHandle_t gpio_evt_queue = NULL;

static void IRAM_ATTR gpio_isr_handler(void* arg)
{
uint32_t gpio_num = (uint32_t) arg;
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}

static void gpio_task_example(void* arg)
{
uint32_t io_num;
for(;;) {
if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num));
}
}
}

void app_main(void)
{
//zero-initialize the config structure.
gpio_config_t io_conf = {};
//disable interrupt
io_conf.intr_type = GPIO_INTR_DISABLE;
//set as output mode
io_conf.mode = GPIO_MODE_OUTPUT;
//bit mask of the pins that you want to set,e.g.GPIO18/19
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
//disable pull-down mode
io_conf.pull_down_en = 0;
//disable pull-up mode
io_conf.pull_up_en = 0;
//configure GPIO with the given settings
gpio_config(&io_conf);

//interrupt of rising edge
io_conf.intr_type = GPIO_INTR_POSEDGE;
//bit mask of the pins, use GPIO4/5 here
io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
//set as input mode
io_conf.mode = GPIO_MODE_INPUT;
//enable pull-up mode
io_conf.pull_up_en = 1;
gpio_config(&io_conf);

//change gpio interrupt type for one pin
gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);

//create a queue to handle gpio event from isr
gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
//start gpio task
xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);

//install gpio isr service
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
//hook isr handler for specific gpio pin
gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
//hook isr handler for specific gpio pin
gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);

//remove isr handler for gpio number.
gpio_isr_handler_remove(GPIO_INPUT_IO_0);
//hook isr handler for specific gpio pin again
gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);

printf("Minimum free heap size: %"PRIu32" bytes\n", esp_get_minimum_free_heap_size());

int cnt = 0;
while(1) {
printf("cnt: %d\n", cnt++);
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2);
gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2);
}
}

Sprite
Espressif staff
Espressif staff
Posts: 10596
Joined: Thu Nov 26, 2015 4:08 am

Re: GPIO interrupt not working

Postby Sprite » Mon Jul 29, 2024 2:13 am

Install the ISR service *before* you configure the GPIOs.

h2ggabrielvicente
Posts: 3
Joined: Sun Jul 28, 2024 9:47 pm

Re: GPIO interrupt not working

Postby h2ggabrielvicente » Tue Aug 06, 2024 10:25 am

Install the ISR service *before* you configure the GPIOs.
It still doesn't work, I will return to the previous version of esp-idf, at first even the example code doesn't work causing wtd reset.

h2ggabrielvicente
Posts: 3
Joined: Sun Jul 28, 2024 9:47 pm

Re: GPIO interrupt not working

Postby h2ggabrielvicente » Thu Aug 08, 2024 11:18 pm

Install the ISR service *before* you configure the GPIOs.
It still doesn't work, I will return to the previous version of esp-idf, at first even the example code doesn't work causing wtd reset.
Update: I installed a new version of esp-idf and the problem was solved, I believe my installation was faulty.

Who is online

Users browsing this forum: No registered users and 1 guest