蓝桥杯—STM32G431RBT6(RTC时钟获取时间和日期)
一、RTC是什么,有什么用?
在 STM32 中,RTC(Real-Time Clock,实时时钟)主要有以下作用:
- 时间保持:即使在系统断电情况下,也能持续记录时间。(需要纽扣电池供电)
- 提供时间基准:为系统提供准确的时间信息,便于各种时间相关的操作和任务。
- 事件记录:可用于记录特定事件发生的时间。
主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多。日历包含两个32bit的时间寄存器,可直接输出时分秒,星期、月、日、年。其中使用最多的是LSE,LSE由一个外部的32.768KHZ(6PF负载)的晶振提供,精度高,稳定,RTC首选。LSI是芯片内部的30KHZ晶体,精度较低,会有温漂,一般不建议使用。HSE_RTC由HSE分频得到,最高是750khz,使用的也较少。因为我们的竞赛板子上只有HSE和LSI,并未连接LSE,因此我们使用HSE_RTC
在 RTC(实时时钟)中:
同步分频是指分频操作与时钟信号同步进行。也就是说,分频器的工作节奏与时钟信号的节奏一致,数据的传输和处理在时钟的控制下进行,这种方式可以确保分频结果的准确性和稳定性。
异步分频则是指分频操作与时钟信号不同步。可能会存在一些相位偏差或不确定性,在某些情况下可能会对系统的性能或时间精度产生一定影响。
同步分频和异步分频主要有以下区别:
- 时钟关系:同步分频的输出时钟与输入时钟同步,而异步分频的输出时钟与输入时钟不同步。
- 相位关系:同步分频的输出相位与输入相位直接相关,而异步分频的输出相位可能存在不确定性。
- 精度:一般情况下,同步分频的精度更高,因为它受到输入时钟的直接控制;异步分频的精度可能会受到一些因素的影响。
- 稳定性:同步分频相对更稳定,而异步分频在某些情况下可能会出现抖动或不稳定的情况。
选择同步分频或异步分频通常需要考虑以下因素:
- 系统要求:如果对时间精度和稳定性有较高要求,通常会优先选择同步分频。
- 电路复杂性:异步分频可能相对简单,但同步分频可能需要更复杂的电路设计。
- 应用场景:根据具体的应用环境和需求来决定,比如一些对相位关系要求不严格的场景可能更适合异步分频。
二、使用步骤
三、代码
定义结构体(日期和时间)
RTC_DateTypeDef rtc_date;
RTC_TimeTypeDef rtc_time;
在LCD函数中获取值
注意,两个都要获取一下,不然容易出毛病
HAL_RTC_GetDate(&hrtc, &rtc_date, RTC_FORMAT_BIN);
:通过调用HAL_RTC_GetDate
函数,从指定的hrtc
实时时钟获取日期信息,并将其存储到rtc_date
结构体中。RTC_FORMAT_BIN
表示以二进制格式获取日期。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中显示
sprintf(buf," Date:%02d-%02d-%02d", rtc_date.Year, rtc_date.Month, rtc_date.Date);
:使用sprintf
函数将日期信息按照指定的格式(年、月、日,均为两位数字)写入buf
字符串中。LCD_DisplayStringLine(Line3, (uint8_t*)buf);
:将包含日期信息的字符串显示在液晶屏的第 3 行。sprintf(buf," Time:%02d-%02d-%02d", rtc_time.Hours, rtc_time.Minutes, rtc_time.Seconds);
:类似地,使用sprintf
函数将时间信息按照指定的格式(时、分、秒,均为两位数字)写入buf
字符串中。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