RTC 意外恢复初始
1. 问题描述
客户反馈在使用 STM32F446 的产品做上电、掉电测试时,RTC 会意外恢复到配置的初始值。
2. 问题分析及解决
通过与客户邮件沟通,了解到客户 VBAT 引脚上有独立的电池供电,在代码中当第一次启动时
会检查备份寄存器中保留的一个标志,如果是第一次运行,则会设置 RTC 的初始化,包含年月日时
秒,如果不是,则跳过,后面只读 RTC 内的时间信息,并不再修改。
为了使用统一的参考物,先建议客户使用 Cube 库下的官方示例代码
STM32Cube_FW_F4_V1.25.0\Projects\STM32F446ZE-Nucleo\Examples\RTC\RTC_Calendar, 此代
码刚好可以针对此问题进行分析。 客户使用此示例代码测试问题依旧。
查看示例代码,为了排 HSE LSE 的影响,建议客户 HSE 改为 HSI, LSE 改为 LSI,这样一
来,完全跟板上高速晶振无关,跟 32.768K 的低速也无关。客户使用修改后的代码问题依旧。
查看相关代码:
/*##-2- Check if Data stored in BackUp register1: No Need to reconfigure RTC#*/
/* Read the BackUp Register 1 Data */
if(HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_DR1) != 0x32F2)
{
/* Configure RTC Calendar */
RTC_CalendarConfig();
}
如上面代码所示,每次上电后会读 BKP_DR1 的值,判断是否为第一次启动,如果是,则配置
RTC。换句话说,出现问题时,这个判断肯定出现问题,导致重复配置 RTC,也就是备份寄存器的值
丢失!是什么原因导致备份寄存器的值丢失呢?
同时我这边在 NUCLEO 板上尝试重现客户的问题,但无论如何尝试都无法重现,现在两边所使用
的测试软件一模一样,只是各自的硬件平台有所差异,看来就是这个硬件上的差异带来的问题。于是
下一步比较客户的硬件 NUCLEO 板有何不同。
首先怀疑是 VBAT 引脚。要是 VBAT 再现异常,RTC 重新配置就很正常,但客户的 VBAT 真的会
出现问题么?下面是客 VBAT 引脚的相关电路:
Figure 1 VBAT
外围电路
如上图所示,客户 VBAT 外部接一电池,当 VDD 有电时,VDD 将将电池充电,当 VDD 掉电时,
电池给 RTC 供电。于是向客户提 VBAT 的在掉电上电测试过程中的波形:
Figure 2 VBAT
波形
如上图所示,VBAT 引脚的波形,在电源掉电上电的过程中并没有出现掉电的情况,也就是说,
RTC 应该会有一个稳定的电源供应。为了避免 VBAT 的影响,要客户干脆将 R8 这个电阻去掉再
试, 结果问题依旧存在。
接下来继续查看用户 MCU 相关的原理图,发现 Vcap 引脚上的电路与 ST 官方的建议并不一致: