lmn2005 发表于 2023-5-11 13:54

CH32F103之RTC(使用内部40K振荡器)测试

本帖最后由 lmn2005 于 2023-5-11 13:57 编辑

本人手头的CH32F103开发板,外部低速晶振可能是失效的。下载官方的RTC例程后,打印的时间均为0,所以想启用内部低速40K RC振荡器,有意测试一下RTC的功能是否正常。不料屡试不成,问题就是,设置一次,只能当次正常,重启后就会卡在RTC初始化中的 RTC_WaitForSynchro();。今天,通过分析,估计在RTC初始化时,如果测试到非首次启用RTC,就直接运行
      RTC_WaitForSynchro();
      RTC_ITConfig(RTC_IT_SEC, ENABLE);
      RTC_WaitForLastTask();
有问题。
于是补上
      RCC_LSICmd(ENABLE);
      RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
      RCC_RTCCLKCmd(ENABLE);
结果正常。具体的RTC初始化代码如下:
u8 RTC_Init(void)
{

    u8 temp = 0;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);                           //使能后备寄存器访问

    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA1A2)
    {
      BKP_DeInit();                           //复位备份区域
      RCC_LSICmd(ENABLE);
      while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && temp <250)
      {
            temp++;
            Delay_Ms(20);
      }
      if (temp >= 250)
            return 1;

      RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
      RCC_RTCCLKCmd(ENABLE);
      RTC_WaitForLastTask();
      RTC_WaitForSynchro();
      //      RTC_ITConfig(RTC_IT_ALR, ENABLE);
      RTC_ITConfig(RTC_IT_SEC, ENABLE);                           //使能RTC秒中断
      RTC_WaitForLastTask();
      RTC_EnterConfigMode();
      RTC_SetPrescaler(32767);
      RTC_WaitForLastTask();
      RTC_Set(2019, 10, 8, 13, 58, 55); /* Setup Time */
      RTC_ExitConfigMode();
      BKP_WriteBackupRegister(BKP_DR1, 0XA1A2);

    } else
    {
      RCC_LSICmd(ENABLE);//
      RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//
      RCC_RTCCLKCmd(ENABLE);//这三行是今天才添加的
      RTC_WaitForSynchro();
      RTC_ITConfig(RTC_IT_SEC, ENABLE);
      RTC_WaitForLastTask();
    }
    RTC_NVIC_Config();                           //RCT中断分组设置
    RTC_Get();                           //更新时间

    return 0;
}

完整的工程:

页: [1]
查看完整版本: CH32F103之RTC(使用内部40K振荡器)测试