本帖最后由 jinglixixi 于 2024-11-9 09:42 编辑  
 
RTC是一个独立的定时器,拥有一个连续计数的计数器,可以在相应的软件配置下提供时钟日历的功能。通过修改计数器的值,可以重新设置系统当前的时间和日期。 RTC的功能包括计时和提供当前的时间和日期。它包含两个32位的寄存器,分别用于存储秒、分钟、小时(12或24小时制)、星期几、日期、月份和年份。RTC还可以自动补偿月份的天数,并提供二进制格式的亚秒值。RTC在通过主板电池供电的情况下,即使开发板断电也能独立运行。 在嵌入式系统中,RTC主要用于提供准确的时间。  
RTC的内部结构框图如图1所示: 图1 结构框图  
对RTC初始化的函数为: - static void MX_RTC_Init(void)
 
 - {
 
 -   RTC_TimeTypeDef sTime = {0};
 
 -   RTC_DateTypeDef sDate = {0};
 
 -   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;
 
 -   if (HAL_RTC_Init(&hrtc) != HAL_OK)
 
 -   {
 
 -     Error_Handler();
 
 -   }
 
 -   //  if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2)
 
 -   sTime.Hours = 0x23;
 
 -   sTime.Minutes = 0x58;
 
 -   sTime.Seconds = 0x0;
 
 -   sTime.SubSeconds = 0x0;
 
 -   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 
 -   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
 
 -   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
 
 -   {
 
 -     Error_Handler();
 
 -   }
 
 -   // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
 
 -   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
 
 -   sDate.Month = RTC_MONTH_NOVEMBER;
 
 -   sDate.Date = 0x2;
 
 -   sDate.Year = 0x24;
 
 -   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
 
 -   {
 
 -     Error_Handler();
 
 -   }
 
 -   __HAL_RCC_CLEAR_RESET_FLAGS();
 
 - }
 
  
在LCD屏显示功能的配合下,其获取并显示时间的函数为: - static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
 
 - {
 
 -     RTC_DateTypeDef sdatestructureget;
 
 -     RTC_TimeTypeDef stimestructureget;
 
 -     HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
 
 -     HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
 
 -     LCD_ShowNum(20,30,stimestructureget.Hours,2,YELLOW);
 
 -     LCD_ShowNum(44,30,stimestructureget.Minutes,2,YELLOW);
 
 -     LCD_ShowNum(68,30,stimestructureget.Seconds,2,YELLOW);
 
 - }
 
  
实现电子时钟计时功能的主程序为: - int main(void)
 
 - {
 
 -   HAL_Init();
 
 -   BSP_LED_Init(LD1);
 
 -   BSP_LED_Init(LD3);
 
 -   BSP_LED_Init(LD2);
 
 -   SystemClock_Config();
 
 -   PeriphCommonClock_Config();
 
 -   MX_GPIO_Init();
 
 -   MX_RTC_Init();
 
 -   BSP_LED_On(LD1);
 
 -   RTCStatus = 1;
 
 -   LCD_GPIO();
 
 -   Lcd_Init();
 
 -   LCD_Clear(RED); 
 
 -   LCD_ShowString(10,10,"STM32WB09KE",YELLOW);
 
 -   LCD_ShowString(10,30,"jinglixixi",YELLOW);
 
 -   HAL_Delay(2000);
 
 -   LCD_Clear(RED);
 
 -   LCD_ShowChar(36,30,':',1,YELLOW);
 
 -   LCD_ShowChar(60,30,':',1,YELLOW);
 
 -   while (1)
 
 -   {
 
 -       RTC_CalendarShow(aShowTime, aShowDate);
 
 -       HAL_Delay(500);
 
 -   }
 
 - }
 
  
经程序的编译与下载,其显示效果如图2所示。 图2 连接与显示  
 图3 显示效果  
  
  
 
 
  |