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