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

nrf51 RTC interrupt not occurring

Hi! I'm configuring RTC on nrf51822. I'm setting up the LFCLK and RTC module by configuring their registers. I have set up a simple IRQ handler, but it seems that it never happens to execute. What can I be missing?

This is my source code:

#define LFCLK_FREQUENCY           (32768UL)                               /**< LFCLK HZ. */
#define RTC_FREQUENCY             (8UL)                                   /**< RTC_FREQUENCY HZ. */ 
#define COMPARE_COUNTERTIME       (1UL)                                   /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
#define COUNTER_PRESCALER         ((LFCLK_FREQUENCY/RTC_FREQUENCY) - 1)   /* f = LFCLK/(prescaler + 1) */

#define LED_1 18
#define LED_2 19

void lfclk_config(void)
{
    NRF_CLOCK->LFCLKSRC             = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos);
    NRF_CLOCK->TASKS_LFCLKSTART     = 1;
    while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)
    {
        //Do nothing.
    }
}

void rtc_config(void)
{
    NVIC_EnableIRQ(RTC0_IRQn);                                      // RTC
    NRF_RTC0->PRESCALER     = COUNTER_PRESCALER;                    // prescaler to a TICK of RTC_FREQUENCY.
    NRF_RTC0->CC[0]         = COMPARE_COUNTERTIME * RTC_FREQUENCY;;  // Compare0 after approx COMPARE_COUNTERTIME seconds.

    // Enable COMPARE0 event and COMPARE0 interrupt:
    NRF_RTC0->EVTENSET      = RTC_EVTENSET_COMPARE0_Msk;
    NRF_RTC0->INTENSET      = RTC_INTENSET_COMPARE0_Msk;
}

void RTC0_IRQHandler()
{
    if ((NRF_RTC0->EVENTS_COMPARE[0] != 0) && ((NRF_RTC0->INTENSET & RTC_INTENSET_COMPARE0_Msk) != 0))
    {
        NRF_RTC0->EVENTS_COMPARE[0] = 0;
        digitalWrite(LED_1, HIGH);
        NRF_RTC0->TASKS_CLEAR = 1;
    }
}

void setup() {
  
  pinMode(LED_1, OUTPUT);
  lfclk_config();
  rtc_config();  

}

void loop() {
  __WFE();        
  __SEV();
  __WFE();
}

Parents Reply Children
Related