Hi,
I have used course's example for GPIO interrupt for toggling LED and used to update BLE adv parameters without using DK buttons library. But, as soon as, I update BLE adv parameters the MCU resets. I know the DK library is quite comprehensive but want to know what is the issue in GPIO interrupt which leads to this reset.
This is my main code.
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/pwm.h>
#include "remote.h"
#define SLEEP_TIME_MS 1000
#define LED0_NODE DT_ALIAS(led0)
#define SW0_NODE DT_ALIAS(sw0)
bool int_flag;
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
static const struct gpio_dt_spec sw = GPIO_DT_SPEC_GET(SW0_NODE, gpios);
static const struct device *gpio_ct_dev = DEVICE_DT_GET(DT_NODELABEL(gpio0));
static const struct pwm_dt_spec pwm_led0 = PWM_DT_SPEC_GET(DT_ALIAS(pwmled0));
static struct gpio_callback button_cb_data;
void button_pressed (const struct device *dev, struct gpio_callback *cb, uint32_t pins) {
//gpio_pin_toggle_dt(&led);
gpio_pin_toggle(gpio_ct_dev, 13);
bt_update_ad();
}
int main(void)
{
int ret, err;
bool val;
if (!device_is_ready(led.port))
{
return;
}
if (!device_is_ready(pwm_led0.dev))
{
return 0;
}
ret = gpio_pin_configure(gpio_ct_dev, 13, GPIO_OUTPUT);
ret = gpio_pin_configure(gpio_ct_dev, 11, (GPIO_INPUT | GPIO_PULL_UP | GPIO_ACTIVE_LOW));
gpio_pin_configure_dt(&led,GPIO_OUTPUT_ACTIVE);
gpio_pin_configure_dt(&sw, GPIO_INPUT);
gpio_pin_interrupt_configure(gpio_ct_dev, 11, GPIO_INT_EDGE_TO_ACTIVE);
gpio_init_callback(&button_cb_data, &button_pressed, BIT(11));
gpio_add_callback(gpio_ct_dev, &button_cb_data);
err = bluetooth_init();
if (err) {
return -1;
}
for (;;) {
}
}
This is my remote.c:
#include "remote.h"
#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)
#define COMPANY_ID_CODE 0x0059 // Nordic Semiconductor company
typedef struct adv_mfg_data {
uint16_t company_code; /* Company Identifier Code. */
uint16_t number_press; /* Number of times Button 1 is pressed*/
} adv_mfg_data_type;
static adv_mfg_data_type adv_mfg_data = {COMPANY_ID_CODE,0x00};
static unsigned char url_data[] ={0x17,'/','/','a','c','a','d','e','m','y','.',
'n','o','r','d','i','c','s','e','m','i','.',
'c','o','m'};
static struct bt_le_adv_param *adv_param =
BT_LE_ADV_PARAM(BT_LE_ADV_OPT_NONE,
800,
801,
NULL);
static const struct bt_data ad[] = {
/* STEP 4.1.2 - Set the advertising flags */
BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR),
/* STEP 4.1.3 - Set the advertising packet data */
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
BT_DATA(BT_DATA_MANUFACTURER_DATA,(unsigned char *)&adv_mfg_data, sizeof(adv_mfg_data)),
};
static const struct bt_data sd[] = {
/* 4.2.3 Include the URL data in the scan response packet*/
BT_DATA(BT_DATA_URI, url_data,sizeof(url_data)),
};
int bluetooth_init(void)
{
int err;
err = err = bt_enable(NULL);
if (err) {
return -1;
}
err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
if (err) {
return -1;
}
return err;
}
void bt_update_ad(void)
{
adv_mfg_data.number_press += 1;
bt_le_adv_update_data(ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
}
As soon as bt_update_ad() is called in button_pressed which GPIO callback, MCU resets.
Please guide what should be implemented in this raw GPIO interrupt callback to avoid MCU reset to update adv parameters.
Regards