Инициализирует встроенные часы реального времени (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);
}