蓝桥杯STM32 G431 HAL库开发速成教程——RTC实时时钟详解

一、什么是RTC?

RTC 是实时时钟(Real-Time Clock)的缩写,它是一种计时器件,通常用于计算和保持时间的精确追踪。这种设备在多种电子系统中都非常重要,尤其是在需要精确时间保持的应用中,如计算机、服务器、通讯设备和嵌入式系统(如单片机)等。

RTC的主要特点和功能包括:

持续时间跟踪:即使在主系统断电或处于低功耗模式时,RTC仍然可以继续工作,因为它通常由一个小型的电池供电。

低功耗:RTC 设计用来消耗极少的电力,从而可以在没有外部电源供应的情况下长时间运行。

提供日期和时间信息:RTC能够提供年、月、日、小时、分钟和秒等信息。一些RTC还包括星期几的数据。

应用广泛:从电脑(用于保持系统时钟)到嵌入式系统(如微控制器项目),再到工业机器和通讯设备,RTC都是不可或缺的部分。

在许多微控制器和系统开发板(如STM32系列)中,RTC是一个内置的组件,通过专用的软件库(如HAL库)进行控制和管理。开发者可以通过编程设置时间、读取当前时间、配置闹钟等功能。

二、RTC常见的函数

1.HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
设置RTC的时间。你需要提供一个指向RTC_TimeTypeDef结构的指针,该结构包含小时、分钟和秒等信息。Format参数指定时间的格式(例如,二进制或BCD)。

RTC_FORMAT_BIN:
二进制。

RTC_FORMAT_BCD:
BCD格式,二进制编码的十进制,是一种特殊的格式,其中每个十进制数字都单独编码为一个四位二进制数。

2.HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
设置RTC的日期。类似于设置时间,你需要提供一个指向RTC_DateTypeDef结构的指针,其中包含年、月、日等信息。

3.HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
获取当前的时间。

4.HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
获取当前的日期。注意,通常在调用HAL_RTC_GetTime之后调用此函数,以确保时间和日期的一致性。

三、配置STM32cubeMX

对RTC的日历,闹钟功能进行使能

四、代码实现

实现功能:单片机上显示的将是实时更新的时间和日期,格式为 “23:59:45” 和 “2022-15-11”(或者随着时间的推移,显示的时间会变化)。

1.在/* USER CODE BEGIN 0 /与/ USER CODE END 0 */之间增加如下代码

uint8_t ShowTime[16]="hh:ms:ss";
uint8_t ShowDate[16]="yyyy-dd-mum";
static void RTC_CalendarShow(uint8_t *showtime,uint8_t *showdate)
{
	RTC_DateTypeDef Nowdate ;
	RTC_TimeTypeDef Nowtime ;

	HAL_RTC_GetTime (&hrtc,&Nowtime,RTC_FORMAT_BIN);//获取时间存储到相关寄存器
	HAL_RTC_GetDate(&hrtc,&Nowdate,RTC_FORMAT_BIN);
	sprintf((char *)showtime,"%2d:%2d:%2d",Nowtime.Hours,Nowtime.Minutes,Nowtime.Seconds) ;//存储到showtime里,并在LCD上显示
	LCD_DisplayStringLine(Line8,(uint8_t *)ShowTime);
	sprintf((char *)showdate,"%2d-%2d-%2d",2000 + Nowdate.Year,Nowdate.Month,Nowdate.Date) ;//存储到showdate里,并在LCD上显示惇年份是只有后两位,需要加上2000
	LCD_DisplayStringLine(Line9,(uint8_t *)ShowDate);
}

void RTC_SetTime (uint8_t HH, uint8_t MM, uint8_t SS)
{
  RTC_TimeTypeDef sTime;
	sTime.Hours = HH;
  sTime.Minutes = MM;
  sTime.Seconds = SS;
	if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }

}
static void RTC_SetDate (uint8_t YY, uint8_t MM, uint8_t DD)
{
	RTC_DateTypeDef sDate;
  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = MM;
  sDate.Date = DD;
  sDate.Year = YY;
  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
}

2.在main.c中的int main(void)函数添加如下代码

RTC_SetDate(22,11,15);
RTC_SetTime(23,59,45);

3.在while(1)中添加如下代码

	RTC_CalendarShow(ShowTime,ShowDate);

五、RTC与RCC的区别

RTC(Real-Time Clock)和RCC(Reset and Clock Control)是微控制器和其他嵌入式系统中常见的两个组件,它们在功能和用途上有显著的区别:

1.RTC(实时时钟):
功能:RTC主要用于保持实时日期和时间的记录,即使在主电源断电的情况下也能通过备用电池继续工作。

应用:RTC用于提供精确的时间和日期,常见于需要记录日志、时间戳、闹钟或定时器功能的系统中。

工作方式:RTC通常具有自己的振荡器和电源,确保在系统断电时仍能保持时间的准确性。

接口和控制:可以通过特定的通信接口(如I2C、SPI等)来设置和读取RTC的时间和日期。

2.RCC(复位和时钟控制):
功能:RCC是STM32的时钟控制器,可开启或关闭各总线的时钟,在使用各外设功能必须先开启其对应的时钟,没有这个时钟内部的各器件就不能运行。

应用:RCC用于配置微控制器的时钟树,调整各种外设和处理器的运行频率。

工作方式:RCC可以选择不同的时钟源(如内部振荡器、外部晶振等),并对这些时钟源进行分频、倍频以满足不同部件的时钟需求。

重要性:RCC对于系统性能和功耗管理至关重要,它影响着微控制器的运行效率和稳定性。

总结来说,RTC主要是用于跟踪实时日期和时间,而RCC则是用于配置和管理微控制器的整个时钟系统。两者虽然在名字上有相似之处,但在功能和应用上有着明显的不同。

物联沃分享整理
物联沃-IOTWORD物联网 » 蓝桥杯STM32 G431 HAL库开发速成教程——RTC实时时钟详解

发表评论