[STM32WB] 【STM32WB09KE测评】+RTC与电子时钟

[复制链接]
1755|3
 楼主| jinglixixi 发表于 2024-11-9 09:39 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2024-11-9 09:42 编辑

RTC是一个独立的定时器,拥有一个连续计数的计数器,可以在相应的软件配置下提供时钟日历的功能。通过修改计数器的值,可以重新设置系统当前的时间和日期。
RTC的功能包括计时和提供当前的时间和日期。它包含两个32位的寄存器,分别用于存储秒、分钟、小时(1224小时制)、星期几、日期、月份和年份。RTC还可以自动补偿月份的天数,并提供二进制格式的亚秒值。RTC在通过主板电池供电的情况下,即使开发板断电也能独立运行。
在嵌入式系统中,RTC主要用于提供准确的时间。

RTC的内部结构框图如图1所示:
9980672ebc7731f00.png
1 结构框图

对RTC初始化的函数为:
  1. static void MX_RTC_Init(void)
  2. {
  3.   RTC_TimeTypeDef sTime = {0};
  4.   RTC_DateTypeDef sDate = {0};
  5.   hrtc.Instance = RTC;
  6.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  7.   hrtc.Init.AsynchPrediv = 127;
  8.   hrtc.Init.SynchPrediv = 255;
  9.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  10.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  11.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  12.   {
  13.     Error_Handler();
  14.   }
  15.   //  if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2)
  16.   sTime.Hours = 0x23;
  17.   sTime.Minutes = 0x58;
  18.   sTime.Seconds = 0x0;
  19.   sTime.SubSeconds = 0x0;
  20.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  21.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  22.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
  27.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
  28.   sDate.Month = RTC_MONTH_NOVEMBER;
  29.   sDate.Date = 0x2;
  30.   sDate.Year = 0x24;
  31.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  32.   {
  33.     Error_Handler();
  34.   }
  35.   __HAL_RCC_CLEAR_RESET_FLAGS();
  36. }

LCD屏显示功能的配合下,其获取并显示时间的函数为:
  1. static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
  2. {
  3.     RTC_DateTypeDef sdatestructureget;
  4.     RTC_TimeTypeDef stimestructureget;
  5.     HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  6.     HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  7.     LCD_ShowNum(20,30,stimestructureget.Hours,2,YELLOW);
  8.     LCD_ShowNum(44,30,stimestructureget.Minutes,2,YELLOW);
  9.     LCD_ShowNum(68,30,stimestructureget.Seconds,2,YELLOW);
  10. }

实现电子时钟计时功能的主程序为:
  1. int main(void)
  2. {
  3.   HAL_Init();
  4.   BSP_LED_Init(LD1);
  5.   BSP_LED_Init(LD3);
  6.   BSP_LED_Init(LD2);
  7.   SystemClock_Config();
  8.   PeriphCommonClock_Config();
  9.   MX_GPIO_Init();
  10.   MX_RTC_Init();
  11.   BSP_LED_On(LD1);
  12.   RTCStatus = 1;
  13.   LCD_GPIO();
  14.   Lcd_Init();
  15.   LCD_Clear(RED);
  16.   LCD_ShowString(10,10,"STM32WB09KE",YELLOW);
  17.   LCD_ShowString(10,30,"jinglixixi",YELLOW);
  18.   HAL_Delay(2000);
  19.   LCD_Clear(RED);
  20.   LCD_ShowChar(36,30,':',1,YELLOW);
  21.   LCD_ShowChar(60,30,':',1,YELLOW);
  22.   while (1)
  23.   {
  24.       RTC_CalendarShow(aShowTime, aShowDate);
  25.       HAL_Delay(500);
  26.   }
  27. }

经程序的编译与下载,其显示效果如图2所示。
11106672ebd0755d63.png
2 连接与显示

89522672ebd21b4c5b.png
3 显示效果



AdaMaYun 发表于 2024-11-11 19:06 | 显示全部楼层
RTC与电子时钟学习
yangjiaxu 发表于 2024-11-29 14:12 | 显示全部楼层
RTC确实很多项目都在使用,这个RTC不知道准不准确,我们一般都是使用的外置的RTC
 楼主| jinglixixi 发表于 2024-11-29 16:42 | 显示全部楼层
yangjiaxu 发表于 2024-11-29 14:12
RTC确实很多项目都在使用,这个RTC不知道准不准确,我们一般都是使用的外置的RTC ...

一般短时间使用没问题,长时间使用可能累计偏差会大一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部