本帖最后由 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;
- }
完整的工程:
|