RTC clock和RTC APB1 clock的异步问题
介绍
RTC (real-time clock)是一个独立的计时器。有了RTC提供的连续运行的计数器,通过一定的软件方法可以提供时钟日历功能。计数器计数值可以设置。RTC的内核和时钟配置在备份区域,不受芯片复位或休眠模式的影响。复位后,备份区域的备份寄存器和RTC是禁止访问的,需要通知设置PWR_CR来允许访问。
特点
分频因数高达2的20次方
32bit计数值
两个独立的时钟:总线时钟和外部时钟源
RTC时钟源可选
两种独立的复位方式:接口复位和内核复位分离
三个可屏蔽的中断线:报警中断,秒钟中断,溢出中断
功能描述
概述
RTC主要由两部分组成:总线接口和内核。总线接口包括一些16bit寄存器。内核包括一些可编程分频器和计数器
寄存器复位
RTC_PRL, RTC_ALR, RTC_CNT, and RTC_DIV位于备份区不随系统复位或电源复位而复位
读寄存器
寄存器配置
寄存器标志位
应用笔记
/**
* @brief Waits until the RTC registers are synchronized with RTC APB clock.
* @note The RTC Resynchronization mode is write protected, use the
* @ref LL_RTC_DisableWriteProtection before calling this function.
* @param RTCx RTC Instance
* @retval An ErrorStatus enumeration value:
* - SUCCESS: RTC registers are synchronised
* - ERROR: RTC registers are not synchronised
*/
ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx)
{
__IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT;
ErrorStatus status = SUCCESS;
uint32_t tmp = 0U;
/* Check the parameter */
assert_param(IS_RTC_ALL_INSTANCE(RTCx));
/* Clear RSF flag */
LL_RTC_ClearFlag_RS(RTCx);
/* Wait the registers to be synchronised */
tmp = LL_RTC_IsActiveFlag_RS(RTCx);
while ((timeout != 0U) && (tmp != 0U))
{
if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
{
timeout--;
}
tmp = LL_RTC_IsActiveFlag_RS(RTCx);
if (timeout == 0U)
{
status = ERROR;
}
}
return (status);
}