FreeRTOS (NXP LPC1768) with RTC to throw an interrupt

lagavulin18 wrote on Sunday, June 01, 2014:

Hi,

must something special be taken into account when using a RTC with FreeRTOS?

The code works fine without RTC. Once the RTC code is integrated to throw an alarm/interrupt, the system runs in a undefined state.

int main( void )
{
    // includes the RTC setup 
    prvSetupHardware();

  
    NVIC_DisableIRQ(RTC_IRQn);
    
    // C++ based xTaskCreate function
    pearlrt::t_TASK3.activate()

    NVIC_EnableIRQ(RTC_IRQn);
  

    // set RTC second to 0
    RTC_SetTime(LPC_RTC, RTC_TIMETYPE_SECOND, 0);
    
    // throw alarm/interrupt on second 10
    RTC_SetAlarmTime (LPC_RTC, RTC_TIMETYPE_SECOND, 10);

    /* Start the scheduler. */
    vTaskStartScheduler();
 
    /* IDLE task is used */

 }


// --------- prvSetupHardware() ------------------

void prvSetupHardware( void )
{
    [...]
    // Enable RTC
    init_RTC();
}

// --------- init_RTC()--------------------------

void init_RTC(void) 
{

   RTC_Init(LPC_RTC);
   
   NVIC_DisableIRQ(RTC_IRQn);
   NVIC_SetPriority(RTC_IRQn, ((0x01<<3)|0x01));
   
   RTC_Cmd(LPC_RTC, ENABLE);
   RTC_AlarmIntConfig (LPC_RTC, RTC_TIMETYPE_SECOND, ENABLE);
   NVIC_EnableIRQ (RTC_IRQn);
 }

 // --------- RTC_IRQHandler() ---------------------

 void RTC_IRQHandler() 
 {
    if (RTC_GetIntPending(LPC_RTC, RTC_INT_ALARM))
    {
        debugMessage("Alarm");
        // Clear pending interrupt
        RTC_ClearIntPending(LPC_RTC, RTC_INT_ALARM);
    }

 }

jdurand wrote on Sunday, June 01, 2014:

I don’t see you setting the interrupt priority BEFORE enabling it.

lagavulin18 wrote on Monday, June 02, 2014:

I was actually the opinion that the RTC must be reinitialized whenever the program (re-)starts but if I remove init_RTC() from prvSetupHardware(), everything works as expected. Reboot, reset the device, everything seems ok … weird!