Combinig a simplified version of the bsp example and the pin_change_int example I noticed that I'm running into an "[NRF_ERROR_INVALID_STATE]" error caused by nrf_drv_gpiote_init() function when the function is called after bsp_init(). When I do it vice versa It works fine. In another DevZone post I read that it should also work fine in the initial order when the pin used for the GPIOTE event is not a LED or BUTTON pin. So I'm using PIN 27 for the GPIOTE Event but still running into the error.
Does this mean that nrf_drv_gpiote_init() can never be called after bsp_init() or am I still doing something wrong?
#include <stdbool.h>
#include <stdint.h>
#include "boards.h"
#include "bsp.h"
#include "app_timer.h"
#include "nordic_common.h"
#include "nrf_error.h"
#include "nrf_drv_gpiote.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#define PIN_IN 27
/**@brief Function for handling bsp events.
*/
void bsp_evt_handler(bsp_event_t evt)
{
NRF_LOG_INFO("BSP Event");
}
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
NRF_LOG_INFO("GPIOTE Event.");
}
static void gpio_init(void)
{
ret_code_t err_code;
err_code = nrf_drv_gpiote_init();
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(true);
in_config.pull = NRF_GPIO_PIN_PULLUP;
err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler);
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_in_event_enable(PIN_IN, true);
}
/**@brief Function for initializing low frequency clock.
*/
void clock_initialization()
{
NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos);
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)
{
// Do nothing.
}
}
/**@brief Function for initializing bsp module.
*/
void bsp_configuration()
{
uint32_t err_code;
err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_evt_handler);
APP_ERROR_CHECK(err_code);
}
void log_init()
{
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
}
/**
* @brief Function for application main entry.
*/
int main(void)
{
clock_initialization();
app_timer_init();
log_init();
NRF_LOG_INFO("BSP example started.");
//gpio_init() before bsp_configuration() works
bsp_configuration();
gpio_init();
while (true)
{
NRF_LOG_FLUSH();
__SEV();
__WFE();
__WFE();
}
}