GPIO isr is not working
Posted: Fri Jan 26, 2024 9:15 am
Dear ESP-Forum Members,
I posted this problem already in the "IoT" chapter of this forum. But I think - I hope, here in the "Hardware Part" I get more resonance.
For my project I need a GPIO interrupt (pressed button). I selected the GPIO25 pin connect it through the switch to the ground. The negative edge should start the isr. Message from the GPIO configurator:
I adapted the ESP-example-code for my needs:
I posted this problem already in the "IoT" chapter of this forum. But I think - I hope, here in the "Hardware Part" I get more resonance.
For my project I need a GPIO interrupt (pressed button). I selected the GPIO25 pin connect it through 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
[Codebox=c file=Untitled.c] #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"); } [/Codebox]
But when I press the switch to trigger the isr, the ESP32 is restarting and the monitor get this printout:I added some ESP_LOGs in the isr-handler to find the problem. These outputs are not visible, so the problem accurs before or when the isr-handler is starting.
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 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