当前位置:   article > 正文

[STM32U5]【NUCLEO-U5A5ZJ-Q测评】超简单的RTC实验_rtc测评

rtc测评

【前言】
STM32U5A5带有RTC(实时时钟),RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。stm32CubeIDE可以轻松的帮开发者配置相关的代码。本实验只实现时间的读取与展示。
【开发环境】
win11
Stm32CubeIDE 1.13版本
【开发板】
NUCLEO-U5A5ZJ-Q
ILI9488LCD屏
【工程创建】
1、设置RCC
 

  • 设置高速外部时钟HSE 选择外部时钟源
  • 使能外部晶振LSE


RTC设备因为其独特的运行方式(即掉电依旧运行)使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE。
2、配置RTC
 

  • Activate Clock Source 激活时钟源
  • Activate calendar激活日历


 


设置时、分、秒,以及年月日,这里我们需要设置为BCD模式。
3、设置外部低速时钟输入。
 


按alt+k重新生成工程,在freertos任务中添加时钟的读取与显示功能:

  1. /* USER CODE END Header_StartTask02 */
  2. void StartTask02(void *argument)
  3. {
  4.   /* USER CODE BEGIN myTask02 */
  5.   uint8_t show_str[20];
  6.   uint8_t show_data[20];
  7.   uint8_t show_time[20];
  8.   uint32_t mytick;
  9.   RTC_DateTypeDef GetData;  //获取日期结构�?
  10.   RTC_TimeTypeDef GetTime;   //获取时间结构�?
  11.   /* Infinite loop */
  12.   for(;;)
  13.   {
  14.           mytick = HAL_GetTick();
  15.           sprintf(show_str,"run times:%d",mytick/1000);
  16.           ILI9488_printText(show_str,10,40,ILI9488_BLACK,ILI9488_WHITE,2);
  17.           /* Get the RTC current Time */
  18.           HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
  19.       /* Get the RTC current Date */
  20.       HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
  21.       sprintf(show_data, "%04d/%02d/%02d",2000 + GetData.Year, GetData.Month, GetData.Date);
  22.       ILI9488_printText(show_data,10,60,ILI9488_BLACK,ILI9488_WHITE,2);
  23.       sprintf(show_time, "%02d:%02d:%02d",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
  24.       ILI9488_printText(show_time,10,80,ILI9488_BLACK,ILI9488_WHITE,2);
  25.     osDelay(1000);
  26.   }
  27.   /* USER CODE END myTask02 */
  28. }


【RTC掉电重置】
但是呢,在hal库中生成的代码,每次断电就RTC时间会重置,每次上电都会重新初始化时间因为HAL库设置了一个BKP寄存器保存一个标志。每次单片机启动时都读取这个标志并判断是不是预先设定的值:如度果不是就初始化RTC并设置时间,再设置标志为预期值;如果是预期值就跳过初始化和时间设置,继续执行后面的程序
所以这里我们只需要每次上电执行RTC初始化之前,将标志设置为预期值即可。
为止,在rtc.c中的RTC_init修改为以下内容,即可以实现该功能。

  1. /* RTC init function */
  2. void MX_RTC_Init(void)
  3. {
  4.   /* USER CODE BEGIN RTC_Init 0 */
  5.         RTC_TimeTypeDef time;   //时间结构体参�?
  6.         RTC_DateTypeDef datebuff;   //日期结构体参�?
  7.   /* USER CODE END RTC_Init 0 */
  8.   RTC_PrivilegeStateTypeDef privilegeState = {0};
  9.   RTC_TimeTypeDef sTime = {0};
  10.   RTC_DateTypeDef sDate = {0};
  11.   /* USER CODE BEGIN RTC_Init 1 */
  12.   __HAL_RCC_PWR_CLK_ENABLE();                  //�?启电源时�?
  13.   /* USER CODE END RTC_Init 1 */
  14.   /** Initialize RTC Only
  15.   */
  16.   hrtc.Instance = RTC;
  17.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  18.   hrtc.Init.AsynchPrediv = 127;
  19.   hrtc.Init.SynchPrediv = 255;
  20.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  21.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  22.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  23.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  24.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  25.   hrtc.Init.BinMode = RTC_BINARY_NONE;
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
  31.   privilegeState.rtcPrivilegeFeatures = RTC_PRIVILEGE_FEATURE_INIT;
  32.   privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_1;
  33.   privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
  34.   privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
  35.   if (HAL_RTCEx_PrivilegeModeSet(&hrtc, &privilegeState) != HAL_OK)
  36.   {
  37.     Error_Handler();
  38.   }
  39.   /* USER CODE BEGIN Check_RTC_BKUP */
  40.   if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
  41.           {
  42.   /* USER CODE END Check_RTC_BKUP */
  43.   /** Initialize RTC and set the Time and Date
  44.   */
  45.   sTime.Hours = 0x16;
  46.   sTime.Minutes = 0x6;
  47.   sTime.Seconds = 0x0;
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  51.   {
  52.     Error_Handler();
  53.   }
  54.   sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  55.   sDate.Month = RTC_MONTH_NOVEMBER;
  56.   sDate.Date = 0x13;
  57.   sDate.Year = 0x23;
  58.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  59.   {
  60.     Error_Handler();
  61.   }
  62.   /* USER CODE BEGIN RTC_Init 2 */
  63.           datebuff = sDate;  //把日期数据拷贝到自己定义的data�?
  64.           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//向指定的后备区域寄存器写入数�?
  65.           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR2, (uint16_t)datebuff.Year);
  66.           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, (uint16_t)datebuff.Month);
  67.           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, (uint16_t)datebuff.Date);
  68.           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, (uint16_t)datebuff.WeekDay);
  69.     }
  70.           else
  71.           {
  72.                   datebuff.Year    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);
  73.                   datebuff.Month   = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);
  74.                   datebuff.Date    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);
  75.                   datebuff.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);
  76.                   sDate = datebuff;
  77.                   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  78.                   {
  79.                           Error_Handler();
  80.                   }
  81.           }
  82.   /* USER CODE END RTC_Init 2 */
  83. }


---------------------
作者:lulugl
链接:https://bbs.21ic.com/icview-3340356-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/579252
推荐阅读
相关标签
  

闽ICP备14008679号