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