#define RTC_MAIN
#include "RTC.h"
/***************************************************************************************
** 函数名称: RTC_Init
** 功能描述: RTC初始化
** 参 数: None
** 返 回 值: None
****************************************************************************************/
void RTC_Init(void)
{
LL_RTC_InitTypeDef RTC_InitStruct = {0};
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);//使能PWR时钟
LL_PWR_EnableBkUpAccess();
LL_RCC_ForceBackupDomainReset();
LL_RCC_ReleaseBackupDomainReset();
LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_LOW);
LL_RCC_LSE_Enable();
while(LL_RCC_LSE_IsReady() != 1){}//等待LSE就绪
LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE);//选择LSE作为RTC时钟
LL_RCC_EnableRTC();//开启RTC
RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR;//24小时制
RTC_InitStruct.AsynchPrescaler = 127;//(127+1)*(255+1)= 32768 ,使用32.768KHz晶振
RTC_InitStruct.SynchPrescaler = 255;
LL_RTC_Init(RTC, &RTC_InitStruct);//RTC初始化
if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) != 0x32F2)
{
Set_RTCTime(2019,10,1,8,30,0,2);//设置RTC时间,年,月,日,时,分,秒,星期
LL_RTC_BAK_SetRegister(RTC,LL_RTC_BKP_DR0,0x32F2);
}
Get_RTCTime();//获取RTC时间
}
/***************************************************************************************
** 函数名称: Get_RTCTime
** 功能描述: 获得RTC时间,2进制表示
** 参 数: None
** 返 回 值: None
****************************************************************************************/
void Get_RTCTime(void)
{
uint32_t midt = 0;
midt = LL_RTC_DATE_GetYear(RTC);
midt = (uint8_t)(((midt>>4)*10) + (midt&0x0000000f));
RTCTime.R_Year=(uint16_t)(midt+2000);//年
midt = LL_RTC_DATE_GetMonth(RTC);
midt = (uint8_t)(((midt>>4)*10) + (midt&0x0000000f));
RTCTime.R_Month=(uint8_t)midt;//月
midt = LL_RTC_DATE_GetDay(RTC);
midt = (uint8_t)(((midt>>4)*10) + (midt&0x0000000f));
RTCTime.R_Day=(uint8_t)midt;//日
midt = LL_RTC_TIME_GetHour(RTC);
midt = (uint8_t)(((midt>>4)*10) + (midt&0x0000000f));
RTCTime.R_Hour=(uint8_t)midt;//时
midt = LL_RTC_TIME_GetMinute(RTC);
midt = (uint8_t)(((midt>>4)*10) + (midt&0x0000000f));
RTCTime.R_Minute=(uint8_t)midt;//分
midt = LL_RTC_TIME_GetSecond(RTC);
midt = (uint8_t)(((midt>>4)*10) + (midt&0x0000000f));
RTCTime.R_Second=(uint8_t)midt;//秒
midt = LL_RTC_DATE_GetWeekDay(RTC);
midt = (uint8_t)(((midt>>4)*10) + (midt&0x0000000f));
RTCTime.R_Week=(uint8_t)midt;//星期
}
/***************************************************************************************
** 函数名称: Set_RTCTime
** 功能描述: 设置RTC时间,10进制设置
** 参 数: Year RTC年 范围:2000~4095
** Month RTC月 范围:1~12
** Day RTC日 范围:1~31
** Hour RTC时 范围:0~23
** Min RTC分 范围:0~60
** Sec RTC秒 范围:0~60
** week RTC星期 范围:1~7
** 返 回 值: None
****************************************************************************************/
void Set_RTCTime(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Min, uint8_t Sec, uint32_t week)
{
LL_RTC_TimeTypeDef RTC_TimeStruct = {0};
LL_RTC_DateTypeDef RTC_DateStruct = {0};
//设置RTC时间
RTC_DateStruct.Year = Year - 2000;//年
RTC_DateStruct.Month = Month;//月
RTC_DateStruct.Day = Day;//日
RTC_DateStruct.WeekDay = week;//星期
LL_RTC_DATE_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_DateStruct);
RTC_TimeStruct.Hours = Hour;//时
RTC_TimeStruct.Minutes = Min;//分
RTC_TimeStruct.Seconds = Sec;//秒
LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_TimeStruct);
Get_RTCTime();//获得新RTC时间
}
评论0