I'm doing a more complex application than what I'm showing here, but I've reduced it to the minimum. I'm initializing the RTC subsystem, creating a timer, and starting that timer.
I have the S130 SoftDevice installed on my nRF51422 DK board (Nordic 10028).
When I run this code in the debugger, my breakpoint in the callback code at int x = 42;
is never reached. (It wasn't reached when I had something more substantive there either, so it's not a matter of the compiler optimizing it away.)
I single step through all the setup code and it seems to go well, including calling NVIC_SetPendingIRQ(SWI_IRQn);
in app_timer.c
. So what I think I'm seeing is the LFCLK interrupt being set but never actually invoked.
Finally, I've tried this code with and without the __WFI();
call in the event loop.
Long story short, I think I'm contriving the simplest possible application that uses RTC over LFCLK but it's not ever "ticking." What am I doing wrong here?
Aside: Is there any possibility I'm using the wrong SDK, or is the nRF51 SDK appropriate for all boards in the nRF51 family?
/*
main.c
*/
#include <assert.h>
#include <stdbool.h>
#include "nrf.h"
#include "app_error.h"
#include "app_timer.h"
const int APP_TIMER_PRESCALER = 0;
const int APP_TIMER_OP_QUEUE_SIZE = 4;
void timer_module_start (app_timer_timeout_handler_t callback)
{
uint32_t number_of_ticks = 5; // calculate this
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, NULL);
APP_TIMER_DEF(rtc);
app_timer_create(&rtc, APP_TIMER_MODE_REPEATED, callback);
assert(number_of_ticks >= 5);
app_timer_start(rtc, number_of_ticks, NULL);
}
void timer_callback (void *data)
{
int x = 42;
}
int main (int argc, char *argv[])
{
timer_module_start(timer_callback);
while (true)
{
__WFI();
}
}