STM32的RTC使用

初始化RTC

#define RTC_SET_CONFIG_FLAG	0x6066/**< RTC设置完成标志*/

/*判断是否第一次配置*/
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1) != RTC_SET_CONFIG_FLAG)
{
	/*设置时间为:2020-5-28-周四,1点7分0秒*/
	RTC_Set_DateTime(20 ,5 ,28 ,4 ,1 ,7 ,0);
 	/*设置已初始化标志*/
 	/*取消备份区域写保护*/
	HAL_PWR_EnableBkUpAccess();                       
	HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,RTC_SET_CONFIG_FLAG);
}

/**
  * @fn RTC_Set_DateTime
  * @brief 设置RTC日期时间
  * @details 
  * @param[in] None
  * @return None
  * @note None
  * @attention None
  */
void RTC_Set_DateTime(uint8_t year ,uint8_t month ,uint8_t date ,uint8_t weekday ,uint8_t hour, uint8_t minute ,uint8_t sec)
{
	RTC_Set_Date(year ,month ,date ,weekday);
	RTC_Set_Time(hour ,minute ,sec);
}

设置时间保存时间

/**
  * @fn RTC_Set_Time
  * @brief 设置RTC时间
  * @details 
  * @param[in] 时 分 秒
  * @return None
  * @note None
  * @attention None
  */
void RTC_Set_Time(uint8_t Hours ,uint8_t Minutes ,uint8_t Seconds)
{
    RTC_TimeTypeDef ConfigTime;
    ConfigTime.Hours = Hours;            
    ConfigTime.Minutes = Minutes;          
    ConfigTime.Seconds = Seconds; 
    if(HAL_RTC_SetTime(&hrtc, &ConfigTime, RTC_FORMAT_BIN) != HAL_OK)
    {
      Error_Handler();
    }
}

/**
  * @fn RTC_Set_Date
  * @brief 设置RTC日期
  * @details 
  * @param[in] 年 月 日 周
  * @return None
  * @note None
  * @attention None
  */
void RTC_Set_Date(uint8_t Year ,uint8_t Month ,uint8_t Date ,uint8_t WeekDay)
{
  RTC_DateTypeDef ConfigDate;     
  ConfigDate.Year = Year; 
  ConfigDate.Month = Month;
  ConfigDate.Date = Date; 
  ConfigDate.WeekDay = WeekDay;  
  if(HAL_RTC_SetDate(&hrtc, &ConfigDate, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
}

获取实时时间

typedef struct DateTime
{
	uint8_t Year;
	uint8_t Month;
	uint8_t Date;
	uint8_t WeekDay;
	uint8_t Hours;
	uint8_t Minutes;
	uint8_t Seconds;
}DateTime_Typedef;

/**
  * @fn Get_CurrentTime
  * @brief 获取当前时间
  * @details None
  * @param None
  * @return -1:获取时间失败 0:成功
  * @note None
  * @attention None
  */
int Get_Date_Time(DateTime_Typedef *pDateTime)
{
    RTC_DateTypeDef CurrentDate;
    RTC_TimeTypeDef CurrentTime;
	
	/*先获取时间,再获取日期,否则有时延*/
    if((HAL_OK == HAL_RTC_GetTime(&hrtc, &CurrentTime, RTC_FORMAT_BIN))
       && HAL_OK == HAL_RTC_GetDate(&hrtc, &CurrentDate, RTC_FORMAT_BIN))
    {
    	/*获取年月日*/
        pDateTime->Year = CurrentDate.Year+2000;
        pDateTime->Month= CurrentDate.Month;
        pDateTime->Date = CurrentDate.Date;
        pDateTime->WeekDay = CurrentDate.WeekDay;
        pDateTime->Hours =  CurrentTime.Hours;
        pDateTime->Minutes =  CurrentTime.Minutes; 
        pDateTime->Seconds = CurrentTime.Seconds;
        return 0 ;
    }
    return -1 ;
}

RTC后备区另类使用

typedef struct 
{
	uint16_t year;
	uint16_t Month;
	uint16_t Date;
	uint16_t WeekDay;
}ConfigPar_t;
 
/**
  * @fn Save_Config_Par
  * @brief 后备区保存参数
  * @details None
  * @param[in] configpar
  * @return None
  * @note None
  * @attention None
  */
void Save_Config_Par(ConfigPar_t *pData)
{
	/*取消备份区域写保护*/
	HAL_PWR_EnableBkUpAccess();
	HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,pData->Year);
	HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR2,pData->Month);
	HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR3,pData->Date);
    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR4,pData->WeekDay);
}

/**
  * @fn Read_Config_Par
  * @brief 后备区读取保存的参数
  * @details None
  * @param[in] pData
  * @param[out] pData
  * @return None
  * @note None
  * @attention None
  */
void Read_Config_Par(ConfigPar_t *pData)
{
	pData->Year = HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1);
	pData->Month = HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR2);
	pData->Date = HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR3);
    pData->WeekDay = HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR4);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值