蓝桥杯—STM32G431RBT6(RTC时钟获取时间和日期)

一、RTC是什么,有什么用?

在 STM32 中,RTC(Real-Time Clock,实时时钟)主要有以下作用:

  1. 时间保持:即使在系统断电情况下,也能持续记录时间。(需要纽扣电池供电)
  2. 提供时间基准:为系统提供准确的时间信息,便于各种时间相关的操作和任务。
  3. 事件记录:可用于记录特定事件发生的时间。

主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多。日历包含两个32bit的时间寄存器,可直接输出时分秒,星期、月、日、年。其中使用最多的是LSE,LSE由一个外部的32.768KHZ(6PF负载)的晶振提供,精度高,稳定,RTC首选。LSI是芯片内部的30KHZ晶体,精度较低,会有温漂,一般不建议使用。HSE_RTC由HSE分频得到,最高是750khz,使用的也较少。因为我们的竞赛板子上只有HSE和LSI,并未连接LSE,因此我们使用HSE_RTC

在 RTC(实时时钟)中:

同步分频是指分频操作与时钟信号同步进行。也就是说,分频器的工作节奏与时钟信号的节奏一致,数据的传输和处理在时钟的控制下进行,这种方式可以确保分频结果的准确性和稳定性。

异步分频则是指分频操作与时钟信号不同步。可能会存在一些相位偏差或不确定性,在某些情况下可能会对系统的性能或时间精度产生一定影响。

 

         同步分频和异步分频主要有以下区别:

  1. 时钟关系:同步分频的输出时钟与输入时钟同步,而异步分频的输出时钟与输入时钟不同步。
  2. 相位关系:同步分频的输出相位与输入相位直接相关,而异步分频的输出相位可能存在不确定性。
  3. 精度:一般情况下,同步分频的精度更高,因为它受到输入时钟的直接控制;异步分频的精度可能会受到一些因素的影响。
  4. 稳定性:同步分频相对更稳定,而异步分频在某些情况下可能会出现抖动或不稳定的情况。

    选择同步分频或异步分频通常需要考虑以下因素:

  5. 系统要求:如果对时间精度和稳定性有较高要求,通常会优先选择同步分频。
  6. 电路复杂性:异步分频可能相对简单,但同步分频可能需要更复杂的电路设计。
  7. 应用场景:根据具体的应用环境和需求来决定,比如一些对相位关系要求不严格的场景可能更适合异步分频。

 

 

二、使用步骤

dfcee18f788443e48fad3adf37ff87f5.png

69afdab7b0504fc0a1dea524e1dd2ad9.png

 

 

三、代码

定义结构体(日期和时间)

RTC_DateTypeDef rtc_date;
RTC_TimeTypeDef rtc_time;

在LCD函数中获取值

注意,两个都要获取一下,不然容易出毛病

 

  1. HAL_RTC_GetDate(&hrtc, &rtc_date, RTC_FORMAT_BIN);:通过调用HAL_RTC_GetDate函数,从指定的hrtc实时时钟获取日期信息,并将其存储到rtc_date结构体中。RTC_FORMAT_BIN表示以二进制格式获取日期。
  2. HAL_RTC_GetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN);:同样地,通过调用HAL_RTC_GetTime函数,从指定的hrtc实时时钟获取时间信息,并将其存储到rtc_time结构体中。RTC_FORMAT_BIN表示以二进制格式获取时间。
	HAL_RTC_GetDate(&hrtc,&rtc_date,RTC_FORMAT_BIN);
	HAL_RTC_GetTime(&hrtc,&rtc_time,RTC_FORMAT_BIN);

在LCD中显示

  1. sprintf(buf," Date:%02d-%02d-%02d", rtc_date.Year, rtc_date.Month, rtc_date.Date);:使用sprintf函数将日期信息按照指定的格式(年、月、日,均为两位数字)写入buf字符串中。
  2. LCD_DisplayStringLine(Line3, (uint8_t*)buf);:将包含日期信息的字符串显示在液晶屏的第 3 行。
  3. sprintf(buf," Time:%02d-%02d-%02d", rtc_time.Hours, rtc_time.Minutes, rtc_time.Seconds);:类似地,使用sprintf函数将时间信息按照指定的格式(时、分、秒,均为两位数字)写入buf字符串中。
  4. LCD_DisplayStringLine(Line4, (uint8_t*)buf);:将包含时间信息的字符串显示在液晶屏的第 4 行。
sprintf(buf," Date:%02d-%02d-%02d",rtc_date.Year,rtc_date.Month,rtc_date.Date);//RTC时钟
	LCD_DisplayStringLine(Line3,(uint8_t*)buf);
		sprintf(buf," Time:%02d-%02d-%02d",rtc_time.Hours,rtc_time.Minutes,rtc_time.Seconds);
	LCD_DisplayStringLine(Line4,(uint8_t*)buf);

四、开源代码

通过网盘分享的文件:19-TEST9-RTC实时时钟.zip
链接: https://pan.baidu.com/s/150G8rln1ZEBG1QCZBqrMAQ?pwd=0820 提取码: 0820

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值