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
  • Could you try using the SAADC driver files found in SDK 13? There are some issues related to clearing of events in SDK 12 that can cause the device to wakeup. You may have to do some small changes in the files to get it working in SDK 12.1:

    • Change #if NRF_MODULE_ENABLED(SAADC) to #if SAADC_ENABLED
    • Change #include "sdk_common.h" to #include "sdk_config.h" and #include "nordic_common.h"
    • Comment out all NRF_LOG related calls.
Reply
  • Could you try using the SAADC driver files found in SDK 13? There are some issues related to clearing of events in SDK 12 that can cause the device to wakeup. You may have to do some small changes in the files to get it working in SDK 12.1:

    • Change #if NRF_MODULE_ENABLED(SAADC) to #if SAADC_ENABLED
    • Change #include "sdk_common.h" to #include "sdk_config.h" and #include "nordic_common.h"
    • Comment out all NRF_LOG related calls.
Children
No Data
Related