【STM32】RTC详解

00. 目录

01. RTC概述

实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模式的自动唤醒单元。

两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时(12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。

系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时补偿。

其它 32 位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。

上电复位后,所有 RTC 寄存器都会受到保护,以防止可能的非正常写访问。

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

02. RTC主要特性

RTC 单元的主要特性如下(参见 图 222 : RTC 框图 ):
● 包含亚秒、秒、分钟、小时(12/24 小时制)、星期几、日期、月份和年份的日历。
● 软件可编程的夏令时补偿。
● 两个具有中断功能的可编程闹钟。可通过任意日历字段的组合驱动闹钟。
● 自动唤醒单元,可周期性地生成标志以触发自动唤醒中断。
● 参考时钟检测:可使用更加精确的第二时钟源(50 Hz 或 60 Hz)来提高日历的精确度。
● 利用亚秒级移位特性与外部时钟实现精确同步。
● 可屏蔽中断/事件:
— 闹钟 A
— 闹钟 B
— 唤醒中断
— 时间戳
— 入侵检测
● 数字校准电路(周期性计数器调整)
— 精度为 5 ppm
— 精度为 0.95 ppm,在数秒钟的校准窗口中获得
● 用于事件保存的时间戳功能(1 个事件)
● 入侵检测:
— 2 个带可配置过滤器和内部上拉的入侵事件
● 20 个备份寄存器(80 字节)。发生入侵检测事件时,将复位备份寄存器。

● 复用功能输出 (RTC_OUT),可选择以下两个输出之一:
— RTC_CALIB:512 Hz 或 1 Hz 时钟输出(LSE 频率为 32.768 kHz)。
可通过将 RTC_CR 寄存器中的 COE[23] 位置 1 来使能此输出。该输出可连接到器件 RTC_AF1 功能。
— RTC_ALARM(闹钟 A、闹钟 B 或唤醒)。
可通过配置 RTC_CR 寄存器的 OSEL[1:0] 位选择此输出。该输出可连接到器件RTC_AF1 功能。
● RTC 复用功能输入:
— RTC_TS:时间戳事件检测。该输入可连接到器件 RTC_AF1 和 RTC_AF2 功能。
— RTC_TAMP1:TAMPER1 事件检测。该输入可连接到器件 RTC_AF1 和 RTC_AF2功能。
— RTC_TAMP2:TAMPER2 事件检测。
— RTC_REFIN:参考时钟输入(通常为市电,50 Hz 或 60 Hz)。
在这里插入图片描述

03. RTC部分功能

3.1 时钟和预分频器

RTC 时钟源 (RTCCLK) 通过时钟控制器从 LSE 时钟、LSI 振荡器时钟以及 HSE 时钟三者中选择。有关 RTC 时钟源配置的更多信息,请参见 第 6 节:复位和时钟控制 (RCC)。

可编程的预分频器阶段可生成 1 Hz 的时钟,用于更新日历。为最大程度地降低功耗,预分频器分为 2 个可编程的预分频器(参见 图 222 : RTC 框图 ):
● 一个通过 RTC_PRER 寄存器的 PREDIV_A 位配置的 7 位异步预分频器。
● 一个通过 RTC_PRER 寄存器的 PREDIV_S 位配置的 15 位同步预分频器。

注意: 使用两个预分频器时,推荐将异步预分频器配置为较高的值,以最大程度降低功耗。

要使用频率为 32.768 kHz 的 LSE 获得频率为 1 Hz 的内部时钟 (ck_spre),需要将异步预分频系数设置为 128,并将同步预分频系数设置为 256。分频系数的最小值为 1,最大值为 2 ^22 。这对应于约为 4 MHz 的最大输入频率。f ck_apre 可根据以下公式得出:
在这里插入图片描述

3.2 实时时钟和日历

RTC 日历时间和日期寄存器可通过与 PCLK1(APB1 时钟)同步的影子寄存器来访问。这些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间。

● RTC_SSR 对应于亚秒
● RTC_TR 对应于时间
● RTC_DR 对应于日期

每隔两个 RTCCLK 周期,便将当前日历值复制到影子寄存器,并将 RTC_ISR 寄存器的 RSF位置 1(请参见 第 23.6.4 节 )。在停机和待机模式下不会执行复制操作。退出这两种模式时,影子寄存器会在最长 2 个 RTCCLK 周期后进行更新。

当应用读取日历寄存器时,它会访问影子寄存器的内容。也可以通过将 RTC_CR 寄存器的BYPSHAD 控制位置 1 来直接访问日历寄存器。默认情况下,该位被清零,用户访问影子寄存器。

在 BYPSHAD=0 模式下读取 RTC_SSR、RTC_TR 或 RTC_DR 寄存器时,APB 时钟频率(f APB ) 必须至少为 RTC 时钟频率 (f RTCCLK ) 的 7 倍。影子寄存器通过系统复位来复位。

04. RTC低功耗模式和中断

低功耗模式
在这里插入图片描述

RTC中断

所有 RTC 中断均与 EXTI 控制器相连。

要使能 RTC 闹钟中断,需按照以下顺序操作:

  1. 将 EXTI 线 17 配置为中断模式并将其使能,然后选择上升沿有效。

  2. 配置 NVIC 中的 RTC_Alarm IRQ 通道并将其使能。

  3. 配置 RTC 以生成 RTC 闹钟(闹钟 A 或闹钟 B)。

要使能 RTC 唤醒中断,需按照以下顺序操作:

  1. 将 EXTI 线 22 配置为中断模式并将其使能,然后选择上升沿有效。

  2. 配置 NVIC 中的 RTC_WKUP IRQ 通道并将其使能。

  3. 配置 RTC 以生成 RTC 唤醒定时器事件。

要使能 RTC 入侵中断,需按照以下顺序操作:

  1. 将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。

  2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。

  3. 配置 RTC 以检测 RTC 入侵事件。

要使能 RTC 时间戳中断,需按照以下顺序操作:

  1. 将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。

  2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。

  3. 配置 RTC 以检测 RTC 时间戳事件。
    在这里插入图片描述

05. RTC寄存器

5.1RTC 时间寄存器 (RTC_TR)

RTC time register
RTC_TR 是日历时间影子寄存器。只能在初始化模式下对该寄存器执行写操作。
偏移地址:0x00
上电复位值:0x0000 0000
系统复位:当 BYPSHAD = 0 时为 0x0000 0000;当 BYPSHAD = 1 时不受影响。
在这里插入图片描述

5.2 RTC 日期寄存器 (RTC_DR)

RTC date register
RTC_DR 是日历日期影子寄存器。只能在初始化模式下对该寄存器执行写操作。
偏移地址:0x04
上电复位值:0x0000 2101
系统复位:当 BYPSHAD = 0 时为 0x0000 2101;当 BYPSHAD = 1 时不受影响
在这里插入图片描述

5.3 RTC 控制寄存器 (RTC_CR)

RTC control register
偏移地址:0x08
上电复位值:0x0000 0000
系统复位:不受影响
在这里插入图片描述

位 22:21 OSEL[1:0]:输出选择 (Output selection)
这些位用于选择要连接到 RTC_ALARM 输出的标志
00:禁止输出
01:使能闹钟 A 输出
10:使能闹钟 B 输出
11:使能唤醒输出
位 20 POL:输出极性 (Output polarity)
该位用于配置 RTC_ALARM 输出的极性
0:当 ALRAF/ALRBF/WUTF 置 1 时(取决于 OSEL[1:0]),该引脚为高电平
1:当 ALRAF/ALRBF/WUTF 置 1 时(取决于 OSEL[1:0]),该引脚为低电平
位 19 COSEL:校准输出选择 (Calibration output selection)
当 COE=1 时,该位可选择 RTC_CALIB 上输出的信号。
0:校准输出为 512 Hz
1:校准输出为 1 Hz
在 RTCCLK 为 32.768 kHz 且预分频器为其默认值(PREDIV_A=127 且 PREDIV_S=255)
的条件下,这些频率有效。请参见 第 23.3.14 节:校准时钟输出 。
位 18 BKP:备份 (Backup)
用户可对此位执行写操作以记录是否已对夏令时进行更改。
位 17 SUB1H:减少 1 小时(冬季时间更改)(Subtract 1 hour (winter time change))
当该位在初始化模式以外的模式下置 1 时,如果当前小时不是 0,则日历时间将减少 1 小
时。此位始终读为 0。
当前小时为 0 时,将此位置 1 没有任何作用。
0:无作用。
1:将当前时间减少 1 小时。这可用于冬季时间更改。
位 16 ADD1H:增加 1 小时(夏季时间更改)(Add 1 hour (summer time change))
当该位在初始化模式以外的模式下置 1 时,日历时间将增加 1 小时。此位始终读为 0。
0:无作用。
1:将当前时间增加 1 小时。这可用于夏季时间更改
位 15 TSIE:时间戳中断使能 (Timestamp interrupt enable)
0:禁止时间戳中断
1:使能时间戳中断
位 14 WUTIE:使能唤醒定时器使能 (Wakeup timer interrupt enable)
0:禁止唤醒定时器中断
1:使能唤醒定时器中断
位 13 ALRBIE: 闹钟 B 中断使能 (Alarm B interrupt enable)
0:闹钟 B 中断禁止
1:闹钟 B 中断使能
位 12 ALRAIE:闹钟 A 中断使能 (Alarm A interrupt enable)
0:禁止闹钟 A 中断
1:使能闹钟 A 中断
位 11 TSE:时间戳使能 (Time stamp enable)
0:禁止时间戳
1:使能时间戳
位 10 WUTE:唤醒定时器使能 (Wakeup timer enable)
0:禁止唤醒定时器
1:使能唤醒定时器

位 9 ALRBE: 闹钟 B 使能 (Alarm B enable)
0:禁止闹钟 B
1:使能闹钟 B
位 8 ALRAE :闹钟 A 使能 (Alarm A enable)
0:禁止闹钟 A
1:使能闹钟 A
位 7 DCE :粗略数字校准使能 (Coarse digital calibration enable)
0:禁止数字校准
1:使能数字校准
PREDIV_A 必须大于或等于 6
位 6 FMT:小时格式 (Hour format)
0:24 小时/天格式
1:AM/PM 小时格式
位 5 BYPSHAD:旁路影子寄存器 (Bypass the shadow registers)
0:日历值(从 RTC_SSR、RTC_TR 和 RTC_DR 读取时)取自影子寄存器,该影子寄存器
每两个 RTCCLK 周期更新一次。
1:日历值(从 RTC_SSR、RTC_TR 和 RTC_DR 读取时)直接取自日历计数器。
注意:如果 APB1 时钟的频率低于 7 倍的 RTCCLK 频率,则必须将 BYPSHAD 置“ 1 ”。
位 4 REFCKON:参考时钟检测使能(50 Hz 或 60 Hz)(Reference clock detection enable (50 or
60 Hz))
0:禁止参考时钟检测
1:使能参考时钟检测
注意: PREDIV_S 必须为 0x00FF 。
位 3 TSEDGE:时间戳事件有效边沿 (Timestamp event active edge)
0:TIMESTAMP 上升沿生成时间戳事件
1:TIMESTAMP 下降沿生成时间戳事件
TSEDGE 发生更改时,必须复位 TSE 以避免将 TSF 意外置 1
位 2:0 WUCKSEL[2:0]:唤醒时钟选择 (Wakeup clock selection)
000:选择 RTC/16 时钟
001:选择 RTC/8 时钟
010:选择 RTC/4 时钟
011:选择 RTC/2 时钟
10x:选择 ck_spre 时钟(通常为 1 Hz)
11x:选择 ck_spre 时钟(通常为 1 Hz)并将 WUT 计数器值增加 2 16 (见下面的注释)

温馨提示

WUT = 唤醒单元计数器值。当 WUCKSEL[2:1 = 11] 时, WUT = (0x0000 to 0xFFFF) +0x10000 (增加的值)。
只能在初始化模式下 (RTC_ISR/INITF = 1) 对该寄存器的位 7 、 6 和 4 执行写操作。
只能在 RTC_CR WUTE 位 = 0 且 RTC_ISR WUTWF 位 = 1 时对该寄存器的位 2 到 0 执行写操作。
建议不要在日历小时递增时更改小时,因为这样做会屏蔽日历小时的增量。ADD1H 和 SUB1H 的更改在下一秒生效。
此寄存器受写保护。第 576 页的 RTC 寄存器写保护中介绍了写访问的过程。

5.4 RTC 初始化和状态寄存器 (RTC_ISR)

RTC initialization and status register
偏移地址:0x0C
上电复位值:0x0000 0007
系统复位值:不受影响(INIT、INITF 和 RSF 除外,它们在复位时被清零)。
在这里插入图片描述

位 31:17 保留

位 16 RECALPF:重新校准挂起标志 (Recalibration pending Flag)
当软件对 RTC_CALR 寄存器执行写操作时,RECALPF 状态标志将自动置“1”,指示
RTC_CALR 寄存器已屏蔽。当采用新的校准设置时,该位恢复为“0”。请参见 动态重校准一节。

位 15 保留,必须保持复位值。

位 14 TAMP2F:TAMPER2 检测标志 (TAMPER2 detection flag)
在入侵输入 2 上检测到入侵检测事件时,由硬件将此标志置 1。该标志由软件写零清除。

位 13 TAMP1F:入侵检测标志 (Tamper detection flag)
当检测到入侵检测事件时,由硬件将此标志置 1。
该标志由软件写零清除。

位 12 TSOVF:时间戳溢出标志 (Timestamp overflow flag)
当在 TSF 已置 1 的情况下发生时间戳事件时,由硬件将此标志置 1。
该标志由软件写零清除。建议仅在 TSF 位清零之后再检查并清零 TSOVF 位。否则,如果时
间戳事件恰好在清零 TSF 位之前刚刚发生,则溢出事件可能会被漏掉。

位 11 TSF:时间戳标志 (Timestamp flag)
发生时间戳事件时,由硬件将此标志置 1。
该标志由软件写零清除。

位 10 WUTF:唤醒定时器标志 (Wakeup timer flag)
当唤醒自动重载计数器计数到 0 时,由硬件将此标志置 1。
该标志由软件写零清除。
软件必须在 WUTF 再次置 1 的 1.5 个 RTCCLK 周期之前将该标志清零。

位 9 ALRBF:闹钟 B 标志 (Alarm B flag)
当时间/日期寄存器(RTC_TR 和 RTC_DR)与闹钟 B 寄存器 (RTC_ALRMBR) 匹配时,由
硬件将该标志置 1。
该标志由软件写零清除。

位 8 ALRAF:闹钟 A 标志 (Alarm A flag)
当时间/日期寄存器(RTC_TR 和 RTC_DR)与闹钟 A 寄存器 (RTC_ALRMAR) 匹配时,由
硬件将该标志置 1。
该标志由软件写零清除。

位 7 INIT:初始化模式 (Initialization mode)
0:自由运行模式。
1:初始化模式,用于编程时间和日期寄存器(RTC_TR 和 RTC_DR)以及预分频器寄存器
(RTC_PRER)。计数器停止计数,当 INIT 被复位后,计数器从新值开始计数。

位 6 INITF:初始化标志 (Initialization flag)
当此位置 1 时,RTC 处于初始化状态,此时可更新事件、日期和预分频器寄存器。
0:不允许更新日历寄存器。
1:允许更新日历寄存器。

位 5 RSF:寄存器同步标志 (Registers synchronization flag)
每次将日历寄存器的值复制到影子寄存器(RTC_SSRx、RTC_TRx 和 RTC_DRx)时,都
会由硬件将此位置 1。在初始化模式下、平移操作挂起时 (SHPF=1) 或在旁路影子寄存器模
式 (BYPSHAD=1) 下,该位由硬件清零。该位还可由软件清零。
0:日历影子寄存器尚未同步
1:日历影子寄存器已同步

位 4 INITS:初始化状态标志 (Initialization status flag)
当日历年份字段不为 0 时(上电复位状态),由硬件将该位置 1。
0:日历尚未初始化
1:日历已经初始化

位 3 SHPF:平移操作挂起 (Shift operation pending)
0:没有平移操作挂起
1:某个平移操作挂起
只要通过对 RTC_SHIFTR 寄存器执行写操作来启动平移操作,此标志便由硬件置 1。执行完
相应的平移操作后,此标志由硬件清零。对 SHPF 执行写入操作不起作用。

位 2 WUTWF:唤醒定时器写标志 (Wakeup timer write flag)
在 RTC_CR 寄存器中的 WUTE 位置 0 后,当唤醒定时器值可更改时,由硬件将该位置 1。
0:不允许更新唤醒定时器配置
1:允许更新唤醒定时器配置

位 1 ALRBWF:闹钟 B 写标志 (Alarm B write flag)
在 RTC_CR 寄存器中的 ALRBIE 位置 0 之后,当闹钟 B 的值可更改时,由硬件将该位置 1。
该位在初始化模式下由硬件清零。
0:不允许更新闹钟 B
1:允许更新闹钟 B

位 0 ALRAWF:闹钟 A 写标志 (Alarm A write flag)
在 RTC_CR 寄存器中的 ALRAE 位置 0 后,当闹钟 A 的值可更改时,由硬件将该位置 1。
该位在初始化模式下由硬件清零。
0:不允许更新闹钟 A
1:允许更新闹钟 A

5.5 RTC 预分频器寄存器 (RTC_PRER)

RTC prescaler register
偏移地址:0x10
上电复位值:0x007F 00FF
系统复位:不受影响
在这里插入图片描述

5.6 RTC 唤醒定时器寄存器 (RTC_WUTR)

RTC wakeup timer register
偏移地址:0x14
上电复位值:0x0000 FFFF
系统复位:不受影响
在这里插入图片描述

位 31:16 保留

位 15:0 WUT[15:0]:唤醒自动重载值位 (Wakeup auto-reload value bit)
当使能唤醒定时器时(WUTE 置 1),每 (WUT[15:0] + 1) 个 ck_wut 周期将 WUTF 标志置 1一次。ck_wut 周期通过 RTC_CR 寄存器的 WUCKSEL[2:0] 位进行选择。
当 WUCKSEL[2] = 1 时,唤醒定时器变为 17 位,WUCKSEL[1] 等效为 WUT[16],即要重载到定时器的最高有效位。

注意: WUTF 第一次置 1 发生在 WUTE 置 1 之后 (WUT+1) 个 ck_wut 周期。禁止在
WUCKSEL[2:0]=011(RTCCLK/2) 时将 WUT[15:0] 设置为 0x0000 。

5.7 RTC 校准寄存器 (RTC_CALIBR)

RTC calibration register
偏移地址:0x18
上电复位值:0x0000 0000
系统复位:不受影响
在这里插入图片描述

5.8 RTC 闹钟 A 寄存器 (RTC_ALRMAR)

RTC alarm A register
偏移地址:0x1C
上电复位值:0x0000 0000
系统复位:不受影响
在这里插入图片描述

位 31 MSK4:闹钟 A 日期掩码 (Alarm A date mask)
0:如果日期/日匹配,则闹钟 A 置 1
1:在闹钟 A 比较中,日期/日无关

位 30 WDSEL:星期几选择 (Week day selection)
0:DU[3:0] 代表日期的个位
1:DU[3:0] 代表星期几。DT[1:0] 为无关位。

位 29:28 DT[1:0]:日期的十位(BCD 格式)(Date tens in BCD format)。

位 27:24 DU[3:0]:日期的个位或日(BCD 格式)(Date units or day in BCD format)。

位 23 MSK3:闹钟 A 小时掩码 (Alarm A hours mask)
0:如果小时匹配,则闹钟 A 置 1
1:在闹钟 A 比较中,小时无关

位 22 PM :AM/PM 符号 (AM/PM notation)
0:AM 或 24 小时制
1:PM

位 21:20 HT[1:0]:小时的十位(BCD 格式)(Hour tens in BCD format)。

位 19:16 HU[3:0]:小时的个位(BCD 格式)(Hour units in BCD format)。

位 15 MSK2:闹钟 A 分钟掩码 (Alarm A minutes mask)
0:如果分钟匹配,则闹钟 A 置 1
1:在闹钟 A 比较中,分钟无关

位 14:12 MNT[2:0]:分钟的十位(BCD 格式)(Minute tens in BCD format)。

位 11:8 MNU[3:0]:分钟的个位(BCD 格式)(Minute units in BCD format)。

位 7 MSK1:闹钟 A 秒掩码 (Alarm A seconds mask)
0:如果秒匹配,则闹钟 A 置 1

1:在闹钟 A 比较中,秒无关

位 6:4 ST[2:0]:秒的十位(BCD 格式)(Second tens in BCD format)。
位 3:0 SU[3:0]:秒的个位(BCD 格式)(Second units in BCD format)。

5.9 RTC 写保护寄存器 (RTC_WPR)

RTC write protection register
偏移地址:0x24
复位值:0x0000 0000
在这里插入图片描述

5.10 RTC 亚秒寄存器 (RTC_SSR)

RTC sub second register
偏移地址:0x28
上电复位值:0x0000 0000
系统复位:当 BYPSHAD = 0 时为 0x0000 0000;当 BYPSHAD = 1 时不受影响。
在这里插入图片描述

5.11 RTC 时间戳时间寄存器 (RTC_TSTR)

RTC time stamp time register
偏移地址:0x30
上电复位值:0x0000 0000
系统复位:不受影响
在这里插入图片描述

5.12 RTC 备份寄存器 (RTC_BKPxR)

RTC backup registers
偏移地址:0x50 到 0x9C
上电复位值:0x0000 0000
系统复位:不受影响
在这里插入图片描述

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 声明

猜你喜欢

转载自blog.csdn.net/dengjin20104042056/article/details/108465460