使用STM32标准库编写的RTC时钟用了一两天后不准的问题,误差会有几十秒,有时快有时慢,使用了外部晶振32.768和3V纽扣电池供电VBAT。
当我使用MyRTC_SetTime设置时间的时钟,使用一两天后,RTC时钟就会出现偏差。使用的备用电池。
代码是参考江科大的:
void MyRTC_Init(void)
{
//第一步:配置BKP备份寄存器,由备用电源供应
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //开启PWR的时钟,挂载在APB1上
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE); //开启BKP的时钟,挂载在APB1上
PWR_BackupAccessCmd(ENABLE); //备份访问控制
if(BKP_ReadBackupRegister(BKP_DR1) !=0xA5A5) //如果BKP没被清零就代表没断电。因为每次初始化RTC都会被清零。所以加个判断断电初始化
{
//第二步:开启LSE时钟,32.768khz的,并等待LSE时钟启动完成
RCC_LSEConfig(RCC_LSE_ON); //如果LSE晶振不起振,就会卡死
/*备用方法:使用LSI内部晶振
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET); //等待标志位完成
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //RCC时钟选择LSI
*/
//RCC_GetFlagStatus(RCC_FLAG_LSERDY); //获取LES时钟准备标志位
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET); //等待标志位完成
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //RCC时钟选择LSE
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro(); //等待同步函数
RTC_WaitForLastTask(); //等待上一次操作完成
//第三步:配置PSC预分频器得到1HZ频率
RTC_SetPrescaler(32768-1); //当使用LSE的时候预分配32768-1得到1HZ,当使用LSI的时候预分配40000-1得到1HZ
RTC_WaitForLastTask(); //等待上一次操作完成
//设置时间
//MyRTC_SetTime(1672588795);
BKP_WriteBackupRegister(BKP_DR1,0xA5A5); //把BKP写上
}
else
{
RTC_WaitForSynchro(); //等待同步函数
RTC_WaitForLastTask(); //等待上一次操作完成
}
}
//设置起始时间戳
void MyRTC_SetTime(u32 time_cnt)
{
RTC_SetCounter(time_cnt);
RTC_WaitForSynchro(); //等待同步函数
RTC_WaitForLastTask(); //等待上一次操作完成
}
//读当前时间
u32 MyRTC_ReadTime(void)
{
return RTC_GetCounter();//读取CNT的秒数。8小时偏移
}