以前几次生产时,都是先烧写程序(使用离线烧写器,不是烧片)后安装纽扣电池,然后生产测试,设置时间,没问题。
最近临近春节,工厂缺人,修改了生产流程,先安装纽扣电池后烧写程序,然后设置时间就百分百出错。出错的原因是Enter_RTC_InitMode返回超时。扣掉纽扣电池再装回去,上电就好了。这是什么原因?
时间设置函数:
/*##-1- Disable RTC registers write protection ############################*/
LL_RTC_DisableWriteProtection(RTC);
/*##-2- Enter in initialization mode ######################################*/
if (Enter_RTC_InitMode() != RTC_ERROR_NONE)
{
_say_("Enter_RTC_InitMode Error\r\n");
Voice_Play(VOICE_FAIL_SOUND, 0);
}
/*##-3- Configure the Date ################################################*/
/* Set Date: Monday March 31th 2015 */
LL_RTC_DATE_Config(RTC, Settime.tm_wday, __LL_RTC_CONVERT_BIN2BCD(Settime.tm_mday), __LL_RTC_CONVERT_BIN2BCD(Settime.tm_mon), __LL_RTC_CONVERT_BIN2BCD(Settime.tm_year));
/*##-4- Configure the Time ################################################*/
/* Set Time: 11:59:55 PM*/
LL_RTC_TIME_Config(RTC, LL_RTC_TIME_FORMAT_AM_OR_24, __LL_RTC_CONVERT_BIN2BCD(Settime.tm_hour), __LL_RTC_CONVERT_BIN2BCD(Settime.tm_min), __LL_RTC_CONVERT_BIN2BCD(Settime.tm_sec));
/*##-5- Exit of initialization mode #######################################*/
if (Exit_RTC_InitMode() != RTC_ERROR_NONE)
{
_say_("Exit_RTC_InitMode Error\r\n");
Voice_Play(VOICE_FAIL_SOUND, 0);
}
/*##-6- Enable RTC registers write protection #############################*/
LL_RTC_EnableWriteProtection(RTC);
Enter_RTC_InitMode函数如下:
uint32_t Enter_RTC_InitMode(void)
{
/* Set Initialization mode */
LL_RTC_EnableInitMode(RTC);
RTC_Timeout = RTC_TIMEOUT_VALUE;
/* Check if the Initialization mode is set */
while (LL_RTC_IsActiveFlag_INIT(RTC) != 1)
{
if (LL_SYSTICK_IsActiveCounterFlag())
{
RTC_Timeout --;
}
if (RTC_Timeout == 0)
{
return RTC_ERROR_TIMEOUT;
}
}
return RTC_ERROR_NONE;
}
|