问题描述
在使用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相关配置,前期调试大量都无效。