蓝桥杯—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. 应用场景:根据具体的应用环境和需求来决定,比如一些对相位关系要求不严格的场景可能更适合异步分频。

二、使用步骤

三、代码

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

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

相关推荐
m0_748240911 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件
悲伤小伞1 小时前
C++_数据结构_详解二叉搜索树
c语言·数据结构·c++·笔记·算法
Cchengzu3 小时前
阿里巴巴2017实习生笔试题(二)
stm32·单片机·嵌入式硬件
佳心饼干-4 小时前
C语言-09内存管理
c语言·算法
物联网牛七七4 小时前
4、数据结构与算法解析(C语言版)--栈
c语言·栈操作
F-2H6 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
重生之我是数学王子6 小时前
单片机 STM32入门
stm32·单片机·嵌入式硬件
qq_4597300310 小时前
4-3 MCU中ARM存储器的作用
arm开发·单片机·嵌入式硬件
余额不足1213810 小时前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
罗伯特祥12 小时前
C调用gnuplot绘图的方法
c语言·plot