带你了解STM32:RTC实时时钟(第二、三部分)
带你了解STM32的RTC实时时钟,第二、三部分
目录
第二步:复制OLED显示屏代码,只需要实现简单的读写BKP功能
第四步:MyRTC模块程序编程,这里的time.h都是以伦敦时间开始计时的,因为这个软件不知道当前在那个时区
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
获取标志位、清除标志位、获取中断状态、清除中断挂起位
更多推荐



































所有评论(0)