Stm32 CubeIDE对RTC的日期、时间读写,后备存储的读写的部分做个补充说明

上一篇文章讲了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部分断电才影响到,必须再次由程序打开。

相关推荐
szxinmai主板定制专家9 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB202612 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)13 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~14 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计15 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界15 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
HQB202616 小时前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程
不悔哥17 小时前
开源LineageOS:旧手机刷上开源系统
嵌入式硬件·智能手机·开源
服务器硬件项目经理17 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
一次调频AGCAVC18 小时前
一次调频系统控制柜的组成及一次调频装置主机功能详述
人工智能·嵌入式硬件