Stm32 CubeIDE对RTC的日期、时间读写,后备存储的读写

Stm32 CubeIDE对RTC的日期、时间读写,后备存储的读写,一折腾又是好多的问题,现在梳理一下,后面的不要过多踩坑了。

用STM32CubeIDE生成代码

这里有时间和日期的设置,在代码中也会生成相应的代码,首次设置后必须注释掉,否者每次开机都是相同的时间和日期。

在rtc.c文件中注释掉下面代码:

c 复制代码
 /** Initialize RTC and set the Time and Date
  */
//  sTime.Hours = 0x0;
//  sTime.Minutes = 0x0;
//  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_FRIDAY;
//  sDate.Month = RTC_MONTH_DECEMBER;
//  sDate.Date = 0x1;
//  sDate.Year = 0x23;
//
//  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
//  {
//    Error_Handler();
//  }

设置时间日期的代码:

c 复制代码
    RTC_TimeTypeDef sTime_now = {0};
    RTC_DateTypeDef Date;

  Date.Year = 23;
  Date.Month = 12;
  Date.Date = 4;
  Date.WeekDay = 1;
  HAL_RTC_SetDate(&hrtc, &Date, RTC_FORMAT_BIN);
  sTime_now.Hours = 14;
  sTime_now.Minutes = 00;
  sTime_now.Seconds = 0;
  HAL_RTC_SetTime(&hrtc, &sTime_now, RTC_FORMAT_BIN);

RTC_FORMAT_BIN 是表示二进制模式 不是RTC_FORMAT_BCD模式

RTC_FORMAT_BCD模式是指16进制的高位当10进制使用,也就是说12分钟,在RTC_FORMAT_BCD中是0x12,在RTC_FORMAT_BIN 中是0x0C。

时间日期的读取:

c 复制代码
RTC_DateTypeDef Date;
RTC_TimeTypeDef Time;
	  HAL_RTC_GetTime(&hrtc, &Time, RTC_FORMAT_BIN);
	  HAL_RTC_GetDate(&hrtc, &Date, RTC_FORMAT_BIN);
	  printf("%02d-%02d-%02d\r\n",Date.Year, Date.Month, Date.Date);	// Date.WeekDay表示日期
	  printf("%02d:%02d:%02d\r\n", Time.Hours, Time.Minutes, Time.Seconds);

以上代码有个事项要一定注意,就是必须把HAL_RTC_GetTime(&hrtc, &Time, RTC_FORMAT_BIN);放在前面,我一开始就是不注意,把读取日期放在前面,读取时间放在了后面,导致读取时间读不到最新的时间的问题,只要你注意看,英文有解释的:

@note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the

复制代码
     values in the higher-order calendar shadow registers to ensure
复制代码
     consistency between the time and date values.
复制代码
     Reading RTC current time locks the values in calendar shadow registers
复制代码
     until current date is read to ensure consistency between the time and
复制代码
     date values.

这么一个小细节又是折腾好久啊。

本来以为这样就搞定了,又出现问题,就是在复位的瞬间时间是不走时的,问题出现在初始化这里,再修改一下啊:

c 复制代码
RTC_HandleTypeDef hrtc;

/* RTC init function */
void MX_RTC_Init(void)
{
  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};
   hrtc.Instance = RTC;				//必须放在if外面
  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR19) != 0x55AA1234)
  {
	  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)
	  {
		Error_Handler();
	  }
	  HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR19, 0x55AA1234);
  }
}

以上代码也说明了后备数据的读写:

c 复制代码
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR19, 0x55AA1234);	//写后备数据

其中RTC_BKP_DR19可以取值的范围是RTC_BKP_DR0~RTC_BKP_DR19一共20个4位的字节,共80字节。

读取是

c 复制代码
HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR19);
相关推荐
西城微科方案开发6 小时前
多品类电子秤一体化PCBA整体方案
单片机·嵌入式硬件·电子秤
做萤石二次开发的哈哈6 小时前
AI 陪护机器人硬件如何接入萤石ERTC 实现实时通话?
人工智能·音视频·实时音视频·萤石开放平台
火花页.6 小时前
【正点原子ZYNQ领航者7020】PS端GPIO中断→按键控制LED实验
单片机·嵌入式硬件
ye150127774556 小时前
4.2V升6V1A同步升压WT3213
单片机·嵌入式硬件·其他·硬件工程
嵌入式小站7 小时前
STM32 可移植教程 02:按键状态机,消抖、长按、释放一行也不用多写(实战篇)
chrome·vscode·stm32·单片机·嵌入式硬件
Szime8 小时前
AD9694 国产替代方案:四通道高速 ADC 在通信与雷达项目中的选型参考
单片机·嵌入式硬件·fpga开发
fanged8 小时前
Datasheet学习6(光机)
嵌入式硬件
Zyed9 小时前
[STM32]Day15读写FLASH+读取ID
前端·stm32·性能优化
芯岭技术郦9 小时前
高性能的 32 位 ARM® Cortex®-M0+内核PY32F002A
单片机·嵌入式硬件
破晓单片机9 小时前
060、STM32项目分享:养老智能手环系统
stm32·单片机·嵌入式硬件