I want to make my nRF52 turn on every 5 minutes, send data to a device over BLE and go back to sleep. For some reason once I turn on BLE advertising LED1 becomes solid and i can't connect to my device even though nothing is paired with it. Here is my callback:
static void rtc_handler(nrf_drv_rtc_int_type_t int_type)
{
uint32_t err_code;
if (int_type == NRF_DRV_RTC_INT_COMPARE0)
{
collect_data();
advertising_start(BLE_ADV_MODE_FAST);
printf("Waiting for BLE connection\n");
while(m_conn_handle == BLE_CONN_HANDLE_INVALID) {
power_manage();
}
nrf_delay_ms(2000);
send_data();
nrf_delay_ms(2000);
sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
m_conn_handle = BLE_CONN_HANDLE_INVALID;
sd_ble_gap_adv_stop();
err_code = nrf_drv_rtc_cc_set(&rtc,0,RTC_CC_VALUE_SEC * RTC2_CONFIG_FREQUENCY,true); //Set RTC compare value.
APP_ERROR_CHECK(err_code);
nrf_drv_rtc_counter_clear(&rtc); //Clear the RTC counter to start count from zero
}
}
The while loop is where my code gets stuck. Could anyone help me figure out why? Also, is there a way I can make that while loop time out after 10 seconds so the nRF goes back to sleep. I have set the advertising timeout but would that return from the callback? Thanks!
EDIT:
In response to Aryan's comment, here are more details. I am using RTC2 and have enabled it in the nrf_drv_config.h here:
#define RTC2_ENABLED 1
#if (RTC2_ENABLED == 1)
#define RTC2_CONFIG_FREQUENCY 32768
#define RTC2_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW
#define RTC2_CONFIG_RELIABLE false
#define RTC2_INSTANCE_INDEX (RTC0_ENABLED+RTC1_ENABLED)
#endif
I declare and init the RTC timers here:
const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(2); /**< Declaring an instance of nrf_drv_rtc for RTC2.
static void lfclk_config(void)
{
ret_code_t err_code = nrf_drv_clock_init(); //Initialize the clock source specified in the nrf_drv_config.h file, i.e. the CLOCK_CONFIG_LF_SRC constant
APP_ERROR_CHECK(err_code);
nrf_drv_clock_lfclk_request(NULL);
}
static void rtc_config(void)
{
uint32_t err_code;
//Initialize RTC instance
err_code = nrf_drv_rtc_init(&rtc, NULL, rtc_handler); //Initialize the RTC with callback function rtc_handler. The rtc_handler must be implemented in this applicaiton. Passing NULL here for RTC configuration means that configuration will be taken from the nrf_drv_config.h file.
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_rtc_cc_set(&rtc,0,RTC_CC_VALUE_SEC * RTC2_CONFIG_FREQUENCY,true); //Set RTC compare value to trigger interrupt. Configure the interrupt frequency by adjust RTC_CC_VALUE and RTC2_CONFIG_FREQUENCY constant in the nrf_drv_config.h file
APP_ERROR_CHECK(err_code);
//Power on RTC instance
nrf_drv_rtc_enable(&rtc); //Enable RTC
}
int main(void) {
bool erase_bonds;
// Initialize BLE stack.
timers_init();
buttons_leds_init(&erase_bonds);
ble_stack_init();
device_manager_init(erase_bonds);
gap_params_init();
services_init();
advertising_init();
conn_params_init();
lfclk_config(); //Configure low frequency 32kHz clock
rtc_config(); //Configure RTC. The RTC will generate periodic interrupts. Requires 32kHz clock to operate.
while(1)
{
__WFE(); //These three commands disable the CPU. CPU will wake up again on any event or interrupt.
__SEV();
__WFE();
}
}
Is there something wrong in the configuration/initialization? Once the rtc handler reaches the loop with power_manage()
it just gets stuck and isn't advertising anything with LED1 being on and solid. Thanks!