前言
一、内部结构
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)。