- /* USER CODE END Header_StartTask02 */
 
- void StartTask02(void *argument)
 
- {
 
-   /* USER CODE BEGIN myTask02 */
 
-   uint8_t show_str[20];
 
-   uint8_t show_data[20];
 
-   uint8_t show_time[20];
 
-   uint32_t mytick;
 
-   RTC_DateTypeDef GetData;  //获取日期结构�?
 
 
-   RTC_TimeTypeDef GetTime;   //获取时间结构�?
 
 
-   /* Infinite loop */
 
-   for(;;)
 
-   {
 
-           mytick = HAL_GetTick();
 
-           sprintf(show_str,"run times:%d",mytick/1000);
 
-           ILI9488_printText(show_str,10,40,ILI9488_BLACK,ILI9488_WHITE,2);
 
-           /* Get the RTC current Time */
 
-           HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
 
-       /* Get the RTC current Date */
 
-       HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
 
-       sprintf(show_data, "%04d/%02d/%02d",2000 + GetData.Year, GetData.Month, GetData.Date);
 
-       ILI9488_printText(show_data,10,60,ILI9488_BLACK,ILI9488_WHITE,2);
 
-       sprintf(show_time, "%02d:%02d:%02d",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
 
-       ILI9488_printText(show_time,10,80,ILI9488_BLACK,ILI9488_WHITE,2);
 
 
-     osDelay(1000);
 
-   }
 
-   /* USER CODE END myTask02 */
 
- }
【RTC掉电重置】
但是呢,在hal库中生成的代码,每次断电就RTC时间会重置,每次上电都会重新初始化时间因为HAL库设置了一个BKP寄存器保存一个标志。每次单片机启动时都读取这个标志并判断是不是预先设定的值:如度果不是就初始化RTC并设置时间,再设置标志为预期值;如果是预期值就跳过初始化和时间设置,继续执行后面的程序
所以这里我们只需要每次上电执行RTC初始化之前,将标志设置为预期值即可。
为止,在rtc.c中的RTC_init修改为以下内容,即可以实现该功能。
- /* RTC init function */
 
- void MX_RTC_Init(void)
 
- {
 
 
-   /* USER CODE BEGIN RTC_Init 0 */
 
-         RTC_TimeTypeDef time;   //时间结构体参�?
 
-         RTC_DateTypeDef datebuff;   //日期结构体参�?
 
-   /* USER CODE END RTC_Init 0 */
 
 
-   RTC_PrivilegeStateTypeDef privilegeState = {0};
 
-   RTC_TimeTypeDef sTime = {0};
 
-   RTC_DateTypeDef sDate = {0};
 
 
-   /* USER CODE BEGIN RTC_Init 1 */
 
-   __HAL_RCC_PWR_CLK_ENABLE();                  //�?启电源时�?
 
-   /* USER CODE END RTC_Init 1 */
 
 
-   /** 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.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
 
-   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
 
-   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
 
-   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
 
-   hrtc.Init.BinMode = RTC_BINARY_NONE;
 
-   if (HAL_RTC_Init(&hrtc) != HAL_OK)
 
-   {
 
-     Error_Handler();
 
-   }
 
-   privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
 
-   privilegeState.rtcPrivilegeFeatures = RTC_PRIVILEGE_FEATURE_INIT;
 
-   privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_1;
 
-   privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
 
-   privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
 
-   if (HAL_RTCEx_PrivilegeModeSet(&hrtc, &privilegeState) != HAL_OK)
 
-   {
 
-     Error_Handler();
 
-   }
 
 
-   /* USER CODE BEGIN Check_RTC_BKUP */
 
-   if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
 
-           {
 
 
-   /* USER CODE END Check_RTC_BKUP */
 
 
-   /** Initialize RTC and set the Time and Date
 
-   */
 
-   sTime.Hours = 0x16;
 
-   sTime.Minutes = 0x6;
 
-   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_MONDAY;
 
-   sDate.Month = RTC_MONTH_NOVEMBER;
 
-   sDate.Date = 0x13;
 
-   sDate.Year = 0x23;
 
 
-   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
 
-   {
 
-     Error_Handler();
 
-   }
 
-   /* USER CODE BEGIN RTC_Init 2 */
 
-           datebuff = sDate;  //把日期数据拷贝到自己定义的data�?
 
-           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//向指定的后备区域寄存器写入数�?
 
-           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR2, (uint16_t)datebuff.Year);
 
-           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, (uint16_t)datebuff.Month);
 
-           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, (uint16_t)datebuff.Date);
 
-           HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, (uint16_t)datebuff.WeekDay);
 
 
-     }
 
-           else
 
-           {
 
-                   datebuff.Year    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);
 
-                   datebuff.Month   = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);
 
-                   datebuff.Date    = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);
 
-                   datebuff.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);
 
-                   sDate = datebuff;
 
-                   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
 
-                   {
 
-                           Error_Handler();
 
-                   }
 
 
-           }
 
 
-   /* USER CODE END RTC_Init 2 */
 
 
- }