stm32cube生成rtc时钟

cube生成rtc时钟的工程

这一步在网上可以找到许多资料,在此就不做过多的赘述了。记住在生成工程的时候,也把串口打开,这样方便直接把时间信息输出到串口。

输出时间信息

在工程完成以后,只需要简单的加几句就可以输出时间。这几句加在主循环里面,

  /* USER CODE END WHILE */
	HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
	  HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
	  printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
	  printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
	  printf("\r\n");

`

这时在串口上面已经可以看到输出的时间信息了,但这时如果进行复位或者断电的话,时间又会重新开始了,因为我们还没有打开后备电源模块,所以断电就会重新开始。

开启后备模块

首先在时钟初始化函数里面进行修改,其他的东西全部删除了,就留下如下的代码,并且添加 ***__HAL_RCC_PWR_CLK_ENABLE(); ***//开启后备电源时钟

***HAL_PWR_EnableBkUpAccess();***//允许访问、RTC 备份寄存器
这两个函数。
void MX_RTC_Init(void)
{
  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};

  /** Initialize RTC Only
  */
  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)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN Check_RTC_BKUP */
     //  __HAL_RCC_BKP_CLK_ENABLE(); 
	***__HAL_RCC_PWR_CLK_ENABLE(); ***//开启后备电源时钟
	***HAL_PWR_EnableBkUpAccess();***//允许访问、RTC 备份寄存器
 /* ??????:0x32F1?RTC???????1 */

  //??????
  /* USER CODE END Check_RTC_BKUP */

  /** Initialize RTC and set the Time and Date
  */

}

在rtc,c里面添加如下函数

void  rtc_check(void )
{
	RTC_TimeTypeDef sTime = {0};
      RTC_DateTypeDef sDate = {0};
      /*读取后备寄存器的值,我们给他写入了一个值,我们在重新上电的时候,重新读取这个值,正常情况下,应该是不会发生改变的,如果发送了改变就重新写入我们设置的时间值*/
	if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F1)
  {
    /* ÉèÖÃʱ¼ä£¬ÉèÖÃÈÕÆÚ */
   sTime.Hours = 0x13;
  sTime.Minutes = 0x30;
  sTime.Seconds = 0x13;
  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_MONDAY;
  sDate.Month = RTC_MONTH_AUGUST;
  sDate.Date = 0x25;
  sDate.Year = 0x20;
  /*以上就是我们设置的时间值*/
  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F1);
	  
  }
  else
  {
    /* ????????????:SET */
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
    {
      printf("·¢ÉúÉϵ縴λ!\n");
	    
    }
    /* ????????????:SET */
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
    {
      printf("·¢ÉúÍⲿӡ½Å¸´Î»\n");
    }
    /* 清除标志位 */
    __HAL_RCC_CLEAR_RESET_FLAGS();
    /允许读取后备寄存器
     HAL_PWR_EnableBkUpAccess(); 
     //等待同步
     HAL_RTC_WaitForSynchro(&hrtc); 
  }
	
}

进行了以上的修改以后就可以进行正常的时间显示,复位,掉电都可以继续允许。
在这里插入图片描述
可以看到,我按下了复位,时间依然还是正常的。

如果需要源代码的话,可以私信我,我发给你。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值