/***************************************************************************//** * @brief * Get clock frequency of the BURTC. * * @return * The current frequency in Hz. ******************************************************************************/ uint32_t BURTC_ClockFreqGet(void) { uint32_t clkSel; uint32_t clkDiv; uint32_t frequency; clkSel = BURTC->CTRL & _BURTC_CTRL_CLKSEL_MASK; clkDiv = (BURTC->CTRL & _BURTC_CTRL_PRESC_MASK) >> _BURTC_CTRL_PRESC_SHIFT; switch (clkSel) { /** Ultra low frequency (1 kHz) clock */ case BURTC_CTRL_CLKSEL_ULFRCO: if (_BURTC_CTRL_PRESC_DIV1 == clkDiv) { frequency = 2000; /* 2KHz when clock divisor is 1. */ } else { frequency = SystemULFRCOClockGet(); /* 1KHz when divisor is different from 1. */ } break; /** Low frequency RC oscillator */ case BURTC_CTRL_CLKSEL_LFRCO: frequency = SystemLFRCOClockGet() / (1 << clkDiv); /* freq=32768/2^clkDiv */ break; /** Low frequency crystal osciallator */ case BURTC_CTRL_CLKSEL_LFXO: frequency = SystemLFXOClockGet() / (1 << clkDiv); /* freq=32768/2^clkDiv */ break; default: /* No clock selected for BURTC. */ frequency = 0; } return frequency; }
/**************************************************************************//** * Initialize and start RTC. *****************************************************************************/ static void StartRTC( void ) { /* Enable LE */ CMU->HFCORECLKEN0 |= CMU_HFCORECLKEN0_LE; /* Enable LFRCO for RTC */ CMU->OSCENCMD = CMU_OSCENCMD_LFRCOEN; /* Setup LFA to use LFRCRO */ CMU->LFCLKSEL = CMU_LFCLKSEL_LFA_LFRCO; /* Enable RTC */ CMU->LFACLKEN0 = CMU_LFACLKEN0_RTC; /* Clear interrupt flags */ RTC->IFC = RTC_IFC_COMP1 | RTC_IFC_COMP0 | RTC_IFC_OF; /* 250 ms wakeup time */ RTC->COMP0 = ( PIN_LOOP_INTERVAL * SystemLFRCOClockGet() ) / 1000; /* Enable Interrupts on COMP0 */ RTC->IEN = RTC_IEN_COMP0; /* Enable RTC interrupts */ NVIC_EnableIRQ(RTC_IRQn); /* Enable RTC */ RTC->CTRL = RTC_CTRL_COMP0TOP | RTC_CTRL_DEBUGRUN | RTC_CTRL_EN; }