[蓝桥杯嵌入式有手就行]12_RTC


前言

一、内部结构

1、框图

二、RTC寄存器分析

1、RTC_TR(时间寄存器)

2、RTC_DR(日期寄存器)

3、RTC_SSR(辅助更新日历寄存器)

三、代码示例

1、配置过程

2、cubemx配置

1、时钟配置

2、RTC配置

3、上代码

四、问题

1、串口打印输出

总结

前言

注:本系列基于2023年蓝桥杯实战情况就行编写,所有软件均采用2023年赛点资源包

RTC比较简单,印象中考过一次,只需要记住日历是精确到秒的就行了。


一、内部结构

1、框图

在这里插入图片描述


二、RTC寄存器分析

1、RTC_TR(时间寄存器)

注意:要使用BCD码

为了保护RTC不受复位影响,其只能在初始化模式下执行写操作,换句话说,就是程序运行的时候不能写入。实际上系统会生成一个密钥,当密钥错误的时候启用写保护,我们也不是不能更改寄存器内的数据,就是麻烦而且没必要。具体可以看参考手册35.3.8节。


在这里插入图片描述

在这里插入图片描述

2、RTC_DR(日期寄存器)

RTC_DR寄存器也和上面一样,具有写保护。我们也是对着寄存器表格填就完事。


在这里插入图片描述

在这里插入图片描述


3、RTC_SSR(辅助更新日历寄存器)

RTC_SSR本质上是一个递减计数器:辅助更新日历。也可以理解为亚秒,即秒的小数部分,其计算公式为:

Second fraction = (PREDIV_S - SS) / (PREDIV_S + 1)

在这里插入图片描述


三、代码示例

1、配置过程

红色字体 的视实际情况选择


使能PWR和BKP时钟

使能后备寄存器访问

配置RTC时钟源

设置RTC预分频系数

设置时间

使能RTC时钟

开启相关中断(如闹钟)

开启中断服务函数

2、cubemx配置

1、时钟配置

按理说,电源电压波动会影响HSE和LSI时钟的准确性,但是,很可惜,板子上没有LSE(一般就是32.768kHZ的晶振) 。

因此,这里我们采用24M的HSE分频获得750khz时钟源。

在这里插入图片描述

在这里插入图片描述


2、RTC配置

在这里插入图片描述


3、上代码

定义如下两个变量,用于储存读出的时间


RTC_TimeDef H_M_S_Time
RTC_DateDef Y_M_D_Date


当我们需要读取时间的时候,调用下面两个函数必须同时使用


HAL_RTC_GetTime(&hrtc,&H_M_S_Time,RTC_Format_Bin);
HAL_RTC_GetDate(&hrtc,&Y_M_D_Date,RTC_Format_Bin);



四、问题

1、串口打印输出

由于其在寄存器中使用的是BCD码,因此我们需要转换

bin:


printf("time :%02d",(unsigned int)Y_M_D_Date.Year);//打印年份



BCD码:


printf("time :%02d",(unsigned int)((Y_M_D_Date.Year>>4)+(Y_M_D_Date.Year&0x0f)));


总结

RTC一般只需要掌握时间的设置和读取就可以了,应该是显示在LCD屏幕上,最多加个串口打印。当然理论上也是可以搞个记录开机历史时间的(每次复位,读取时间写入eeprom)。



请使用浏览器的分享功能分享到微信等