前言" A; s$ h& A( F2 \ 实时时钟(RTC)是一个独立的BCD 定时器/计数器,用来提供准确的日历和时间信息。准确性是其重要的指标。 问题 某客户在其产品的设计中,使用了STM32F429IIT6。客户在使用过程发现一个问题,虽然已经有使用电池对VBAT 进行供电,9 A! P l2 r& s2 t8 [4 Y X 但是在经常频繁的VDD 上下电之后,发现时钟会比准确的时间慢几秒钟。 1 w }1 V$ X2 |. _- u7 R 调研 1.了解问题' s y* w' b J6 R4 x- L 向客户了解其使用的固件库,得知他的程序是参考STM32Cube_FW_F4_V1.3.0\Projects\STM324x9I_EVAL\Examples\RTC 中的RTC_Calendar 例程。于是找来STM32439I-EVAL2 来进行验证,测试发现,# K6 {# a2 @- Q4 l% J STM32Cube_FW_F4_V1.3.0\Projects\STM324x9I_EVAL\Examples\RTC 中的RTC_Calendar 例程确实存在频繁上下电会导+ n. |2 ?8 F' A6 m) u 致时间变慢的情况;而对标准外设库0 r Z& M8 j" d5 j STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Examples\RTC 中的RTC_Calendar 例程进行测试,* ]. Q2 ` W4 `8 W" w/ U 则不存在此问题。所以,怀疑STM32Cube_FW_F4_V1.3.0\Projects\STM324x9I_EVAL\Examples\RTC 中的RTC_Calendar1 y1 k) R% f {5 O/ Q 例程存在Bug。5 h- R& M- O" t0 R 2.问题分析9 J. @8 s1 F+ F7 D1 Q 仔细阅读STM32Cube_FW_F4_V1.3.0\Projects\STM324x9I_EVAL\Examples\RTC 中的RTC_Calendar 例程,分析一下2 C, a! ~0 ?& u9 m main.c 主程序,“if(HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_DR0) != 0x32F2)”是用来判断RTC 是否是已经被配 置过的,所以怀疑的重点可放在这之前的“if(HAL_RTC_Init(&RtcHandle) != HAL_OK)”中的HAL_RTC_Init()函数。 进入位于stm32f4xx_hal_rtc.c 中的HAL_RTC_Init()函数,再进入其调用的位于stm32f4xx_hal_msp.c 中的 HAL_RTC_MspInit()函数,在这个函数中,可以看到以下代码:) r: p$ t4 o$ k& M% _ 1 u9 G0 R0 T/ [3 R+ [5 M: o 详细代码和解答请下载文档:https://www.stmcu.org.cn/document/detail/index/id-216744 更多实战经验文档:https://www.stmcu.org.cn/document/list/index/category-6577 m3 x/ d" `- M5 |" K0 _ 0 q7 w, f8 R" }+ @# g0 w |
现在用库除非遇到问题很少有人去分析了。 |