第43章 RTC—实时时钟—零死角玩转STM32-F429系列

 

第43章     RTC—实时时钟

全套200集视频教程和1000PDF教程请到秉火论坛下载:www.firebbs.cn

野火视频教程优酷观看网址:http://i.youku.com/firege

 

 

 

43.1 RTC简介

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

43.2 RTC功能框图解析

1.    时钟源

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

2.    预分频器

预分频器PRER7位的异步预分频器APRE15位的同步预分频器SPRE组成。异步预分频器时钟CK_APRE用于为二进制 RTC_SSR 亚秒递减计数器提供时钟,同步预分频器时钟CK_SPRE用于更新日历。异步预分频器时钟fCK_APRE=fRTC_CLK/(PREDIV_A+1),同步预分频器时钟fCK_SPRE=fRTC_CLK/(PREDIV_S+1))。使用两个预分频器时,推荐将异步预分频器配置为较高的值,以最大程度降低功耗。一般我们会使用LSE生成1HZ的同步预分频器时钟

通常的情况下,我们会选择LSE作为RTC的时钟源,即fRTCCLK=fLSE=32.768KHZ。然后经过预分频器PRER分频生成1HZ的时钟用于更新日历。使用两个预分频器分频的时候,为了最大程度的降低功耗,我们一般把同步预分频器设置成较大的值,为了生成1HZ的同步预分频器时钟CK_SPRE,最常用的配置是PREDIV_A=127PREDIV_S=255。计算公式为:fCK_SPRE=fRTCCLK/{ PREDIV_A+1*PREDIV_S+1}= 32.768/{ 127+1*255+1}=1HZ

3.    实时时钟和日历

我们知道,实时时钟一般是这样表示的:时///亚秒,其中时分秒可直接从RTC 时间寄存器 (RTC_TR)中读取,有关时间寄存器的说明具体见错误!未找到引用源。错误!未找到引用源。

431RTC 时间寄存器(RTC_TR

表格 431 时间寄存器位功能说明

位名称

位说明

PM

AM/PM符号,0:AM/24小时制,1:PM

HT[1:0]

小时的十位

HU[3:0]

小时的个位

MNT[2:0]

分钟的十位

MNU[3:0]

分钟的个位

ST[2:0]

秒的十位

SU[3:0]

秒的个位

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

432RTC亚秒寄存器(RTC_SSR

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

433 RTC日期寄存器(RTC_DR

表格 432 RTC日期寄存器位功能说明

位名称

位说明

YT[1:0]

年份的十位

YU[3:0]

年份的个位

WDU[2:0]

星期几的个位,000:禁止,001:星期一,111:星期日

MT

月份的十位

MU

月份的个位

DT[1:0]

日期的十位

DU[3:0]

日期的个位

当应用程序读取日历寄存器时,默认是读取影子寄存器的内容,每隔两个 RTCCLK 周期,便将当前日历值复制到影子寄存器。我们也可以通过将 RTC_CR 寄存器的BYPSHAD 控制位置 1 来直接访问日历寄存器,这样可避免等待同步的持续时间。

RTC_CLK经过预分频器后,有一个512HZCK_APRE11HZCK_SPRE,这两个时钟可以成为校准的时钟输出RTC_CALIBRTC_CALIB最终要输出则需映射到RTC_AF1引脚,即PC13输出,用来对外部提供时钟。

4.    闹钟

RTC有两个闹钟,闹钟A和闹钟B,,当RTC运行的时间跟预设的闹钟时间相同的时候,相应的标志位ALRAF(在RTC_ISR寄存器中)和ALRBF会置1。利用这个闹钟我们可以做一些备忘提醒功能。

如果使能了闹钟输出(由RTC_CROSEL[0:1]位控制),则ALRAFALRBF会连接到闹钟输出引脚RTC_ALARMRTC_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_AF1PC13)和RTC_AF2PI8),这两个输入既可配置为边沿检测,也可配置为带过滤的电平检测。当发生入侵检测时,备份寄存器将被复位。备份寄存器 (RTC_BKPxR) 包括20 32 位寄存器,用于存储 80 字节的用户应用数据。这些寄存器在备份域中实现,可在 VDD 电源关闭时通过 VBAT 保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在器件从待机模式唤醒时复位。

43.3 RTC初始化结构体讲解

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

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

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

代码 431 RTC初始化结构体

1 typedef struct {

2 uint32_t RTC_HourFormat; /* 指定RTC小时格式*/

3

4 uint32_t RTC_AsynchPrediv; /* 配置RTC_CLK的异步分频因子 */

5

6 uint32_t RTC_SynchPrediv; /* 配置RTC_CLK的同步分频因子 */

7 } RTC_InitTypeDef;

1)    RTC_HourFormat:小时格式设置,有RTC_HourFormat_24和RTC_HourFormat_12两种格式,一般我们选择使用24小时制,具体由RTC_CR寄存器的FMT位配置。

2)    RTC_AsynchPrediv:RTC_CLK异步分频因子设置,7位有效,具体由RTC 预分频器寄存器RTC_PRER的PREDIV_A[6:0]位配置。

3)    RTC_SynchPrediv:RTC_CLK同步分频因子设置,15位有效,具体由RTC 预分频器寄存器RTC_PRER的PREDIV_S[14:0]位配置。

43.4 RTC时间结构体讲解

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

代码 432 RTC时间结构体

1 typedef struct {

2 uint8_t RTC_Hours; /* 小时设置 */

3

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值