1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > STM32:RTC实时时钟原理

STM32:RTC实时时钟原理

时间:2021-07-15 04:21:57

相关推荐

STM32:RTC实时时钟原理

RTC (Real Time Clock):实时时钟RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。 两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以提供二进制的亚秒值。 系统可以自动将月份的天数补偿为28,29(闰年),30,31天。并且还可以进行夏令时补偿。 其他32位寄存器还包含可编程的闹钟亚秒,秒,分钟,小时,星期几和日期。 此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。 上电复位后,所有的RTC寄存器都会受到保护,以防止可能的非正常写访问。 RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消后备区域写保护。

RTC工作原理

1,时钟和分频

STM32F4 的 RTC 时钟源(RTCCLK)通过时 钟控制器,可以从 LSE 时钟、LSI 时钟以及 HSE 时钟三者中选择(通过 RCC_BDCR 寄存器选择)。一般选择 LSE,即外部 32.768Khz 晶振作为时钟源(RTCCLK),而 RTC 时钟核心,要求提供 1Hz 的时钟,所以,要设置 RTC 的可编程预分配器。STM32F4 的可编程预分配器 (RTC_PRER)分为 2 个部分:

1, 一个通过 RTC_PRER 寄存器的 PREDIV_A 位配置的 7 位异步预分频器。

2, 一个通过 RTC_PRER 寄存器的 PREDIV_S 位配置的 15 位同步预分频器。

ck_spre 的时钟可由如下计算公式计算: Fck_spre=Frtcclk/[(PREDIV_S+1)*( PREDIV_A+1)] 其中,Fck_spre 即可用于更新日历时间等信息。PREDIV_A 和 PREDIV_S 为 RTC 的异步 和同步分频器。且推荐设置 7 位异步预分频器(PREDIV_A)的值较大,以最大程度降低功耗。 要设置为 32768 分频,只需要设置:PREDIV_A=0X7F,即 128 分频;PREDIV_S=0XFF, 即 256 分频,即可得到 1Hz 的 Fck_spre。 另外ck_apre 可作为 RTC 亚秒递减计数器(RTC_SSR)的时钟,Fck_apre 的计算公式如下: Fck_apre=Frtcclk/( PREDIV_A+1) 当 RTC_SSR 寄存器递减到 0 的时候,会使用 PREDIV_S 的值重新装载 PREDIV_S。而 PREDIV_S 一般为 255,得到亚秒时间的精度是:1/256 秒,即 3.9ms 左右,有了这 个亚秒寄存器 RTC_SSR,就可以得到更加精确的时间数据。

2,日历时间(RTC_TR)和日期(RTC_DR)寄存器

STM32F4 的 RTC 日历时间(RTC_TR)和日期(RTC_DR)寄存器,用于存储时间和日期 (也可以用于设置时间和日期),可以通过与 PCLK1(APB1 时钟)同步的影子寄存器来访问, 这些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间。 每隔 2 个 RTCCLK 周期,当前日历值便会复制到影子寄存器,并置位 RTC_ISR 寄存器的 RSF 位。我们可以读取 RTC_TR 和 RTC_DR 来得到当前时间和日期信息,不过需要注意的是: 时间和日期都是以 BCD 码的格式存储的,读出来要转换一下,才可以得到十进制的数据。

3,可编程闹钟

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

4,周期性自动唤醒

STM32F4 的 RTC 不带秒钟中断了,但是多了一个周期性自动唤醒功能。周期性唤醒功能, 由一个 16 位可编程自动重载递减计数器(RTC_WUTR)生成,可用于周期性中断/唤醒。可以通过 RTC_CR 寄存器中的 WUTE 位设置使能此唤醒功能。 唤醒定时器的时钟输入可以是:2、4、8 或 16 分频的 RTC 时钟(RTCCLK),也可以是 ck_spre 时钟(一般为 1Hz)。 当选择 RTCCLK(假定 LSE 是:32.768 kHz)作为输入时钟时,可配置的唤醒中断周期介于 122us(因为 RTCCLK/2 时,RTC_WUTR 不能设置为 0)和 32 s 之间,分辨率最低为:61us。 当选择 ck_spre(1Hz)作为输入时钟时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1秒。并且这个 1s~36h 的可编程时间范围分为两部分: 当 WUCKSEL[2:1]=10 时为:1s 到 18h。 当 WUCKSEL[2:1]=11 时约为:18h 到 36h。 在后一种情况下,会将 2^16 添加到 16 位计数器当前值(即扩展到 17 位,相当于最高位用 WUCKSEL [1]代替)。 初始化完成后,定时器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使 用其重载值(RTC_WUTR 寄存器值)动重载,之后必须用软件清零 WUTF 标志。 通过将 RTC_CR 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,可以使 STM32F4 退出低功耗模式。系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响, 它仍然可以正常工作,故唤醒定时器,可以用于周期性唤醒 STM32F4。

RTC BKP备份寄存器

一共有20个32位备份寄存器。常用来保存一些系统配置信息和相关标志位。

RTC 时间寄存器:RTC_TR

这个寄存器比较简单,注意数据保存是 BCD 格式的,读取之后需要稍加转换,才是十进制的时分秒等数据,在初始化模式下,对该寄存器进行写操作,可以设置时间。

RTC 日期寄存器:RTC_DR

该寄存器的的数据采用 BCD 码格式。同样,在初始化模式下,对该寄存器进行写操作,可以设置日期。

BCD码:亦称二进码十进数。用4位二进制数来表示1位十进制数中的0~9这10个数码。

RTC 亚秒寄存器:RTC_SSR

该寄存器可用于获取更加精确的 RTC 时间。

RTC 控制寄存器:RTC_CR

WUTIE,ALRAIE 是唤醒定时器中断和闹钟 A 中断使能位,设置为 1 即可。WUTE 和 ALRAE,则是唤醒定 时器和闹钟 A 定时器使能位,同样设置为 1,开启。FMT 为小时格式选择位,设置为 0, 选择 24 小时制。最后 WUCKSEL[2:0],用于唤醒时钟选择。

RTC 初始化和状态寄存器:RTC_ISR

该寄存器中,WUTF、ALRBF 和 ALRAF,分别是唤醒定时器闹钟 B 和闹钟 A 的中断标志位,当对应事件产生时,这些标志位被置 1,如果设置了中断,则会进入中断服务函数,这些位通过软件写 0 清除;INIT 为初始化模式控制位,要初始化 RTC 时,必须先设置 INIT=1;INITF 为初始化标志位,当设置 INIT 为 1 以后,要等待 INITF 为 1,才可以更新时间、日期和预分频 寄存器等;RSF 位为寄存器同步标志,仅在该位为 1 时,表示日历影子寄存器已同步,可以正确读取 RTC_TR/RTC_TR 寄存器的值了;WUTWF、ALRBWF 和 ALRAWF 分别是唤醒定时器、 闹钟 B 和闹钟 A 的写标志,只有在这些位为 1 的时候,才可以更新对应的内容,比如:要设置 闹钟 A 的 ALRMAR 和 ALRMASSR,则必须先等待 ALRAWF 为 1,才可以设置。

RTC 预分频寄存器:RTC_PRER

该寄存器用于 RTC 的分频。该寄存器的配置,必须在初始化模式(INITF=1)下,才可以进行。

RTC 唤醒定时器寄存器:RTC_WUTR

该寄存器用于设置自动唤醒重装载值,可用于设置唤醒周期。该寄存器的配置,必须等待 RTC_ISR 的 WUTWF 为 1 才可以进行。

RTC 闹钟 A 器寄存器:RTC_ALRMAR

该寄存器用于设置闹铃 A,当 WDSEL 选择 1 时,使用星期制闹铃,该寄存器的配置,必须等待 RTC_ISR 的 ALRAWF 为 1 才可以进行。

RTC 写保护寄存器:RTC_WPR

该寄存器比较简单,低八位有效。上电后,所有 RTC 寄存器都受到写保护(RTC_ISR[13:8]、RTC_TAFCR 和 RTC_BKPxR 除外),必须依次 写入:0XCA、0X53 两关键字到 RTC_WPR 寄存器,才可以解锁。写一个错误的关键字将再次 激活 RTC 的寄存器写保护。

RTC 备份寄存器:RTC_BKPxR

该寄存器组总共有 20 个,每个寄存器是 32 位的,可以存储 80 个字节的用户数据,这些寄存器在备份域中实现,可在 VDD 电 源关闭时通过 VBAT 保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在 MCU 从待机模式唤醒时复位。 复位后,对 RTC 和 RTC 备份寄存器的写访问被禁止,执行以下操作可以使能对 RTC 及RTC 备份寄存器的写访问:

1)通过设置寄存器 RCC_APB1ENR 的 PWREN 位来打开电源接口时钟

2)电源控制寄存器(PWR_CR)的 DBP 位来使能对 RTC 及 RTC 备份寄存器的访问。

可以用 BKP 来存储一些重要的数据,相当于一个 EEPROM,不过这个 EEPROM 并不是真正的 EEPROM,而是需要电池来维持它的数据。

备份区域控制寄存器 RCC_BDCRRTC 的时钟源选择及使能设置都是通过这个寄存器来实现的,所以在 RTC 操作之前 先要通过这个寄存器选择 RTC 的时钟源,然后才能开始其他的操作。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。