【STM32】RTC实时时钟

发布时间:2024年01月06日

1?unix时间戳

Unix 时间戳(Unix Timestamp)定义为从UTC/GMT197011000秒开始所经过的秒数,不考虑闰秒

时间戳存储在一个秒计数器中,秒计数器为32/64位的整型变量

世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间

(1)简化硬件电路;(2)方便计算时间间隔;(3)存储方便。

(1)占用软件资源;

时间戳工具:时间戳(Unix timestamp)转换工具 - 在线工具

1.1?UTC/GMT

GMT(Greenwich Mean Time格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准

UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致

1.2?时间戳转换

C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换

函数

作用

time_t time(time_t*);

获取系统时钟

struct tm* gmtime(const time_t*);

秒计数器转换为日期时间(格林尼治时间

struct tm* localtime(const time_t*);

秒计数器转换为日期时间(当地时间)

time_t mktime(struct tm*);

日期时间转换为秒计数器(当地时间

char* ctime(const time_t*);

秒计数器转换为字符串(默认格式)

char* asctime(const struct tm*);

日期时间转换为字符串(默认格式)

size_t strftime(char*, size_t, const char*, const struct tm*);

日期时间转换为字符串(自定义格式)

2?BKP简介

BKP(Backup Registers)备份寄存器

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

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

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

存储RTC时钟校准寄存器

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

2.1?BKP基本结构

后备区域:主电源断电时,仍然可以由VBAT的备用电池供电。当主电源上电时,后备区域的供电会由VBAT切换到VDD。

BKP主要有数据寄存器、控制寄存器、状态寄存器、RTC时钟校准寄存器。数据寄存器用来存储数据,每个数据寄存器16位;小容量10个寄存器(一个寄存器存两个字节,加起来就是20个字节)。

还有侵入检测、时钟输出等(公用一个引脚)

3?RTC简介

RTC(Real Time Clock)实时时钟

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

RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD2.0~3.6V)断电后可借助VBAT1.8~3.6V)供电继续走时(和BKP一样)

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

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

可选择三种RTC时钟源:

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

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

? LSI振荡器时钟(40KHz

HSE=高速外部时钟信号

HSl =高速内部时钟信号

LSl =低速内部时钟信号

LSE=低速外部时钟信号

高速时钟一般供内部程序运行和主要外设使用;

低速时钟一般供RTC、看门狗使用。

32.768KHz一般是提供给RTC的

只有中间的LSE可以通过备用电池供电。

3.1?RTC框图

左边是核心的、分频和计数计时部分;右边是中断输出使能和NVIC部分;上面是APB1总线读写部分;下面是和PWR相关的部分。图中灰色填充都处于后备区域。

首先看分频和计数计时部分。输入时钟是RTCCLK(可以选择上述三种,主要选择LSE振荡器时钟),进来的频率需要进行RTC预分频器进行分频;上面是重装载寄存器RTC_PRL,下面是余数寄存器RTC_DIV(和计数器那章的计数器CNT,重装值ARR一样的作用),PRL是计数目标(写入6就是7分频),下面的DIV就是每来一个时钟机一个数的作用了,不同的是DIV是自减计数器。

计数计数部分:32位可编程计数器RTC_CNT是核心部分,RTC_ALR闹钟计数器。两者一样时,闹钟响了,产生RTC_Alarm闹钟信号,通往右边的中断系统;闹钟还可以将STM32从待机模式唤醒。闹钟值是定值,只能响一次,下次想使用就得重新设置。

右侧是中断部分,有三个信号可以触发中断:RTC_SEcond秒中断(来源是CNT的输入时钟);RTC_Overflow溢出中断(来源是CNT的右边,CNT计满溢出了会触发一次中断);RTC_Alarm闹钟中断(计数器和闹钟值相等时,触发中断,可以把设备从待机模式唤醒)。F(Flag)结尾的是中断标志位,IE(Interrupt Enable)结尾的是中断使能,三个信号通过或门进入NVIC中断控制器。

最后下面退出待机模式,还有WKUP(Weak Up)引脚,闹钟信号和WKUP信号都可以唤醒设备。

3.2?RTC基本结构

左边是RTCCLK时钟来源,这里需要在RCC里面配置,三选一。之后RTCCLK通过预分频器对时钟进行分频;余数寄存器是一个自减计数器,存储当前的计数值;重装寄存器是计数目标,决定分频值,分频之后得到1Hz的秒计数信号,通向32位计数器CNT,一秒自增一次,下面的32位闹钟值可以设置闹钟;右边有3个信号可以触发中断,分别是秒信号、计数溢出信号、闹钟信号,三个信号通过中断输出控制,进行中断使能,使能的中断才可以通向NVIC,然后向CPU申请中断。

配置数据选择器可以配置时钟来源;配置重装寄存器可以选择分频系数;配置32位计数器可以进行日期时间的读写;需要闹钟的话,配置32位闹钟即可;需要中断先允许中断,再配置NVIC,最后写对应的中断函数即可。

3.3?硬件电路

备用电池供电(推荐连接)、外部低速晶振

3.4?RTC操作注意事项

执行以下操作将使能对BKPRTC的访问:

? ? ??设置RCC_APB1ENRPWRENBKPEN,使能PWRBKP时钟

? ? ??设置PWR_CRDBP,使能对BKPRTC的访问

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

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

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

手册

文章来源:https://blog.csdn.net/Zhouzi_heng/article/details/135421774
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。