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

2019-09-20来源: eefocus关键字:RTC  实时时钟  STM32-F429系列

43.1 RTC简介

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


43.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用于更新日历。异步预分频器时钟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=127,PREDIV_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 时间寄存器位功能说明

image.png

亚秒由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日期寄存器位功能说明

image.png

当应用程序读取日历寄存器时,默认是读取影子寄存器的内容,每隔两个 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 保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在器件从待机模式唤醒时复位。


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


4 uint8_t RTC_Minutes; /* 分钟设置 */


5


6 uint8_t RTC_Seconds; /* 秒设置 */


7


8 uint8_t RTC_H12; /* AM/PM 符号设置 */


9 } RTC_TimeTypeDef;


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小时制。


43.5 RTC日期结构体讲解

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


代码 433 RTC 日期结构体


1 typedef struct {


2 uint8_t RTC_WeekDay; /* 星期几设置 */


3


4 uint8_t RTC_Month; /* 月份设置 */


5


6 uint8_t RTC_Date; /* 日期设置 */


7


8 uint8_t RTC_Year; /* 年份设置 */


9 } RTC_DateTypeDef;


1)    RTC_WeekDay:星期几设置,取值范围为1~7,对应星期一~星期日。


2)    RTC_Month:月份设置,取值范围为1~12。


3)    RTC_Date:日期设置,取值范围为1~31。


4)    RTC_Year:年份设置,取值范围为0~99。


43.6 RTC闹钟结构体讲解

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


代码 434 RTC闹钟结构体


1 typedef struct {


2 RTC_TimeTypeDef RTC_AlarmTime; /* 设定RTC时间寄存器的值:时/分/秒 */


3


4 uint32_t RTC_AlarmMask; /* RTC 闹钟掩码字段选择 */


5


6 uint32_t RTC_AlarmDateWeekDaySel; /*闹钟的日期/星期选择 */


7


8 uint8_t RTC_AlarmDateWeekDay; /* 指定闹钟的日期/星期


9 * 如果日期有效,则取值范围为1~31


10 * 如果星期有效,则取值为1~7


11 */


12    } RTC_AlarmTypeDef;


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。


43.7 RTC—日历实验

利用RTC的日历功能制作一个日历,显示格式为:年-月-日-星期,时-分-秒。


43.7.1 硬件设计

该实验用到了片内外设RTC,为了确保在VDD断电的情况下时间可以保存且继续运行,VBAT引脚外接了一个CR1220电池座,用来放CR1220电池给RTC供电。


[1] [2] [3]
关键字:RTC  实时时钟  STM32-F429系列 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic475162.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第46章 DCMI—OV5640摄像头—零死角玩转STM32-F429系列
下一篇:第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

[正点原子]STM32开发板F103 第41讲 RTC实时时钟备份区域BKP原理
RTC模块与 时钟配置系统在后备区域,在复位时候不会被清除(框图: 中文参考手册)如何使用RTC实现时钟?RTCCLKRTC的时钟有几个来源有三种  32.768khz  8Mhz  40khzRTC_PRL是自动重装载寄存器RTC_DIV 预分频余数寄存器 RTC_DIV的作用就是  可以提供一个更加精确的时钟,时钟开启之后会给RTC_PRL写一个值(比如100),那么RTCCLK就会被 /100 之后得到 TR_CLK。 TR_CLK的一个周期有100个  RTCCLK ,RTC_DIV在你装载之后它的值就是100,他在 RTCCLK的控制下每一个时钟  减
发表于 2019-09-09
[正点原子]STM32开发板F103 第41讲 RTC实时时钟备份区域BKP原理
RTC--根据年月日计算[星期]的函数
一、u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表     u8 RTC_Get_Week(u16 year,u8 month,u8 day){  u16 temp2; u8 yearH,yearL;  yearH=year/100; yearL=year%100;  // 如果为21世纪,年份数加100   if (yearH>19)yearL+=100; // 所过闰年数只算1900年之后的 
发表于 2019-09-03
RTC--日期必须重启才更新问题
芯片:STM32F030C8T6问题:RTC设置时间,时间可正常设置,日期需要重启才能设置成功相关代码:/************************************************函数名称 : RTC_GetDateTime功    能 : 读取RTC日期时间(含日历、星期)参    数 : RTC_DateTimeStructure -- RTC结构体返 回 值 : *************************************************/void RTC_GetDateTime(RTC
发表于 2019-09-03
STM32开发 -- 时钟系统详解
上一篇文章讲了RTC,里面其实已经包含了时钟系统的介绍了。这篇文章将再详细的讲一下。一、时钟系统框图二、时钟系统STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。系统时钟
发表于 2019-09-02
STM32开发 -- 时钟系统详解
STM32F429 >> 19. RTC_实时时钟(Code)
配置及读取日期和时间此工程没有读取亚秒值。若想让时钟断电后持续计时,则不要使能RTC_Config() 函数中的后备域访问。bsp_rtc.h/**  ******************************************************************************  * @file    bsp_rtc.h  * @author  Waao  * @version V1.0.0  * @date    17-Feb-2019  * @brief   This
发表于 2019-08-29
STM32F429 >> 19. RTC_实时时钟
简介RTC—Eeal Time Clock,实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多。日历包含两个 32bit 的时间寄存器,可直接输出时分秒,星期、月、日、年。功能框图1. 时钟源RTC 时钟源 —RTCCLK 可以从 LSE、LSI 和 HSE_RTC 这三者中得到。其中使用最多的是 LSE。LSE 由一个外部的 32.768KHZ(6PF 负载)的晶振提供,精度高,稳定,RTC首选;LSI 是芯片内部的 30KHZ 晶体,精度较低,会有温漂,一般不建议使用;HSE_RTC由 HSE 分频得到,最高是 4M,使用的也较少。2. 预分频器预分频器 PRER 由 7 位的异步预分频器
发表于 2019-08-29
STM32F429 >> 19. RTC_实时时钟
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved