问题描述

在使用STM32 RTC时钟的时候,想使用外部的32.768K Hz的高精度带温度补偿的 LSE 时钟源。 但是调用MX_RTC_Init()初始化的时候都会卡住。debug进去,可以看到卡住的位置在这里:

  if((hrtc->Instance->ISR & RTC_ISR_INITF) == 0U)
  {
    /* Set the Initialization mode */
    hrtc->Instance->ISR = (uint32_t)RTC_INIT_MASK;

    tickstart = HAL_GetTick();
    /* Wait till RTC is in INIT state and if Time out is reached exit */
    while ((hrtc->Instance->ISR & RTC_ISR_INITF) == 0U)
    {
      if((HAL_GetTick()  - tickstart) > RTC_TIMEOUT_VALUE)
      {
        return HAL_TIMEOUT;
      }
    }
  }

背景

使用的是 BL8025T 时钟芯片,此时钟芯片带有温度补偿电路,可以输出带温度补偿的32.768kHz时钟,用这个时钟来做为STM32H753的RTC低速旁路时钟(LSE)。

但是在初始化RTC时,会卡在上述过程中。


解决过程

解决过程花了3天时间,中间进行了大量的排除法,具体过程过于冗余,且我也已经记不清了,只能大概总结几点。

1.新建了一个裸机工程进行对比,发现裸机工程也跑不起来。

2.硬件同事告知可能需要把RTC电池取了,发现取了果然裸机工程可以跑了。 原理是RTC的相关配置会保存在后备寄存器中,只有把RTC电池取了,才会复位这些后备寄存器,普通的掉电复位、软件复位都是不能复位RTC相关寄存器的。

3.即使如此,我的工程还是不能跑,于是大量使用排除法,最终定位了时钟初始化函数,发现跑480MHz 100% 有问题,跑400MHz就只有10%有问题会卡住了。 但是这10%也不行啊,只能继续排除。

4.无意中打示波器发现,32.768kHz信号的电平怎么是4V,STM32不是只能接收3.3V吗? 于是让硬件同事改改,改了之后果然可行了。

最终原因

1.硬件同事给的时钟电平给错了,3.3V给成4V了。
2.RTC电池一直处于有电状态,导致复位时实际上没有复位RTC相关配置,前期调试大量都无效。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐