I can make the RTC work with interrupts and __WFI(). I absolutely can't get events and __RFE() to work for the RTC. However, it works if I replace the __RFE() with __NOP(), so the RTC and events *seem* to be configured properly.
I've just got to be missing something stupidly obvious. Any help would be appreciated.
Thanks.
Code included which works on a nrf52832 (PCA10040 board):
#include <stdbool.h>
#include <stdint.h>
// $SDK/modules/nrfx
#include "mdk/nrf52_bitfields.h"
#include "hal/nrf_gpio.h"
#include "hal/nrf_clock.h"
#include "hal/nrf_rtc.h"
#include "delay/nrf_delay.h"
#define PIN_LED 19 // LED1
static unsigned irq_counter = 0;
#define RTC_USE_IRQ 0
#define RTC_USE_EVENT 1
#if RTC_USE_IRQ
void RTC0_IRQHandler(void) {
nrf_rtc_event_clear(NRF_RTC0,NRF_RTC_EVENT_TICK);
irq_counter++;
// every 8 IRQs, we toggle the led -> 1Hz rate
if(irq_counter %8 == 0) nrf_gpio_pin_toggle(PIN_LED);
}
int main(void) // THIS VERSION WORKS FINE
{
nrf_gpio_cfg_output(PIN_LED);
nrf_gpio_pin_set(PIN_LED); // LED is off
// Irq setup
NVIC_SetPriority(RTC0_IRQn, 15); // Lowes priority
NVIC_ClearPendingIRQ(RTC0_IRQn);
NVIC_EnableIRQ(RTC0_IRQn);
// Start LFCLK clock
nrf_clock_lf_src_set(NRF_CLOCK_LFCLK_RC); // 32KHz RC
nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTART);
// Set prescaler to the max value (12-bit)
// -> 8Hz counter frequency
nrf_rtc_prescaler_set(NRF_RTC0,(1<<12) -1);
nrf_rtc_event_enable(NRF_RTC0, NRF_RTC_INT_TICK_MASK); /* yes INT mask must be used here */
nrf_rtc_int_enable(NRF_RTC0,NRF_RTC_INT_TICK_MASK);
nrf_rtc_task_trigger(NRF_RTC0,NRF_RTC_TASK_START);
while(1) {
__WFI();
};
}
#endif
#if RTC_USE_EVENT
int main(void) // THIS VERSION FAILS
{
nrf_gpio_cfg_output(PIN_LED);
nrf_gpio_pin_set(PIN_LED); // LED is off
// Start LFCLK clock
nrf_clock_lf_src_set(NRF_CLOCK_LFCLK_RC); // 32KHz RC
nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTART);
// Set prescaler to the max value (12-bit)
// -> 8Hz counter frequency
nrf_rtc_prescaler_set(NRF_RTC0,(1<<12) -1);
nrf_rtc_event_enable(NRF_RTC0, NRF_RTC_INT_TICK_MASK); /* yes INT mask must be used here */
nrf_rtc_task_trigger(NRF_RTC0,NRF_RTC_TASK_START);
while(1) {
if (nrf_rtc_event_pending(NRF_RTC0, NRF_RTC_EVENT_TICK)) { // __WFE could be a NOP()--so you have to check
nrf_rtc_event_clear(NRF_RTC0,NRF_RTC_EVENT_TICK);
irq_counter++;
// every 8 IRQs, we toggle the led -> 1Hz rate
if(irq_counter %8 == 0) nrf_gpio_pin_toggle(PIN_LED);
}
__WFE(); // If you replace this with __NOP() things work fine--so events are triggering
};
}
#endif