RTC — 实时时钟

1 RTC 简介

RTC—real time clock,实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多。日历包含两个 32bit 的时间寄存器,可直接输出时分秒,星期、月、日、年。比起 F103 系列的 RTC只能输出秒中断,剩下的其他时间需要软件来实现,429 的 RTC可谓是脱胎换骨,让我们在软件编程时大大降低了难度。

2 RTC 功能框图解析

1. 时钟源

RTC 时钟源 —RTCCLK 可以从 LSE、LSI和 HSE_RTC 这三者中得到。其中使用最多的是 LSE,LSE 由一个外部的 32.768KHZ(6PF 负载)的晶振提供,精度高,稳定,RTC首选。LSI是芯片内部的 30KHZ晶体,精度较低,会有温漂,一般不建议使用。HSE_RTC由 HSE 分频得到,最高是 4M,使用的也较少。

2. 预分频器

预分频器 PRER 由 7 位的异步预分频器 APRE 和 15位的同步预分频器 SPRE组成。异步预分频器时钟 CK_APRE 用于为二进制 RTC_SSR 亚秒递减计数器提供时钟,同步预分频器时钟 CK_SPRE 用于更新日历。异步预分频器时钟 f CK_APRE =f RTC_CLK /(PREDIV_A+1),同步预分频器时钟 f CK_SPRE =f RTC_CLK /(PREDIV_S+1),)。使用两个预分频器时,推荐将异步预分频器配置为较高的值,以最大程度降低功耗。一般我们会使用 LSE 生成 1HZ的同步预分频器时钟通常的情况下,我们会选择 LSE 作为 RTC 的时钟源,即 f RTCCLK =f LSE =32.768KHZ。然后经过预分频器 PRER 分频生成 1HZ 的时钟用于更新日历。使用两个预分频器分频的时候,为了最大程度的降低功耗,我们一般把同步预分频器设置成较大的值,为了生成 1HZ 的同步预分频器时钟 CK_SPRE,最常用的配置是 PREDIV_A=127,PREDIV_S=255。计算公式为 : f CK_SPRE =f RTCCLK /{ ( PREDIV_A+1 ) * ( PREDIV_S+1 ) }= 32.768/{ ( 127+1 ) *(255+1)}=1HZ。

3. 实时时钟和日历

我们知道,实时时钟一般是这样表示的:时/分/秒/亚秒,其中时分秒可直接从 RTC 时间寄存器 (RTC_TR)中读取。

亚秒由 RTC 亚秒寄存器 (RTC_SSR)的值计算得到,公式为:亚秒值 = ( PREDIV_S –SS[15:0] ) / ( PREDIV_S + 1 ) ,SS[15:0]是同步预分频器计数器的值,PREDIV_S是同步预
分频器的值。

日期包含的年月日可直接从 RTC 日期寄存器 (RTC_DR)中读取。

当应用程序读取日历寄存器时,默认是读取影子寄存器的内容,每隔两个 RTCCLK 周期,便将当前日历值复制到影子寄存器。我们也可以通过将 RTC_CR 寄存器的 BYPSHAD控制位置 1 来直接访问日历寄存器,这样可避免等待同步的持续时间。
RTC_CLK 经过预分频器后,有一个 512HZ 的 CK_APRE 和 1 个 1HZ 的 CK_SPRE,这两个时钟可以成为校准的时钟输出 RTC_CALIB,RTC_CALIB 最终要输出则需映射到RTC_AF1 引脚,即 PC13输出,用来对外部提供时钟。

 4. 闹钟

RTC有两个闹钟,闹钟 A和闹钟 B,,当 RTC 运行的时间跟预设的闹钟时间相同的时候,相应的标志位 ALRAF(在 RTC_ISR 寄存器中)和 ALRBF会置 1。利用这个闹钟我们可以做一些备忘提醒功能。
如果使能了闹钟输出(由 RTC_CR 的 OSEL[0:1]位控制),则 ALRAF和 ALRBF会连接到闹钟输出引脚 RTC_ALARM,RTC_ALARM最终连接到 RTC的外部引脚 RTC_AF1(即 PC13),输出的极性由 RTC_CR 寄存器的 POL 位配置,可以是高电平或者低电平。

5. 时间戳
时间戳即时间点的意思,就是某一个时刻的时间。时间戳复用功能 (RTC_TS) 可映射到 RTC_AF1 或 RTC_AF2,当发生外部的入侵事件时,即发生时间戳事件时, RTC_ISR寄存器中的时间戳标志位 (TSF) 将置 1,日历会保存到时间戳寄存器( RTC_TSSSR、RTC_TSTR 和 RTC_TSDR)中。时间戳往往用来记录危及时刻的时间,以供事后排查问题时查询。

6. 入侵检测
RTC 自带两个入侵检测引脚 RTC_AF1(PC13)和 RTC_AF2(PI8), 这两个输入既可配置为边沿检测,也可配置为带过滤的电平检测。当发生入侵检测时,备份寄存器将被复位。备份寄存器 (RTC_BKPxR) 包括 20 个 32 位寄存器,用于存储 80 字节的用户应用数据。这些寄存器在备份域中实现,可在 VDD 电源关闭时通过 VBAT 保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在器件从待机模式唤醒时复位。

3 RTC 初始化结构体

  标准库函数对每个外设都建立了一个初始化结构体,比如 RTC_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如 RTC_Init()调用,这些配置好的参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。

  初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如。初始化结构体定义在 stm32f4xx_rtc.h 头文件中,初始化库函数定义在 stm32f4xx_rtc.c 文件中,编程时我们可以结合这两个文件内注释使用。

  RTC初始化结构体用来设置 RTC 小时的格式和 RTC_CLK的分频系数。

4 RTC 时间结构体

RTC时间初始化结构体用来设置初始时间,配置的是 RTC 时间寄存器 RTC_TR。

 

1) RTC_Hours:小时设置,12 小时制式时,取值范围为 0~11,24 小时制式时,取值范围为 0~23。

2) RTC_Minutes:分钟设置,取值范围为 0~59。
3) RTC_Seconds:秒钟设置,取值范围为 0~59。
4) RTC_H12 : AM/PM 设 置 , 可 取 值 RTC_H12_AM 和 RTC_H12_PM ,RTC_H12_AM时则是 24小时制,RTC_H12_PM 则是 12 小时制。

5 RTC 日期结构体

RTC日期初始化结构体用来设置初始日期,配置的是 RTC 日期寄存器 RTC_DR。

6 RTC 闹钟结构体 

RTC 闹钟结构体主要用来设置闹钟时间,设置的格式为[星期/日期]-[时]-[分]-[秒],共四个字段,每个字段都可以设置为有效或者无效,即可 MASK。如果 MASK到[星期/日期]字段,则每天闹钟都会响。

1) RTC_AlarmTime:闹钟时间设置,配置的是 RTC时间初始化结构体,主要配置小时的制式,有 12小时或者是 24 小时,配套具体的时、分、秒。 

2) RTC_AlarmMask:闹钟掩码字段选择,即选择闹钟时间哪些字段无效,取值 可为:RTC_AlarmMask_None(全部有效)、RTC_AlarmMask_DateWeekDay(日期或者星期无
效)、RTC_AlarmMask_Hours(小时无效)、RTC_AlarmMask_Minutes(分钟无效)、RTC_AlarmMask_Seconds(秒钟无效)、RTC_AlarmMask_All(全部无效)。比如我
们选择 RTC_AlarmMask_DateWeekDay,那么就是当 RTC 的时间的小时等于闹钟时间小时字段时,每天的这个小时都会产生闹钟中断。

3) RTC_AlarmDateWeekDaySel : 闹 钟 日 期 或 者 星 期 选 择 , 可 选 择RTC_AlarmDateWeekDaySel_WeekDay 或者 RTC_AlarmDateWeekDaySel_Date。要想这个配置有效,则 RTC_AlarmMask 不能配置为 RTC_AlarmMask_DateWeekDay,否则会被 MASK掉。

4) RTC_AlarmDateWeekDay:具体的日期或者星期几,当 RTC_AlarmDateWeekDaySel 设置成 RTC_AlarmDateWeekDaySel_WeekDay时,取值为 1~7,对应星期一~星期日,当设置成 RTC_AlarmMask_DateWeekDay时,取值为 1~31。

 

posted @ 2017-08-22 19:24  Liu_Jing  Views(7809)  Comments(0Edit  收藏  举报