【待更新】解决RTC_WaitForSynchro()死循环

在使用低速内部时钟LSI(LSI为32内部RC时钟,频率40KHz),以及BKP存储掉电信息时,会一直卡在该函数上RTC_WaitForSynchro();

分析

stm32f10x_rtc.c源码分析

/**
  * @brief  Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL)
  *   are synchronized with RTC APB clock.
  * @note   This function must be called before any read operation after an APB reset
  *   or an APB clock stop.
  * 简介:等待直到RTC寄存器(RTC_CNT,RTC_ALR和RTC_PRL)与RTC APB时钟同步。
    注意:必须在APB复位或APB时钟停止后进行任何读取操作之前调用此函数。
  * @param  None
  * @retval None
  */
void RTC_WaitForSynchro(void)
{
  /* Clear RSF flag */
  RTC->CRL &= (uint16_t)~RTC_FLAG_RSF;
  /* Loop until RSF flag is set */
  /*循环直到置位了RSF标志*/
  while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET)
  {
  }
}

所以需要检查RTC的RSF位置,如下图

仿真-RSF未置位

在这里插入图片描述

解决方法

我的解决方法是在读取BKP寄存器前添加,RCC_RTCCLKCmd(ENABLE);函数

在这里插入图片描述

仿真-修改后的

在这里插入图片描述
没有测试使用外部LSE时钟(32.768K)的情况,请遇到相同的问题CSDN好友,帮忙解决,补充下^_^
有空的话我也跟着做


版权声明:本文为baidu_39603247原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。