STM32 RTC实时时钟

发布于:2024-09-18 ⋅ 阅读:(131) ⋅ 点赞:(0)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

RTC实时时钟
BKP可以在VBAT维持供电时,完成主电源掉电时,保存少量数据的任务。备份寄存器和VBAT引脚同时存在,更多是为了服务RTC的。

目前,Linux、Windows、安卓这些系统,底层的计时系统都是使用的Unix时间戳,Unix Timestamp,
只计秒的好处:简化硬件电路,不用考虑年月日寄存器、仅为
时间间隔计算很方便
存储方便
但是比较占用软件资源,需要转换位年月日
2038年32的计时系统可能会出问题。

UTC的闰秒机制可能导致一分钟出现61秒的情况,

BKP会读写相关寄存器就行,RTC需要重点掌握,TAMPER引脚是一个安全保障设计,防拆功能,如果BKP里存储了一些敏感数据,可以使用TAMPER的侵入检测功能,先加一个默认的上拉和下拉电阻,到设备外壳的防拆开关和触点。在TAMPER产生下降沿或上升沿,STM32检测到侵入时间了,BKP数据自动清空并申请中断,在中断里,还可以继续保护设备,比如清楚其他存储器数据,然后设备锁死。

后备区域不只有BKP,还有RTC的相关电路,STM32后备区域特点,当VDD主电源掉电时,后备区域可由VBAT备用电池供电。
BKP主要由数据寄存器(主要部分用来存储数据,每个数据16位,1个数据寄存器存储两个字节)、状态寄存器、控制寄存器和RTC时钟校准寄存器(当输出校准时钟时,再配合校准寄存器,可以对RTC的误差进行校准(如何实现的?))

DS1302备用电池、RTC晶振
32位可编程计数器,就对应时间戳里的秒计数器。
读取时间,使用time.h模块里的localtime函数;写入时间,先填充年月日时分秒信息到struct.time结构体,然后用mktime函数,得到秒数,再写入到32位计数器即可。得益于时间戳的设计,硬件电路得到了极大的简化。
1s自增一次,所以驱动计数器的时钟,需要一个1Hz的信号,但实际提供给RTC模块的时钟RTCLCLK,一般频率都比较高,所以加纷纷你聘妻降频,可以选择对输入时钟进行1到2的20次方这么大范围分频
32.768KHz是晶振工艺比较合适的频率,1Hz晶振可能做不来,或者都做出来了,但体积很大,性能很差,另一方面2的15次方等于32768,经过15位分频器的自然溢出,就能得到1Hz的频率,自然溢出的意思是设计一个15位的计数器,不用设置技术目标,直接从0到最大值,就是计到32767

RTC框图:左边一块是核心的,分频和技术计时部分,右边是中断输出使能和NVIC部分,上面一块是APB1总线读写部分,下面这一块和PWR关联的部分,意思是RTC的闹钟可以唤醒设备,退出待机模式。

灰色填充的部分都处于后备区域,可以用VBAT供电维持,未被填充的待机不供电,有关睡眠,待机,停机,低功耗的内容在PWR里。

RTC分频器由两个寄存器组成,上面是重装寄存器RTC_PRL,下面是余数寄存器RTC_DIV(是余数吗?),实际上,和之前定时器时基单元里的计数器CNT和重装值ARR是一样的作用,所以对于可编程的分频器来说,需要两个寄存器,一个寄存器不断的计数,另一个寄存器写入一个技术目标值,用来配置是几分频,
上面的PRL,就是计数目标,写入6就是7分频,因为计数值包含了0;几+1分频,下面的DIV,就是每来一个时钟计一个数的用途,当然这个DIV计数器,是一个自减计数器。每来一个输入时钟,DIV的值自减一次,减到0时,再来一个输入时钟,DIV输出一个脉冲,产生溢出信号,同时DIV从PRL获取重装值,回到重装值继续自减。
RTC_ALR 闹钟,如果与RTC_CNT相等,就会有闹钟,闹钟信号可以让STM32退出待机模式,这个功能就可以对应一些用途,比如设计一个数据采集设备,需要在环境恶劣的地方工作,要求每天中午12点采集一次环境数据,其他时间为了节省电量,避免频繁更换电池,芯片必须处于待机模式,就可以用RTC自带的闹钟功能。
闹钟响起 采集 再待机
每次闹钟响后,都需要再设置一下 下一个闹钟时间,有3个信号可以触发中断,秒中断,溢出中断,闹钟中断,RTC_CR是中断标志位和中断输出控制,这些F(Flag)结尾的是对应的中断标志位,IE(Interrupt Enable)结尾的是中断使能,通过一个或门汇聚到NVIC中断控制器,读写寄存器,可以通过APB1总线来完成。
WeakUp引脚,闹钟信号,都可以唤醒设备,

RTC的章节的参考手册和数据手册可以细看一下,内容不多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这些函数是用于配置TAMPER侵入检测功能的
BKP_TamperPinLevelConfig ,可以配置TAMPER引脚的有效电平,
BKP_TamperPinCmd ,就是是否开启侵入检测功能,
那就先配置TAMPER有效电平,再使能侵入检测功能,
BKP_ITConfig 中断配置
BKP_RTCOutputConfig 时钟输出功能的配置 可以选择在RTC引脚输出时钟信号,输出RTC校准时钟,RTC闹钟脉冲或者秒脉冲
BKP_SetRTCCalibrationValue 其实就是写入RTC校准寄存器
这些是BKP附加的一些小功能,了解即可
下面才是重点:
BKP_WriteBackupRegister 写备份寄存器
BKP_ReadBackupRegister 读备份寄存器
下面四个是老朋友,不用解释。

PWR_BackupAccessCmd 备份寄存器访问使能,就是设置PWR_CR寄存器里的DBP位,

代码:1.开启PWR和BKP时钟,外设时钟控制,开启PWR时钟,读取BKP

LSE需要手动开启,不然用不了,

进入睡眠的目的是:如果STM32一直没有收到数据,那这个主循环也会一直查询标志位,,这是无意义的耗电操作,不如让它睡眠

收到数据后,自动推出睡眠模式。执行一遍任务后,继续睡眠,这样在空闲时,芯片一直再睡眠,可以降低系统功耗。在睡眠模式是无法直接下载程序的,按住复位键不放,再松开能很好的下载程序,


网站公告

今日签到

点亮在社区的每一天
去签到