问题现象
做项目采用STM32L4系列,为了方便PCB布板,使用PC13作为电源控制管脚,项目初期未进行BOOT程序设计,RTC初始化以及唤醒设置均未发现问题。
项目中期需要增加BOOT程序,测试时发现PC13不受程序控制,系统复位后仍有同样问题,初期以为芯片问题,更换后可以恢复正常,后续还会偶发PC13不受控,电源供电失败问题。
现象分析
根据现象可以判断不是单片机存在问题,在网络查找类似问题,部分大佬提示PC13受RTC控制,但未明确给出实际解决方案以及问题发生原因:
-
通过查找芯片寄存器手册RM0351,发现PC13可供RTC寄存器配置,如下图所示;
如果设置成普通IO口需要TAMP1E TSE置位0。
TAMP1E在RTC_TAMPCR寄存器0位。 TSE在RTC_CR寄存器11位。
-
对寄存器查看可以发现数值被改写,通过仿真断点等发现在RTC设置时间时会对RTC_CR寄存器进行操作,HAL库函数及部分代码如下:
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
assert_param(IS_RTC_DAYLIGHT_SAVING(sTime->DayLightSaving));
assert_param(IS_RTC_STORE_OPERATION(sTime->StoreOperation));
hrtc->Instance->CR |= (uint32_t)(sTime->DayLightSaving | sTime->StoreOperation);
此函数时改变CR寄存器的值,之后在查找HAL_RTC_SetTime的调用发现局部变量RTC_TimeTypeDef类型 未初始化,造成DayLightSaving存在随机数,从而造成写入错误;
3.暂未理解问题:HAL_RTC_SetTime存在DayLightSaving与StoreOperation值判断,按理来说不应该会出错,求各位大佬指点是否是因为BOOT原因引起数据检查错误。
问题解决
1.局部变量不论类型,一定要初始化初始化初始化。
2.对于已经写错误的可以采用断电进行复位所有电源,备份域断电后会恢复初值。
3.不断电的可以使用函数进行操作,注意:将CR寄存器直接置0无效。
HAL_StatusTypeDef HAL_RTCEx_DeactivateTimeStamp(RTC_HandleTypeDef *hrtc)
4.管脚要是够用还是换了吧,鬼知道会不会有别的问题。