This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to check for pending interrupts before calling sd_app_evt_wait?

Hi. I am having trouble getting the sd_app_evt_wait() call to work correctly in my code. My main program works like this:

<inits>
for(;;)
{
   <read saadc>
   <sd_app_evt_wait> // app_timer should make this return in 10 seconds
}

I have an app_timer that causes sd_app_evt_wait to return by firing every 10 seconds. The problem is, after sampling the ADCs, the call to sd_app_evt_wait returns immediately, running the loop forever. It doesn't sleep and wait for the timer. If I put a second call to sd_app_evt_wait directly after the first, the first call returns, and the second call sleeps until the timer wakes it (desired operation, but with two calls). From what I have learned of the sd_app_evt_wait function, if there are pending interrupts, it will immediately return. However, if I read the NVIC->ISPR at any time, it is 0. No interrupts pending, but sd_app_evt_wait returns once, then sleeps properly, on the Second call. I read about the FPU interrupts, so I added the following:

 uint32_t FPU_EXCEPTION_MASK = 0x0000009F;
pending = __get_FPSCR();
if (pending)
{
	NRF_LOG_DEBUG("FPU Exceptions: %d\r\n", pending);
	/* Clear exceptions and PendingIRQ from the FPU unit */
	__set_FPSCR(__get_FPSCR() & ~(FPU_EXCEPTION_MASK));
	(void) __get_FPSCR();
	NVIC_ClearPendingIRQ(FPU_IRQn);
}

but they don't help. The variable "pending" is always 0, and the ISPR is always 0. Adding

NVIC_ClearPendingIRQ(SAADC_IRQn);
NVIC_ClearPendingIRQ(FPU_IRQn);

before the first call to sd_app_evt_wait doesn't help either. What am I missing?

Parents
  • I added a GPIO toggle to my main loop, and found that the chip is going to sleep for a bit, waking up, skipping the code execution (because the timer hasn't expired) and going back to sleep. The SAADC measurements get sent out BLE, so possibly once the ADC updates the values, that triggers some BLE interrupt that runs and wakes the chip up. Then it goes back to sleep again. However, the only BLE related user IRQ I can see is RADIO_IRQn, for which I can't find a handler besides the weak declaration in gcc_startup_nrf52.S. Also, this wake from sleep happens without any devices connected to BLE, so I don't see how the wake would be caused by a subscribe service...

Reply
  • I added a GPIO toggle to my main loop, and found that the chip is going to sleep for a bit, waking up, skipping the code execution (because the timer hasn't expired) and going back to sleep. The SAADC measurements get sent out BLE, so possibly once the ADC updates the values, that triggers some BLE interrupt that runs and wakes the chip up. Then it goes back to sleep again. However, the only BLE related user IRQ I can see is RADIO_IRQn, for which I can't find a handler besides the weak declaration in gcc_startup_nrf52.S. Also, this wake from sleep happens without any devices connected to BLE, so I don't see how the wake would be caused by a subscribe service...

Children
No Data
Related