一,原理
RTC实质上就是一个单片机内部的一个万年历可以读取获得到时间,和日期。
二,cubemax配置
这里要使分频为1hz,750000/125/6000。
三,keil的相关配置
rtc.c
RTC_HandleTypeDef hrtc;
void RTC_Init(void)
{
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 125;
hrtc.Init.SynchPrediv = 6000;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
sTime.Hours = 0x15;
sTime.Minutes = 0x10;
sTime.Seconds = 0x5;
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();
}
sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
sDate.Month = RTC_MONTH_SEPTEMBER;
sDate.Date = 0x1;
sDate.Year = 0x21;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
}
void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{
if(rtcHandle->Instance==RTC)
{
__HAL_RCC_RTC_ENABLE();
}
}
rtc.h
extern RTC_HandleTypeDef hrtc;
void RTC_Init(void);
main.h
初始化
RTC_TimeTypeDef H_M_S_Timer;
RTC_DateTypeDef Y_M_D_Date;
uint8_t Second;
RTC_Init();
显示(这里面要记得时间和日期要同时读才行)(入口参数的第三个也一定要选二进制的))
HAL_RTC_GetTime(&hrtc,&H_M_S_Timer,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&Y_M_D_Date,RTC_FORMAT_BIN);
sprintf((char*)Lcd_Disp_String,"Time:%02d-%02d-%02d",(unsigned int)H_M_S_Timer.Hours,(unsigned int)H_M_S_Timer.Minutes,(unsigned int)H_M_S_Timer.Seconds);
LCD_DisplayStringLine(Line0,Lcd_Disp_String);
时钟分频
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
|RCC_PERIPHCLK_ADC12;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32;