STM32F10x RTC init

Инициализирует встроенные часы реального времени (RTC) на работу с внешним кварцевым резонатором 32768 кГц и с секундными прерываниями.

Следует учитывать, что RTC в STM32F10x в отличии от внешних микросхем (DS1307) или часов в MCU NXP не имеют аппаратного календаря и представляют всего лишь 32х битный счётчик. С другой стороны это позволяет легко использовать кванты времени отличные от секунды.

void RTC_IRQHandler(void)
{
    if(RTC->CNTL & 1)
        GPIOB->BSRR = GPIO_Pin_8;
    else
        GPIOB->BRR = GPIO_Pin_8;
    RTC->CRL &= ~0x0F;
}


void initRTC(void)
{
    RCC->APB1ENR |= RCC_APB1Periph_PWR | RCC_APB1Periph_BKP;
    PWR->CR |= PWR_CR_DBP;

    RCC->BDCR |= RCC_BDCR_LSEON;
    while( (RCC->BDCR & RCC_BDCR_LSERDY) == 0 ) ; // Wait for LSERDY = 1 (LSE is ready)

    RCC->BDCR |= RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_0;

    while( (RTC->CRL & RTC_CRL_RTOFF) == 0 ) ; // Poll RTOFF, wait until its value goes to ‘1’

    RTC->CRL |= RTC_CRL_CNF;
    RTC->PRLH = 0;
    RTC->PRLL = 0x7FFF;
    /* Use this if you want reinit RTC */
    /* 
     *RTC->CNTH = 0;
     *RTC->CNTL = 1;
     *RTC->ALRH = 0;
     *RTC->ALRL = 0;
     */


    RTC->CRH = RTC_CRH_SECIE;
    RTC->CRL &= ~RTC_CRL_CNF;
    while(  (RTC->CRL & RTC_CRL_RTOFF) == 0 ) ; // Poll RTOFF, wait until its value goes to ‘1’ to check the end of the write operation.

    PWR->CR &= ~PWR_CR_DBP;

    /* NVIC_SetPriority & NVIC_EnableIRQ defined in core_cm3.h */
    NVIC_SetPriority (RTC_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
    NVIC_EnableIRQ (RTC_IRQn);
}
 
comments powered by Disqus