Hello,
nRF52840-DK
SDK 15.3.0
s140
OS: Ubuntu
IDE: SES
I have run into 2 init functions for separate features that have run into this issue. In main, when initializing functions the application will force a breakpoint if my init functions are below the ble_stack_function.
For myinit1 the result of having it called below ble_stack_init was, the debugger stopped at 0xA60 and the error was NRF_FAULT_ID_APP_MEMACC. I do not have as much information about myinit2.
I suspect it is a timer related issue as both of my inits use a timer, LFCLK, and HFCLK. What are the restrictions, and issue with call order and the ble_stack_init? I would like to better understand so I do not repeat the same mistake again.
main()
{
myinit(); //This works only above ble_stack_init()
ble_stack_init();
//myinit() here will fail
}
ble_stack_init
/**@brief Function for initializing the BLE stack.
*
* @details Initializes the SoftDevice and the BLE event interrupt.
*/
static void ble_stack_init(void)
{
ret_code_t err_code;
err_code = nrf_sdh_enable_request();
APP_ERROR_CHECK(err_code);
// Configure the BLE stack using the default settings.
// Fetch the start address of the application RAM.
uint32_t ram_start = 0;
err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
APP_ERROR_CHECK(err_code);
// Enable BLE stack.
err_code = nrf_sdh_ble_enable(&ram_start);
APP_ERROR_CHECK(err_code);
// Register a handler for BLE events.
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
}
myinit()
static void lfclk_config(void)
{
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.
}
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
}
myinit1(void)
{
NRF_LOG_INFO("Initializing...");
lfclk_config();
uint32_t err_code;
err_code = app_button_init((app_button_cfg_t *)mybutton,
NUM_OF_BUTTONS,
APP_TIMER_TICKS(10));
APP_ERROR_CHECK(err_code);
err_code = app_button_enable();
APP_ERROR_CHECK(err_code);
}
void myinit2()
{
// Configure output pin
nrf_gpio_cfg_output(XCLK_PIN);
nrf_gpio_pin_set(XCLK_PIN);
// Start clock
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
{
// Wait for clock to start
}
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
}
Thank you,