目录

0.RTC分为三部分讲解

1.BKP简介

2.BKP基本结构

3.RTC简介

4.RTC框图

RTC主要时钟源

RTC核心,分频器和计数计时部分

中断输出使能和NVIC部分

APB1总线读写部分,读写寄存器通过APB1总线完成

PWR关联部分,RTC的闹钟可以唤醒设备,退出待机模式

5.RTC基本结构

6.硬件电路

7.RTC操作注意事项

8.读写备份寄存器代码

第一步:按图接线到面包板

第二步:复制OLED显示屏代码,只需要实现简单的读写BKP功能

第三步:在主函数,初始化BKP

BKP相关库函数

读写备份寄存器完整代码

9.实时时钟代码

第一步:按图接线到面包板

第二步:复制OLED代码

第三步:RTC模块化,放入System中

第四步:MyRTC模块程序编程,这里的time.h都是以伦敦时间开始计时的,因为这个软件不知道当前在那个时区

LSE无法使用的备选方案,使用LSI

设置时间步骤:

读取时间步骤:

初始化步骤:

RTC相关库函数

第五步:MyRTC头文件声明

第六步:主函数调用

实时时钟完整代码

10.本节相关库函数

 BKP相关库函数

 RTC相关库函数


 

0.RTC分为三部分讲解

第一部分:时间戳,学习RTC时钟前必要的知识点

第二部分:BKP和RTC外设的结构

第三部分:代码实现现象


1.BKP简介

BKP(Backup Registers)备份寄存器

BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位

TAMPER引脚产生的侵入事件将所有备份寄存器内容清除

RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲

存储RTC时钟校准寄存器

用户数据存储容量:20字节(中容量和小容量)/ 84字节(大容量和互联型)


2.BKP基本结构


3.RTC简介

RTC(Real Time Clock)实时时钟

RTC是一个独立的定时器,可为系统提供时钟和日历的功能

RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时

32位的可编程计数器,可对应Unix时间戳的秒计数器

20位的可编程预分频器,可适配不同频率的输入时钟

 

可选择三种RTC时钟源:

HSE时钟除以128(通常为8MHz/128)

LSE振荡器时钟(通常为32.768KHz)

LSI振荡器时钟(40KHz)


4.RTC框图

灰色部分都处于后备区域,在主电源掉电后,可以使用备用电池维持工作

RTC主要时钟源

RTC核心,分频器和计数计时部分

RTC预分频器(由重装载寄存器RTC_PRL和余数寄存器RTC_DIV(自减计数器)组成)进行分频(输入数字+1分频)

计数计时部分,32位可编程计数器RTC_CNT,就是计时最核心的部分,可以看做为Unix时间戳的秒计数器,RTC_ALR闹钟寄存器(32位寄存器),当RTC_ALR(是一个给定值的寄存器)和RTC_CNT相等时,会输出两个信号,一个进入中断,实现中断操作,一个唤醒RTC时钟,退出待机模式,但只能用一次,需要再次输入一个定值才会继续这个功能

中断输出使能和NVIC部分

RTC_Second秒中断,来源CNT输入时钟,开启这个时钟,程序会每秒进一次RTC中断

RTC_Overfilow溢出中断,来源CNT的右边,CNT的32位寄存器计满溢出了,触发一次中断,要2106年才会触发一次

RTC_Alarm闹钟中断,当RTC_ALR(是一个给定值的寄存器)和RTC_CNT相等时触发

中断标志位和中断输出控制:F结尾的是对应的中断标志位,IE结尾的是中断使能,最后3个信号通过一个或门,汇聚到NVIC中断控制器

APB1总线读写部分,读写寄存器通过APB1总线完成

PWR关联部分,RTC的闹钟可以唤醒设备,退出待机模式


5.RTC基本结构


6.硬件电路

为了配合STM32的RTC,外部还是需要有一些电路,备用电池供电、外部低速晶振


7.RTC操作注意事项

执行以下操作将使能对BKP和RTC的访问:

设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟

设置PWR_CR的DBP,使能对BKP和RTC的访问

 

若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器

对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器


8.读写备份寄存器代码

第一步:按图接线到面包板

第二步:复制OLED显示屏代码,只需要实现简单的读写BKP功能

所以步骤:1.初始化;2.写DR;3.读DR。因为这个功能需要实现的功能少,所以不进行函数封装

第三步:在主函数,初始化BKP

步骤:1.设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟;2.设置PWR_CR的DBP,使能对BKP和RTC的访问

BKP相关库函数

恢复缺省配置

配置TAMPER侵入检测功能的。第一个配置TAMPER引脚的有效电平,第二个是否开启侵入检测功能

中断配置,是否开启中断

时钟输出功能配置

设置RTC校准值,写入RTC校准寄存器

写备份寄存器,参数(写入哪个DR里,写入的数据)

读备份寄存器,参数(读哪个DR)

获取标志位、清除标志位、获取中断状态、清除中断挂起位

设置PWR_CR寄存器里的DBP位

读写备份寄存器完整代码


9.实时时钟代码

第一步:按图接线到面包板

第二步:复制OLED代码

第三步:RTC模块化,放入System中

第四步:MyRTC模块程序编程,这里的time.h都是以伦敦时间开始计时的,因为这个软件不知道当前在那个时区

LSE无法使用的备选方案,使用LSI

设置时间步骤:

1.把数组指定的时间,填充到struct tm结构体里;2.使用mktime函数,得到秒数;3.将秒数写入到RTC的CNT中

读取时间步骤:

1.读取CNT的秒数,储存到time_cnt里;2.使用localtime函数,得到日期时间;3.把time_date的日期时间,转移到数组里

初始化步骤:

1.设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟,设置PWR_CR的DBP,使能对BKP和RTC的访问;2.启动RCC时钟,这里使用LSE作为系统时钟;3.配置RTCCLK数据选择器,指定LES为RTCCLK;4.调用等待函数,若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1,再调用等待上一次操作完成的函数,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器;5.配置预分频器,给PRL一个合适的分频值,确保输出的计数器的频率为1Hz;6.配置CNT的值,给RTC一个初始时间,如果需要闹钟配置闹钟值,如果需要中断,配置中断。RTC是自动运行的,不需要RTC_Cmd使能

RTC相关库函数

配置LSE外部低速时钟,启动LSE就调用这个时钟

配置LSI内部低速时钟

RTCCLK配置,这个函数用来选择RTCCLK的时钟源

启动RTCCLK,使能RTCCLK

获取标志位,,因为LSE时钟,不是想启动就能启动的,调用了配置LSE外部低速时钟函数,还需要等待一下标志位,等RCC有个标志位LSERDY置1后,这个LSE时钟才算启动完成

配置中断输出

进入配置模式,对应注意事项的:必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器

退出配置模式,就是把CNF位清零

获取CNT计数器的值,读取时钟

写入CNT计数器的值,设置时间

写入预分频器,这个值会写入预分频器的PRL重装寄存器中

写入闹钟值

读取预分频器中的DIV余数寄存器,获取更细的时间,微秒,毫秒等等

等待上次操作完成,对应注意事项的:对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器

等待同步,对应注意事项的:若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1

获取标志位、清除标志位、获取中断状态、清除中断挂起位

第五步:MyRTC头文件声明

第六步:主函数调用

实时时钟完整代码


10.本节相关库函数

 BKP相关库函数

恢复缺省配置

配置TAMPER侵入检测功能的。第一个配置TAMPER引脚的有效电平,第二个是否开启侵入检测功能

中断配置,是否开启中断

时钟输出功能配置

设置RTC校准值,写入RTC校准寄存器

写备份寄存器,参数(写入哪个DR里,写入的数据)

读备份寄存器,参数(读哪个DR)

获取标志位、清除标志位、获取中断状态、清除中断挂起位

设置PWR_CR寄存器里的DBP位

 RTC相关库函数

配置LSE外部低速时钟,启动LSE就调用这个时钟

配置LSI内部低速时钟

RTCCLK配置,这个函数用来选择RTCCLK的时钟源

启动RTCCLK,使能RTCCLK

获取标志位,,因为LSE时钟,不是想启动就能启动的,调用了配置LSE外部低速时钟函数,还需要等待一下标志位,等RCC有个标志位LSERDY置1后,这个LSE时钟才算启动完成

配置中断输出

进入配置模式,对应注意事项的:必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器

退出配置模式,就是把CNF位清零

获取CNT计数器的值,读取时钟

写入CNT计数器的值,设置时间

写入预分频器,这个值会写入预分频器的PRL重装寄存器中

写入闹钟值

读取预分频器中的DIV余数寄存器,获取更细的时间,微秒,毫秒等等

等待上次操作完成,对应注意事项的:对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器

等待同步,对应注意事项的:若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1

获取标志位、清除标志位、获取中断状态、清除中断挂起位

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐