前言实时时钟(RTC)是一个独立的 BCD 定时器/计数器,用来提供准确的日历和时间信息。准确性是其重要的指标。
问题某客户在其产品的设计中,使用了 STM32F429IIT6。客户在使用过程发现一个问题,虽然已经有使用电池对 VBAT 进行供电, 但是在经常频繁的 VDD 上下电之后,发现时钟会比准确的时间慢几秒钟。
调研 1.了解问题向客户了解其使用的固件库,得知他的程序是参考 STM32Cube_FW_F4_V1.3.0ProjectsSTM324x9I_EVALExamplesRTC 中的 RTC_Calendar 例程。于是找来 STM32439I-EVAL2 来进行验证,测试发现,STM32Cube_FW_F4_V1.3.0ProjectsSTM324x9I_EVALExamplesRTC 中的 RTC_Calendar 例程确实存在频繁上下电会导致时间变慢的情况;而对标准外设库 STM32F4xx_DSP_StdPeriph_Lib_V1.4.0ProjectSTM32F4xx_StdPeriph_ExamplesRTC 中的RTC_Calendar 例程进行测试,则不存在此问题。所以,怀疑 STM32Cube_FW_F4_V1.3.0ProjectsSTM324x9I_EVALExamplesRTC 中的 RTC_Calendar 例程存在 Bug。 2.问题分析仔细阅读
STM32Cube_FW_F4_V1.3.0ProjectsSTM324x9I_EVALExamplesRTC 中的 RTC_Calendar 例程,分析一下 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()函数,在这个函数中,可以看到以下代码:/*##-1- Configue LSE as RTC clock soucre ###################################*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
一周热门 更多>