2、解决办法 初始化函数改为 void MX_RTC_Init(void) { // RTC_TimeTypeDef sTime;//在前面申明 // RTC_DateTypeDef DateToUpdate;
/**Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE; if (HAL_RTC_Init(&hrtc) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
/**Initialize RTC and set the Time and Date */ if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2) { sTime.Hours = 0x23; sTime.Minutes = 0x59; sTime.Seconds = 0x50;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
DateToUpdate.WeekDay = RTC_WEEKDAY_SATURDAY; DateToUpdate.Month = RTC_MONTH_DECEMBER; DateToUpdate.Date = 0x3; DateToUpdate.Year = 0x17;
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
/* 写入一个数值:0x32F2到RTC备份数据寄存器1 */ HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x32F2);//随便写的一个数,目的就是检测是否掉电 } 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"); DateToUpdate.Year = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3); DateToUpdate.Month = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4); DateToUpdate.Date = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5); DateToUpdate.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR6); HAL_RTC_SetDate(&hrtc,&DateToUpdate,RTC_FORMAT_BIN); //与写入的方式保持一致!main函 数里面写入的是二进制 } /* 清楚复位源标志位 */ __HAL_RCC_CLEAR_RESET_FLAGS(); } } main函数改为: while (1) { /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ HAL_RTC_GetDate (&hrtc,&DateToUpdate,RTC_FORMAT_BIN); //必须立即备份,以后再显示 HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, DateToUpdate.Year); //使用二进制写入寄存器,应该以二进制存入 HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, DateToUpdate.Month); HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, DateToUpdate.Date); HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR6, DateToUpdate.Month); /* Display date Format : yy/mm/dd */ printf("%d/%d/%d\r\n",2000+DateToUpdate.Year, DateToUpdate.Month, DateToUpdate.Date);//BCD吗,12月份就是)0X12,显示出来就是18月了! HAL_RTC_GetTime (&hrtc,&sTime,RTC_FORMAT_BIN); printf("%d:%d:%d\r\n",sTime.Hours, sTime.Minutes, sTime.Seconds); printf("\r\n"); HAL_Delay(1000);
}
|