注意:相关RTC基础知识这里不提!

该库头文件引用:

#include <RTClock.h>
 
该库所在Arduino位置:
关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

初始化RTC相关时钟

Arduino版的库里初始化配置PWR时钟、初始化配置备份寄存器时钟、复位备份寄存器(RTC时钟需要用到备份寄存器相关东西)

关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

官方老标准库里也是一样的:

设置寄存器RCC_APB1ENR的PWREN和BKPEN位打开电源和后备时钟。

使能写备份寄存器

在Arduino版库里,写备份寄存器使能是操作电源相关里的CR寄存器的DBP位置1

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

在老版标准库里也是这样。

电源后备寄存器(PWR_CR)的DBP位使能对后备寄存器和RTC的访问。

失能写备份寄存器

那么不难理解,失能写备份寄存器,就是将DBP位置0了。

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

设置RTC时钟

库代码截图里可以看到,如果不写入参数,那么就默认使用 RTClock(RTCSEL_HSE); 外部高速时钟来作为RTC时钟源。

我的代码中,选择了LSE,也就是外部低速时钟来作为时钟源。

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

rtc_init();函数里实现了设置和打开相应时钟。

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

写入RTC时间

time_t 类型就是 unsigned long类型。

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

追踪rtc_set_count();函数:

该函数所在文件:

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

等待最近一次RTC寄存器同步完成

等待最近一次对RTC写操作完成

RTC进入配置模式的源码:

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

等待写操作完成,配置RTC的CRL寄存器的CNF位。

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

 因为红线的话,所以上面的rtc_set_count函数才会有进入配置模式和退出配置模式的配套语句。

读出RTC时间

源码如下:

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

定位到rtc_get_count();函数:

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

很简单,就是把RTC计数寄存器的值读出来合并返回。

创建RTC闹钟中断

RTC有几种闹钟,一种是秒闹钟,每过一秒进入一次;一种就是对于时间的对比的闹钟,到了时间点就产生一次闹钟。

下面是设置时间对比的闹钟源码:

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

追踪到rtc_set_alarm()函数:

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

 前三句话和配置模式老生常谈。

后面是设置闹钟寄存器的值。

下面追踪到rtc_attach_interrupt函数:

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

使能闹钟中断,switch里是第四个case。再使能闹钟优先级。

设置RTC闹钟时间

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

顾名思义,可以修改RTC的闹钟时间。注意:该函数是修改,并不会创建闹钟中断。

解除RTC闹钟中断

 关于在Arduino下STM32编程——RTC函数解析-风君雪科技博客

失能RTC闹钟中断,并将中断处理函数给注销。