Hello,
I am developing an application using nRF52840 with the NRF Connect SDK version 2.4.0 based on Matter: Template sample and I configured 10 buttons interrupts successfully as following:
/*First feedbackPin*/ #define fb5_NODE DT_ALIAS(fb5) #if !DT_NODE_HAS_STATUS(fb5_NODE, okay) #error "Unsupported board: fb5 devicetree alias is not defined" #endif static const struct gpio_dt_spec feedbackPin_1 = GPIO_DT_SPEC_GET_OR(fb5_NODE, gpios, {0}); /*Second feedbackPin*/ #define fb6_NODE DT_ALIAS(fb6) #if !DT_NODE_HAS_STATUS(fb6_NODE, okay) #error "Unsupported board: fb6 devicetree alias is not defined" #endif static const struct gpio_dt_spec feedbackPin_2 = GPIO_DT_SPEC_GET_OR(fb6_NODE, gpios, {0}); /*Third feedbackPin*/ /*Forth feedbackPin*/ /*Fifth feedbackPin*/ /*Sixth feedbackPin*/ /*Ninth feedbackPin*/ /*Tenth feedbackPin*/ #define fb14_NODE_ DT_ALIAS(fb14) #if !DT_NODE_HAS_STATUS(fb14_NODE_, okay) #error "Unsupported board: fb14 devicetree alias is not defined" #endif static const struct gpio_dt_spec feedbackPin_10 = GPIO_DT_SPEC_GET_OR(fb14_NODE_, gpios, {0}); static struct gpio_callback feedback_cb_data_1st; static struct gpio_callback feedback_cb_data_2nd; static struct gpio_callback feedback_cb_data_3rd; static struct gpio_callback feedback_cb_data_4th; static struct gpio_callback feedback_cb_data_5th; static struct gpio_callback feedback_cb_data_6th; static struct gpio_callback feedback_cb_data_7th; static struct gpio_callback feedback_cb_data_8th; static struct gpio_callback feedback_cb_data_9th; CHIP_ERROR AppTask::Init() { /*Some Initialization Code*/ int ret_; /*First feedbackPin*/ if (!gpio_is_ready_dt(&feedbackPin_1)) { printk("Error: feedbackPin_1 device %s is not ready\n", feedbackPin_1.port->name); ret_ = 1; return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_configure_dt(&feedbackPin_1, GPIO_INPUT); if (ret_ != 0) { printk("Error %d: failed to configure %s pin %d\n", ret_, feedbackPin_1.port->name, feedbackPin_1.pin); return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_1, GPIO_INT_EDGE_RISING); if (ret_ != 0) { printk("Error %d: failed to configure interrupt on %s pin %d\n", ret_, feedbackPin_1.port->name, feedbackPin_1.pin); return chip::System::MapErrorZephyr(ret_); } gpio_init_callback(&feedback_cb_data_1st, feedback_EventHandler, BIT(feedbackPin_1.pin)); gpio_add_callback(feedbackPin_1.port, &feedback_cb_data_1st); printk("Set up feedbackPin_1 at %s pin %d\n", feedbackPin_1.port->name, feedbackPin_1.pin); /*Second feedbackPin*/ if (!gpio_is_ready_dt(&feedbackPin_2)) { printk("Error: feedbackPin_2 device %s is not ready\n", feedbackPin_2.port->name); ret_ = 1; return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_configure_dt(&feedbackPin_2, GPIO_INPUT); if (ret_ != 0) { printk("Error %d: failed to configure %s pin %d\n", ret_, feedbackPin_2.port->name, feedbackPin_2.pin); return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_2, GPIO_INT_EDGE_RISING); if (ret_ != 0) { printk("Error %d: failed to configure interrupt on %s pin %d\n", ret_, feedbackPin_2.port->name, feedbackPin_2.pin); return chip::System::MapErrorZephyr(ret_); } gpio_init_callback(&feedback_cb_data_2nd, feedback_EventHandler, BIT(feedbackPin_2.pin)); gpio_add_callback(feedbackPin_2.port, &feedback_cb_data_2nd); printk("Set up feedbackPin_2 at %s pin %d\n", feedbackPin_2.port->name, feedbackPin_2.pin); /*Third feedbackPin*/ if (!gpio_is_ready_dt(&feedbackPin_3)) { printk("Error: feedbackPin_3 device %s is not ready\n", feedbackPin_3.port->name); ret_ = 1; return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_configure_dt(&feedbackPin_3, GPIO_INPUT); if (ret_ != 0) { printk("Error %d: failed to configure %s pin %d\n", ret_, feedbackPin_3.port->name, feedbackPin_3.pin); return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_3, GPIO_INT_EDGE_RISING); if (ret_ != 0) { printk("Error %d: failed to configure interrupt on %s pin %d\n", ret_, feedbackPin_3.port->name, feedbackPin_3.pin); return chip::System::MapErrorZephyr(ret_); } gpio_init_callback(&feedback_cb_data_3rd, feedback_EventHandler, BIT(feedbackPin_3.pin)); gpio_add_callback(feedbackPin_3.port, &feedback_cb_data_3rd); printk("Set up feedbackPin_3 at %s pin %d\n", feedbackPin_3.port->name, feedbackPin_3.pin); /*Forth feedbackPin*/ if (!gpio_is_ready_dt(&feedbackPin_4)) { printk("Error: feedbackPin_4 device %s is not ready\n", feedbackPin_4.port->name); ret_ = 1; return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_configure_dt(&feedbackPin_4, GPIO_INPUT); if (ret_ != 0) { printk("Error %d: failed to configure %s pin %d\n", ret_, feedbackPin_4.port->name, feedbackPin_4.pin); return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_4, GPIO_INT_EDGE_RISING); if (ret_ != 0) { printk("Error %d: failed to configure interrupt on %s pin %d\n", ret_, feedbackPin_4.port->name, feedbackPin_4.pin); return chip::System::MapErrorZephyr(ret_); } gpio_init_callback(&feedback_cb_data_4th, feedback_EventHandler, BIT(feedbackPin_4.pin)); gpio_add_callback(feedbackPin_4.port, &feedback_cb_data_4th); printk("Set up feedbackPin_4 at %s pin %d\n", feedbackPin_4.port->name, feedbackPin_4.pin); /*Fifth feedbackPin*/ /*Sixth feedbackPin*/ /*Seventh feedbackPin*/ /*Eighth feedbackPin*/ /*Ninth feedbackPin*/ if (!gpio_is_ready_dt(&feedbackPin_9)) { printk("Error: feedbackPin_9 device %s is not ready\n", feedbackPin_9.port->name); ret_ = 1; return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_configure_dt(&feedbackPin_9, GPIO_INPUT); if (ret_ != 0) { printk("Error %d: failed to configure %s pin %d\n", ret_, feedbackPin_9.port->name, feedbackPin_9.pin); return chip::System::MapErrorZephyr(ret_); } ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_9, GPIO_INT_EDGE_RISING); if (ret_ != 0) { printk("Error %d: failed to configure interrupt on %s pin %d\n", ret_, feedbackPin_9.port->name, feedbackPin_9.pin); return chip::System::MapErrorZephyr(ret_); } gpio_init_callback(&feedback_cb_data_9th, feedback_EventHandler, BIT(feedbackPin_9.pin)); gpio_add_callback(feedbackPin_9.port, &feedback_cb_data_9th); printk("Set up feedbackPin_9 at %s pin %d\n", feedbackPin_9.port->name, feedbackPin_9.pin); /*Tenth feedbackPin*/ return CHIP_NO_ERROR; } void AppTask::feedback_EventHandler(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { LOG_INF("Feedback_EventHandler: ");//%s \n", dev.port->name); }
The build and flash process succeeded.
Issue Description: In my prj_no_dfu.conf file, I enabled debugging using CONFIG_DEBUG option and the application built successfully. However, when I flash the code to the board I got an -12 error from
gpio_pin_interrupt_configure_dt(&feedbackPin_9, GPIO_INT_EDGE_RISING);
The error message:
Error -12: failed to configure interrupt on gpio@50000000 pin 28 E: Exited with code 200000c
Even If I change the pin or increase the main stack size or the system work queue stack size the problem still exist.
CONFIG_MAIN_STACK_SIZE=16384 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192
Important notes:
- The application ran successfully with 10 interrupts but without enabling the debugging config.
- All the interrupts configured with the same callback function "feedback_EventHandler()".
Best reagrds,
Basem