RTC时钟

目录

一、STM32F407内部RTC硬件框图,主要由五大部分组成:

二、硬件相关引脚

三、具体代码设置步骤

四、了解其它知识点


一、STM32F407内部RTC硬件框图,主要由五大部分组成:

① 时钟源

(1)LSE:一般我们选择 LSE,即外部 32.768KHz 晶振作为时钟源(RTCCLK)。外部晶振具有精度高的优点。

(2)HSE:分频后的 HSE 可以作为备选使用的时钟源。

(3)****LSI:****LSI 是 STM32 芯片内部的低速 RC 振荡器,频率约 32 KHz,缺点是精度较低,一般不使用。

② 预分频器

预分配器(RTC_PRER)分为 2 个部分:一个通过 RTC_PRER 寄存器的 PREDIV_A 位配置的 7 位异步预分频器。另一个通过 RTC_PRER 寄存器的 PREDIV_S 位配置的 15 位同步预分频器。 于是我们只需要设置: PREDIV_A=0X7F,即 128 分频;PREDIV_S=0XFF,即 256 分频,即可得到 1Hz(1秒) 的 Fck_spre,用于更新日历。

③ 时间和日期相关寄存器

该部分包括三个影子寄存器, RTC_SSR (亚秒)、 RTC_TR (时间)、 RTC_DR(日期)。实时时钟一般表示为:时/分/秒/亚秒。RTC_TR 寄存器用于存储时/分/秒时间数据,可读可写(即可设置或者获取时间)。RTC_DR 寄存器用于存储日期数据,包括年/月/日/星期,可读可写(即可设置或者获取日期)。RTC_SSR 寄存器用于存储亚秒级的时间,这样我们可以获取更加精确的时间数据。

不过需要注意的是:时间和日期都是以 BCD 码的格式存储的,读出来要转换一下,才可以得到十进制的数据。

亚秒的实现:当影子RTC_SSR 寄存器递减到 0 的时候,会使用 PREDIV_S 的值重新装载 PREDIV_S,而PREDIV_S 一般为 255;++++而影子++++ ++++RTC_SSR++++ ++++寄存器递减++++ ++++的++++ ++++频率为前面7位异步分频器分频出来的频率为256Hz++++。这样,我们得到亚秒时间的精度是: 1/256 秒,即 3.9ms 左右。

④ 可编程闹钟

STM32F407 提供两个可编程闹钟:闹钟 A(ALARM_A)和闹钟 B(ALARM_B)。通过RTC_CR 寄存器的 ALRAE 和 ALRBE 位置 1 来使能闹钟。当亚秒、秒、分、小时、日期分别与闹钟寄存器 RTC_ALRMASSR/RTC_ALRMAR 和 RTC_ALRMBSSR/RTC_ALRMBR 中的值匹配时,则可以产生闹钟(需要适当配置)。本章我们将利用闹钟 A 产生闹铃,即设置RTC_ALRMASSR 和 RTC_ALRMAR 即可。

⑤ 周期性自动唤醒

STM32F407 的 RTC 不带秒钟中断了,但是多了++++一个周期性自动唤醒功能++++。周期性唤醒功能,由一个 16 位可编程自动重载递减计数器(RTC_WUTR)生成,可用于周期性中断/唤醒。

二、硬件相关引脚

(1)LSE时钟(32.768kHz)

PC14 和 PC15 可用作 GPIO 或 LSE 引脚

(2) VBAT要有电压:1.65V~3.6V

(3) RTC其它相关引脚:PC13 可用作 GPIO 或 RTC_AF1 引脚,PI8 可用作 RTC_AF2

三、具体代码设置步骤

1、初始化 RTC

(1) 在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保护;

(2) 初始化日期格式(HourFormat);RTC_PRER异步(AsynchPrediv = 0x7F)和同步寄存器(SynchPrediv = 0xFF);OutPut 用来选择要连接到 RTC_ALARM 输出的标志;OutPutPolarity 用来设置 RTC_ALARM 的输出极性,与 Output 成员变量配合使用;OutPutType 用来设置 RTC_ALARM 的输出类型为开漏输出还是推挽输出,与成员变量 OutPut 和 OutPutPolarity 配合使用。

(3) 读出bkr(0)寄存器的值,判断是否被修改过,如果修改过,说明电池有重新上电,要重新设置时间和日期。

2、配置WAKE UP中断,1秒钟中断一次:

3、获取时间和日期

四、了解其它知识点

1、BKP的作用

当Vdd关闭时,这些寄存器由VBAT供电,因而系统复位时,这些寄存器不会复位,并且当器件在低功耗模式下工作时,寄存器的内容仍然有效。可以理解为,只有后备电池不掉电,备份寄存器的都不会恢复默认值;用于判断电池是否掉过电,如果掉过电,需要重新设定时间。

常用,例如,RTC程序中,我们向DR1写入0x5050,开机读出寄存器值看是否有改变,检测是否已经配置过RTC,如果不是写入的值,说明电池有掉过电,需要重新设定时间和日期。

2、有些芯片自带的RTC,会是有整个完整日历相关的寄存器(如GD32F407VET6);而有些只有一个秒计时器,需要软件自己去做日历(如GD32F303VE);

3、无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内, RTC 便不会停止工作。

相关推荐
温柔的男孩像海洋丶5 分钟前
vscode的keil assistant 中搜索不到全局变量
ide·vscode·单片机
沐欣工作室_lvyiyi20 分钟前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
鸿喵小仙女1 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510791 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板
m0_748240912 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件
Cchengzu4 小时前
阿里巴巴2017实习生笔试题(二)
stm32·单片机·嵌入式硬件
重生之我是数学王子8 小时前
单片机 STM32入门
stm32·单片机·嵌入式硬件
qq_4597300311 小时前
4-3 MCU中ARM存储器的作用
arm开发·单片机·嵌入式硬件
重生之我是数学王子14 小时前
点亮核心板小灯 STM32U575
stm32·单片机·嵌入式硬件
end_SJ14 小时前
初学stm32 --- 定时器中断
stm32·单片机·嵌入式硬件