一,RTC简介
二,IDE配置驱动。
1,使能外部LSE时钟。
2,选择LSE。
3,RTC时钟分频。
三,程序使用。
1,初始化。
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
RTC_DateTypeDef RtcDate;
RTC_TimeTypeDef RtcTime;
uint8_t time_set = 0;//用户设置时间标记
/* RTC init function */
void MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 0 */
/* USER CODE END RTC_Init 0 */
/* USER CODE BEGIN RTC_Init 1 */
/* 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.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
//HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0X0000);//取消标记
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0)!=0X5050)//是否第一次配置
{
sTime.Hours = 11;
sTime.Minutes = 58;
sTime.Seconds = 30;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 30;
sDate.Year = 23;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0X5050);//标记已经初始化过了
}
/* USER CODE END RTC_Init 2 */
}
2,读取程序
HAL_RTC_GetTime(&hrtc, &RtcTime, RTC_FORMAT_BIN);//读出时间值
HAL_RTC_GetDate(&hrtc, &RtcDate, RTC_FORMAT_BIN);//一定要先读时间后读日期
printf(" RTC实时时钟测试\r\n");
printf(" 实时时间:%04d-%02d-%02d %02d:%02d:%02d \r\n",2000+RtcDate.Year,
RtcDate.Month, RtcDate.Date,RtcTime.Hours, RtcTime.Minutes, RtcTime.Seconds);//显示日期时间
四,总结。
写入和读取函数,有两种格式,RTC_FORMAT_BIN和RTC_FORMAT_BCD,即二进制和BCD码格式。这里后用RTC_FORMAT_BIN。