0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是RTC?RTC的基础知识

machao1680 来源:CSDN-Z小旋 2023-08-28 10:20 次阅读

什么是RTC?

RTC (Real Time Clock):实时时钟

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。

在断电情况下RTC仍可以独立运行,只要芯片的备用电源一直供电,RTC上的时间会一直走。

RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。

两个32位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。

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

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

RTC特征

编程的预分频系数:分频系数高为220。

32位的可编程计数器,可用于较长时间段的测量。

2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。

可以选择以下三种RTC的时钟源:

HSE时钟除以128;

LSE振荡器时钟;

LSI振荡器时钟

2个独立的复位类型:

APB1接口由系统复位;

RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位

3个专门的可屏蔽中断:

1.闹钟中断,用来产生一个软件可编程的闹钟中断。

2.秒中断,用来产生一个可编程的周期性中断信号(长可达1秒)。

3.溢出中断,指示内部可编程计数器溢出并回转为0的状态。

RTC时钟源

三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

HSI振荡器时钟

HSE振荡器时钟

PLL时钟

这些设备有以下2种二级时钟源:

40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。

32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。

RTC原理框图

3d2a48aa-43a4-11ee-a2ef-92fbcf53809c.png

RTC时钟的框图还是比较简单的,这里我们把他分成 两个部分:

APB1 接口:用来和 APB1 总线相连。此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。

通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC 核心接口:由一组可编程计数器组成,分成 两个主要模块 。

3d4d1830-43a4-11ee-a2ef-92fbcf53809c.png

第一个模块是 RTC 的 预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。

3d5d8422-43a4-11ee-a2ef-92fbcf53809c.png

第二个模块是一个 32 位的可编程计数器 (RTC_CNT),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记 录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。

RTC具体流程:

RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1s,RTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间,RTC_CNT计数到RTC_ALR就会产生计数中断。

RTC_Second为秒中断,用于刷新时间,

RTC_Overflow是溢出中断。

RTC Alarm 控制开关机

RTC时钟选择:

使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作。所以RTC一般都时钟低速外部时钟LSE,频率为实时时钟模块中常用的32.768KHz,因为32768 = 2^15,分频容易实现,所以被广泛应用到RTC模块。(在主电源VDD有效的情况下(待机),RTC还可以配置闹钟事件使STM32退出待机模式)。

RTC复位过程:

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。

RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位。

系统复位后,禁止访问后备寄存器和RCT,防止对后卫区域(BKP)的意外写操作

读RTC寄存器:

RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。

配置RTC寄存器:

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。

另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是’1’时,才可以写入RTC寄存器。

RTC时钟源:

RTC是一个独立的时钟源

3d71b6fe-43a4-11ee-a2ef-92fbcf53809c.png

RTC寄存器:

RTC控制寄存器 (RTC_CRH, RTC_CRL)

RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)

RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)

RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)

RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)

RTC控制寄存器高位——RTC_CRH 寄存器

3db0f17a-43a4-11ee-a2ef-92fbcf53809c.png

作用:配置3个专门的可屏蔽中断(溢出中断、闹钟中断、秒中断)使能。

注意:系统复位后所有的中断被屏蔽,因此可通过写RTC寄存器来确保在初始化后没有挂起的中断请求。

当外设正在完成前一次写操作时(标志位RTOFF=0),不能对RTC_CRH寄存器进行写操作。

RTC控制寄存器低位——RTC_CRL 寄存器:

3dd48bb2-43a4-11ee-a2ef-92fbcf53809c.png

一般用到该寄存器的3,4,5位。

第3位为寄存器同步标志位,我们在修改控制寄存器 RTC_CRH/CRL 之前,必须先判断该位,是否已经同步了,如果没有则等待同步第4位为配置标位,在软件修改RTC_CNT/RTC_ALR/RTC_PRL的值的时候,必须先软件置位该位,以允许进入配置模式第5位为RTC 操作位,该位由硬件操作,软件只读。

通过该位可以判断上次对 RTC 寄存器的操作是否完成,如果没有,我们必须等待上一次操作结束才能开始下一次,也就是判断RTOFF位是否置位。

三个位总结如下:

① 修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。

② 修改CNT、ALR、PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式

③ 同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。

3e09f0b8-43a4-11ee-a2ef-92fbcf53809c.png

RTC 预分频装载寄存器——(RTC_PRLH/RTC_PRLL) 寄存器

作用:配置 RTC 时钟的分频数。

比如我们使用外部 32.768K 的晶振作为时钟的输入频率,那么我们要设置这两个寄存器的值为 7FFFh(32767),就可获得周期为1秒钟的信号。

3e09f0b8-43a4-11ee-a2ef-92fbcf53809c.png

RTC预分频器余数寄存器(RTC_DIVH、RTC_DIVL)

作用:和他的名字一样,获得余数,也就是获取更精确的计时,比如:0.1s ,0.01 s等

3e5373b4-43a4-11ee-a2ef-92fbcf53809c.png

寄存器是只读寄存器,其值在RTC_PRL或RTC_CNT寄存器中的值发生改变后,由硬件重新装载。

RTC计数器寄存器——RTC_CNTX 寄存器

作用:存放计数器内的计数值。也就是用来记录时钟时间

3e7bceb8-43a4-11ee-a2ef-92fbcf53809c.png

该寄存器由2个16位的寄存器组成RTC_CNTH和 RTC_CNTL,总共32位,当进行读操作时,直接返回计数器内的计数值(系统时间)。

3ebec66e-43a4-11ee-a2ef-92fbcf53809c.png

RTC计数器寄存器——RTC闹钟寄存器(RTC_ALRH、RTC_ALRL)

作用:RTC时钟中断控制寄存器。

该寄存器也是由2个16位的寄存器组成RTC_ALRH和 RTC_ALRL,也就是32位,当可编程计数器的值与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟中断。

3ebec66e-43a4-11ee-a2ef-92fbcf53809c.png

BKP备份寄存器

备份寄存器是42个16位的寄存器。可用来存储84个字节数据。

它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。

当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。

执行以下操作将使能对后备寄存器和RTC访问:

设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。

设置寄存器PWR_CR的DBP位,使能对RTC和后备寄存器的访问。

一般用 BKP 来存储 RTC 的校验值或者记录一些重要的数据。

3f14c29e-43a4-11ee-a2ef-92fbcf53809c.png

配置RTC寄存器:

1.查询RTOFF位,知道RTOFF的值为1.

2.置CNF值为1,进入配置模式。

3.对一个或者多个RTC寄存器进行写操作。

4.清除CNF标志位,退出配置模式。

5.查询RTOFF,直到RTOFF位变1,已确认写操作已经完成。

仅当CNF标志位被清除时,写操作才能进行,这个操作至少需要3个RTCCLK周期。

RTC相关库函数:

RTC时钟源和时钟操作函数:

void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择

void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能

RTC配置函数(预分频,计数值):

void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL

void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL

void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL

RTC中断设置函数:

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH

RTC配置函数:

void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF

void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF

RTC同步函数:

void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF

void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF

RTC相关状态位获取清除函数:

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);

void RTC_ClearFlag(uint16_t RTC_FLAG);

ITStatus RTC_GetITStatus(uint16_t RTC_IT);

void RTC_ClearITPendingBit(uint16_t RTC_IT);

其他相关函数(BKP等)

PWR_BackupAccessCmd();//BKP后备区域访问使能

RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟

RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源

PWR_BackupAccessCmd();//BKP后备区域访问使能

uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP

配置RTC步骤

①使能PWR和BKP时钟:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

② 使能后备寄存器访问:

PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后备寄存器访问

③复位备份区域,开启外部低速振荡器。

BKP_DeInit();//复位备份区域

④ 配置RTC时钟源,使能RTC时钟:

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择 LSE 作为 RTC 时钟(RCC_RTCCLKSource_LSI 和 RCC_RTCCLKSource_HSE_Div128)

RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟

⑤ 设置RTC预分频系数:RTC_SetPrescaler();

RTC_EnterConfigMode();/// 允许配置

RTC_SetPrescaler(32767); //设置RTC预分频的值

RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成

⑥ 设置时间:RTC_SetCounter();

RTC_EnterConfigMode();/// 允许配置

void RTC_SetCounter(uint32_t CounterValue);

RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成

⑦开启相关中断(可选):

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中断

⑧编写中断服务函数:

RTC_IRQHandler();

⑨部分操作要等待写操作完成和同步。

RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成

RTC_WaitForSynchro();//等待RTC寄存器同步

具体的代码,库函数写的太多了,我会用CubeMx配置下,用HAL库写一个例程,几十行就可以解决RTC。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117741
  • 实时时钟
    +关注

    关注

    4

    文章

    210

    浏览量

    65338
  • 计数器
    +关注

    关注

    32

    文章

    2123

    浏览量

    92987
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112041
  • RTC
    RTC
    +关注

    关注

    2

    文章

    484

    浏览量

    65444

原文标题:干货!一文看懂RTC

文章出处:【微信号:电子设计宝典,微信公众号:电子设计宝典】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MCU芯片内部RTC与外部RTC有何区别?应该怎么选择?

    现在很多MCU内部已经集成了内部RTC,但常见的设计中为何很多使用独立的RTC芯片?进行RTC设计选型的依据是什么?应该如何选择?
    发表于 11-28 10:20 6160次阅读
    MCU芯片内部<b class='flag-5'>RTC</b>与外部<b class='flag-5'>RTC</b>有何区别?应该怎么选择?

    RTC寿命探讨以及RTC周围器件如何选型

    RTC电路的改进方案,如何延长RTC电路的寿命
    的头像 发表于 07-19 09:03 1557次阅读
    <b class='flag-5'>RTC</b>寿命探讨以及<b class='flag-5'>RTC</b>周围器件如何选型

    关于RTC时钟的知识

    在做智能手环时候使用到了关于RTC时钟的,今天我们来复习一下关于他的知识点。文章中我是参考的有STM32f411的中文参考手册,需要的话我会上传这个pdf版。实时时钟(RTC)养成查资料的好习惯
    发表于 08-11 08:27

    STM8单片机rtc时钟的设计

    #include #include voidinit_rtc(void) { RTC_InitTypeDefRTC_InitStr; RTC_TimeTypeDefRTC_TimeStr;
    发表于 12-03 14:48 2523次阅读

    Linux RTC驱动模型分析之rtc-sysfs.c

    rtc-sysfs文件主要的操作就是在sys下创建rtc的属性节点,可以方便用户方便快捷的访问,查找问题。下来大概看看sys下的rtc节点,有个直观的认识。
    发表于 04-27 19:43 2345次阅读

    STM32 RTC闹钟的中断和唤醒待机模式

    RTC代表的是实时时钟的意思,因为它提供的时钟基准比较准确所以用处还是很多的。   RTC全局中断: void RTC_IRQHandler() { if(RTC
    的头像 发表于 07-23 10:04 1.5w次阅读

    STM32开发 -- RTC详解

    RTC实时时钟部分,之前也是有讲到过的。Hi3516A开发–RTC电路接下来看一下STM32里RTC该怎么配置一、RTC实时时钟特征与原理查看STM32中文手册 16 实时时钟(
    发表于 11-30 13:06 27次下载
    STM32开发 -- <b class='flag-5'>RTC</b>详解

    【STM32】RTC详解

    00. 目录文章目录00. 目录01. RTC概述02. RTC主要特性03. RTC部分功能3.1 时钟和预分频器3.2 实时时钟和日历04. RTC低功耗模式和中断05.
    发表于 12-04 17:21 26次下载
    【STM32】<b class='flag-5'>RTC</b>详解

    RTC时钟讲解(一)

    什么是RTC RTC (Real Time Clock):实时时钟 RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的
    的头像 发表于 06-09 17:48 8506次阅读
    <b class='flag-5'>RTC</b>时钟讲解(一)

    RTC时钟源和RTC寄存器的基本知识

    RTC控制寄存器 (RTC_CRH, RTC_CRL)
    的头像 发表于 06-10 08:53 6531次阅读
    <b class='flag-5'>RTC</b>时钟源和<b class='flag-5'>RTC</b>寄存器的基本<b class='flag-5'>知识</b>

    如何解决RTC精度、功耗问题?

    RTC为整个电子系统提供时间基准,主控设计均离不开RTC电路设计,在应用RTC时,会出现精度或功耗大的现象,如何解决RTC精度及功耗问题?本文将为您介绍时钟芯片应用问题及解决方法。
    的头像 发表于 05-26 14:48 3189次阅读
    如何解决<b class='flag-5'>RTC</b>精度、功耗问题?

    RTC停振原因、理论分析

    晶振外置的RTC应用电路一般由RTC芯片、外置32k晶振、负载电容组成,最常见的电路原理图大致如下,其中U1为RTC芯片,Y1为32k晶振,C1、C2为晶振负载电容。
    的头像 发表于 05-26 14:49 1515次阅读
    <b class='flag-5'>RTC</b>停振原因、理论分析

    芯片内部RTC与外部RTC有何区别?

    现在很多MCU内部已经集成了内部RTC,但常见的设计中为何很多使用独立的RTC芯片?进行RTC设计选型的依据是什么?应该如何选择? 今天重点介绍一下在进行设计时应该怎么选择RTC
    的头像 发表于 05-26 14:52 3564次阅读
    芯片内部<b class='flag-5'>RTC</b>与外部<b class='flag-5'>RTC</b>有何区别?

    RTC相关知识

      RTC 是一个独立的定时器,能够在 STM32 的低功耗模式下运行。
    的头像 发表于 05-26 15:37 776次阅读
    <b class='flag-5'>RTC</b>相关<b class='flag-5'>知识</b>

    RTC技术基础知识

    RTC** ( **Real-time Communications** ),直译或者广义指 **实时通信** ,狭义一般称为 **实时音视频** ,在这次全球大爆发的新冠肺炎疫情中,作为视频会议、视频通话、远程办公、远程医疗和互动直播等应用的底层技术,为全社会的尽力运转提供了巨大的支持。
    的头像 发表于 05-26 17:04 1036次阅读
    <b class='flag-5'>RTC</b>技术<b class='flag-5'>基础知识</b>