上一篇文章讲了Stm32 CubeIDE对RTC的日期、时间读写,后备存储的读写,发现几个问题,再次说明一下情况:
1.如果对RTC做初始化:
c
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
printf("rtc_error\r\n");
Error_Handler();
}
else
{
printf("rtc---ok\r\n");
}
存在一个问题,每次复位,断电后起来都会对RTC部分硬件做初始化操作,我感觉在初始化操作期间,时间是暂停的,估计对走时精度会产生一定的影响。
如果只做一次初始化后不再重复做初始化操作,复位关机等的确不会影响走时,但80个后备字节的写入存在问题,程序不报错,就是写不进去数据。这个没有找到合适的解决方法。
c
if(( HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR19)) != 0x55AA1234)
{
sTime.Hours = 0x20;
sTime.Minutes = 0x47;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_TUESDAY;
sDate.Month = RTC_MONTH_DECEMBER;
sDate.Date = 0x6;
sDate.Year = 0x23;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
/* USER CODE END RTC_Init 2 */
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR19, 0x55AA1234);
}
else
{
printf("rtc_123\r\n");
}
对时间日期只写入一次,否则会每次开机都是设置的时间和日期。
还有一个问题是,代码拷贝到新的工程使用、,发现每次断电影响RTC电源后的开机,程序有问题。
检查后发现是时钟配置的问题:
c
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 7;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
原来的程序没有配置打开 RCC_LSE
c
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON; //没有打开
不知道为什么低速时钟只要打开一次就可以由电池记忆获得始终打开的权力。只有到了RTC部分断电才影响到,必须再次由程序打开。