/** Initialize the low power ticker * */ void lp_ticker_init(void) { lptmr_config_t lptmrConfig; if (lp_ticker_inited) { return; } lp_ticker_inited = true; /* Setup low resolution clock - RTC */ if (!rtc_isenabled()) { rtc_init(); RTC_DisableInterrupts(RTC, kRTC_AlarmInterruptEnable | kRTC_SecondsInterruptEnable); RTC_StartTimer(RTC); } RTC->TAR = 0; /* Write clears the IRQ flag */ NVIC_ClearPendingIRQ(RTC_IRQn); NVIC_SetVector(RTC_IRQn, (uint32_t)rtc_isr); NVIC_EnableIRQ(RTC_IRQn); /* Setup high resolution clock - LPTMR */ LPTMR_GetDefaultConfig(&lptmrConfig); /* Use 32kHz drive */ CLOCK_SetXtal32Freq(OSC32K_CLK_HZ); lptmrConfig.prescalerClockSource = kLPTMR_PrescalerClock_2; LPTMR_Init(LPTMR0, &lptmrConfig); LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable); NVIC_ClearPendingIRQ(LPTMR0_IRQn); NVIC_SetVector(LPTMR0_IRQn, (uint32_t)lptmr_isr); EnableIRQ(LPTMR0_IRQn); }
void rtc_write(time_t t) { if (t == 0) { t = 1; } RTC_StopTimer(RTC); RTC->TSR = t; RTC_StartTimer(RTC); }
void rtc_init(void) { rtc_config_t rtcConfig; RTC_GetDefaultConfig(&rtcConfig); RTC_Init(RTC, &rtcConfig); /* Setup the RTC 32KHz oscillator */ rtc_setup_oscillator(RTC); RTC_StartTimer(RTC); }
static void rtc_isr(void) { uint32_t sr = RTC->SR; if (sr & RTC_SR_TOF_MASK) { // Reset RTC to 0 so it keeps counting RTC_StopTimer(RTC); RTC->TSR = 0; RTC_StartTimer(RTC); } else if (sr & RTC_SR_TAF_MASK) { RTC_DisableInterrupts(RTC, kRTC_AlarmInterruptEnable); RTC->TAR = 0; /* Write clears the IRQ flag */ /* Wait subsecond remainder if any */ if (lptmr_schedule) { LPTMR_SetTimerPeriod(LPTMR0, lptmr_schedule); LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable); LPTMR_StartTimer(LPTMR0); } else { lp_ticker_irq_handler(); } } else if (sr & RTC_SR_TIF_MASK) { RTC_DisableInterrupts(RTC, kRTC_TimeOverflowInterruptEnable); } }
void rtc_write(time_t t) { RTC_StopTimer(RTC); RTC->TSR = t; RTC_StartTimer(RTC); }