void rtt_init(void) { RTC_Type *rtt = RTT_DEV; RTT_UNLOCK(); /* Reset RTC */ rtt->CR = RTC_CR_SWR_MASK; /* cppcheck-suppress redundantAssignment * reset routine */ rtt->CR = 0; if (rtt->SR & RTC_SR_TIF_MASK) { /* Clear TIF by writing TSR. */ rtt->TSR = 0; } /* Enable RTC oscillator and non-supervisor mode accesses. */ /* Enable load capacitance as configured by periph_conf.h */ rtt->CR = RTC_CR_OSCE_MASK | RTC_CR_SUP_MASK | RTC_LOAD_CAP_BITS; /* Clear TAF by writing TAR. */ rtt->TAR = 0xffffff42; /* Disable all RTC interrupts. */ rtt->IER = 0; rtt_poweron(); }
void rtt_init(void) { /* power on the selected LPTIMER */ rtt_poweron(); /* stop the timer and reset configuration */ LPTIM1->CR = 0; /* select low speed clock (LSI or LSE) */ RCC->CCIPR &= ~(RCC_CCIPR_LPTIM1SEL); #if CLOCK_LSE RCC->CCIPR |= (RCC_CCIPR_LPTIM1SEL_1 | RCC_CCIPR_LPTIM1SEL_0); #else RCC->CCIPR |= (RCC_CCIPR_LPTIM1SEL_0); #endif /* set configuration: prescale factor and external clock (LSI or LSE) */ LPTIM1->CFGR = PRE; /* enable overflow and compare interrupts */ LPTIM1->IER = (LPTIM_IER_ARRMIE | LPTIM_IER_CMPMIE); NVIC_EnableIRQ(LPTIM1_IRQn); /* enable timer */ LPTIM1->CR = LPTIM_CR_ENABLE; /* set auto-reload value (timer needs to be enabled for this) */ LPTIM1->ARR = RTT_MAX_VALUE; /* start the timer */ LPTIM1->CR |= LPTIM_CR_CNTSTRT; }
void rtt_init(void) { stmclk_enable_lfclk(); /* power on the selected LPTIMER */ rtt_poweron(); /* stop the timer and reset configuration */ LPTIM1->CR = 0; /* select low speed clock (LSI or LSE) */ CLOCK_SRC_REG &= ~(CLOCK_SRC_MASK); CLOCK_SRC_REG |= CLOCK_SRC_CFG; /* set configuration: prescale factor and external clock (LSI or LSE) */ LPTIM1->CFGR = PRE; /* enable overflow and compare interrupts */ LPTIM1->IER = (LPTIM_IER_ARRMIE | LPTIM_IER_CMPMIE); NVIC_EnableIRQ(LPTIM1_IRQn); /* enable timer */ LPTIM1->CR = LPTIM_CR_ENABLE; /* set auto-reload value (timer needs to be enabled for this) */ LPTIM1->ARR = RTT_MAX_VALUE; /* start the timer */ LPTIM1->CR |= LPTIM_CR_CNTSTRT; }
/** * @brief Initialize RTT module * * The RTT is running at 32768 Hz by default, i.e. @ XOSC32K frequency without * divider. There are 2 cascaded dividers in the clock path: * * - GCLK_GENDIV_DIV(n): between 1 and 31 * - RTC_MODE0_CTRL_PRESCALER_DIVn: between 1 and 1024, see defines in `component_rtc.h` * * However the division scheme of GCLK_GENDIV_DIV can be changed by setting * GCLK_GENCTRL_DIVSEL: * * - GCLK_GENCTRL_DIVSEL = 0: Clock divided by GENDIV.DIV (default) * - GCLK_GENCTRL_DIVSEL = 1: Clock divided by 2^( GENDIV.DIV + 1 ) */ void rtt_init(void) { RtcMode0 *rtcMode0 = &(RTT_DEV); /* Turn on power manager for RTC */ PM->APBAMASK.reg |= PM_APBAMASK_RTC; /* RTC uses External 32,768KHz Oscillator because OSC32K isn't accurate * enough (p1075/1138). Also keep running in standby. */ SYSCTRL->XOSC32K.reg = SYSCTRL_XOSC32K_ONDEMAND | SYSCTRL_XOSC32K_EN32K | SYSCTRL_XOSC32K_XTALEN | SYSCTRL_XOSC32K_STARTUP(6) | #if RTT_RUNSTDBY SYSCTRL_XOSC32K_RUNSTDBY | #endif SYSCTRL_XOSC32K_ENABLE; /* Setup clock GCLK2 with divider 1 */ GCLK->GENDIV.reg = GCLK_GENDIV_ID(2) | GCLK_GENDIV_DIV(1); while (GCLK->STATUS.bit.SYNCBUSY) {} /* Enable GCLK2 with XOSC32K as source. Use divider without modification * and keep running in standby. */ GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(2) | GCLK_GENCTRL_GENEN | #if RTT_RUNSTDBY GCLK_GENCTRL_RUNSTDBY | #endif GCLK_GENCTRL_SRC_XOSC32K; while (GCLK->STATUS.bit.SYNCBUSY) {} /* Connect GCLK2 to RTC */ GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN_GCLK2 | GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_ID(RTC_GCLK_ID); while (GCLK->STATUS.bit.SYNCBUSY) {} /* Disable RTC */ rtt_poweroff(); /* Reset RTC */ rtcMode0->CTRL.bit.SWRST = 1; while (rtcMode0->STATUS.bit.SYNCBUSY || rtcMode0->CTRL.bit.SWRST) {} /* Configure as 32bit counter with no prescaler and no clear on match compare */ rtcMode0->CTRL.reg = RTC_MODE0_CTRL_MODE_COUNT32 | RTT_PRESCALER; while (rtcMode0->STATUS.bit.SYNCBUSY) {} /* Setup interrupt */ NVIC_EnableIRQ(RTT_IRQ); /* Enable RTC */ rtt_poweron(); }
void rtt_init(void) { rtt_poweron(); /* configure interrupt */ NVIC_SetPriority(RTT_IRQ, RTT_IRQ_PRIO); NVIC_EnableIRQ(RTT_IRQ); /* clear RSF flag */ RTT_DEV->CRL &= ~(RTT_FLAG_RSF); _rtt_enter_config_mode(); /* Reset RTC counter MSB word */ RTT_DEV->CNTH = 0x0000; /* Set RTC counter LSB word */ RTT_DEV->CNTL = 0x0000; /* set prescaler */ RTT_DEV->PRLH = ((RTT_PRESCALER>>16)&0x000f); RTT_DEV->PRLL = (RTT_PRESCALER&0xffff); _rtt_leave_config_mode(); }
void rtc_poweron(void) { rtt_poweron(); }