目录
一、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 便不会停止工作。