[RISC-V MCU 应用开发] CH32F103之RTC(使用内部40K振荡器)测试

[复制链接]
 楼主| lmn2005 发表于 2023-5-11 13:54 | 显示全部楼层 |阅读模式
本帖最后由 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初始化代码如下:
  1. u8 RTC_Init(void)
  2. {

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

  6.     if (BKP_ReadBackupRegister(BKP_DR1) != 0xA1A2)
  7.     {
  8.         BKP_DeInit();                           //复位备份区域
  9.         RCC_LSICmd(ENABLE);
  10.         while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && temp <250)
  11.         {
  12.             temp++;
  13.             Delay_Ms(20);
  14.         }
  15.         if (temp >= 250)
  16.             return 1;

  17.         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  18.         RCC_RTCCLKCmd(ENABLE);
  19.         RTC_WaitForLastTask();
  20.         RTC_WaitForSynchro();
  21.         //      RTC_ITConfig(RTC_IT_ALR, ENABLE);
  22.         RTC_ITConfig(RTC_IT_SEC, ENABLE);                           //使能RTC秒中断
  23.         RTC_WaitForLastTask();
  24.         RTC_EnterConfigMode();
  25.         RTC_SetPrescaler(32767);
  26.         RTC_WaitForLastTask();
  27.         RTC_Set(2019, 10, 8, 13, 58, 55); /* Setup Time */
  28.         RTC_ExitConfigMode();
  29.         BKP_WriteBackupRegister(BKP_DR1, 0XA1A2);

  30.     } else
  31.     {
  32.         RCC_LSICmd(ENABLE);//
  33.         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//
  34.         RCC_RTCCLKCmd(ENABLE);//这三行是今天才添加的
  35.         RTC_WaitForSynchro();
  36.         RTC_ITConfig(RTC_IT_SEC, ENABLE);
  37.         RTC_WaitForLastTask();
  38.     }
  39.     RTC_NVIC_Config();                           //RCT中断分组设置
  40.     RTC_Get();                           //更新时间

  41.     return 0;
  42. }
86996645c8382714c1.png

完整的工程:

RTC测试(使用内置40K振荡器).rar

523.26 KB, 下载次数: 1

您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

597

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部