久芯网

Enter_RTC_InitMode超时(跟纽扣电池的安装顺序有关?)

avatar uagood 提问时间: 2023-07-09 11:35:01 / 已解决
以前几次生产时,都是先烧写程序(使用离线烧写器,不是烧片)后安装纽扣电池,然后生产测试,设置时间,没问题。
最近临近春节,工厂缺人,修改了生产流程,先安装纽扣电池后烧写程序,然后设置时间就百分百出错。出错的原因是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;
}

3个回答
  • avatar xmshao
    最佳答案
    回答时间: 2023-07-09 12:00:28

    结合你的问题描述,我认为这个Enter_RTC_InitMode()初始化代码本身不会有啥问题。 另外,RTC时钟设置跟这个纽扣也没有多少关系,它毕竟只是个备份电源。 难道是这个纽扣的 先上和 后上动作 对外围其它电路造成了影响? 目前我只是怀疑到LSE这块是否受到了影响。

  • avatar uagood
    回答时间: 2023-07-09 12:23:10
    xmshao 发表于 2023-1-17 15:10
    结合你的问题描述,我认为这个Enter_RTC_InitMode()初始化代码本身不会有啥问题。

    因为工厂使用离线烧写器,不是烧片。我觉得是离线烧写的时候,片内固件开始起作用,芯片已经开始工作,此时芯片内部RTC的某些东西可能有改变。做这个推测基于两点:1、拿掉纽扣电池再装上去再开机就正常;2、加入测试代码,当出现这个错误时,对RTC部分重新进行初始化,再写时间也就正常了

  • avatar butterflyspring
    回答时间: 2023-07-09 12:56:19

    纽扣电池的安装应该和复位有关系,猜测你的备份域也一起复位。 所以库函数通常没问题,那么有可能和逻辑会有关系,比如是否使用了备份域的内容作为判断条件等。

会员中心 微信客服
客服
回到顶部