STM32的RTC时钟不准问题

使用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小时偏移
}