首页 > 编程知识 正文

read rtc 时钟指令怎么用,rtc时钟与系统时钟

时间:2023-05-06 03:00:46 阅读:12737 作者:1121

RTC RTC (Real Time Clock):什么是实时时钟

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

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

RTC实质上是断电后仍能继续工作的计时器,从计时器来看,相对于通用的定时器怡园毛衣外围设备,其功能非常简单,只有计时器功能(也可以触发中断)。 但是,其高度的指摘在于,关闭电源后也能正常工作。

两个32位寄存器包含秒、分钟、小时(12小时或24小时制)、星期、日期、月和年的二进制代码十进制格式(BCD )。 也可以指定二进制格式的子秒值。 系统可以自动将月天数补偿为28、29%闰年、30、31天。

通电复位后,所有RTC寄存器都将免受未经授权的写入访问。

无论设备的状态(运行模式、低功耗模式或复位状态)如何,只要电源电压在动作范围内,RTC就不会停止动作。

http://www.Sina.com /http://www.Sina.com /

RCT特征:

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

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

HSE时钟除以128;

LSE振荡器时钟;

LSI振荡器时钟

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

APB1接口由系统复位;

RTC核心(预分频器、报警、计数器、分频器)只能在备份域中复位

三种RTC的时钟源

1. 2个独立的复位类型:

2. 3个专门的可屏蔽中断:

3. 闹钟中断表示内部可编程计数器溢出并旋转为0的状态。

秒中断

可使用三种不同时钟源来驱动系统时钟(SYSCLK )。

溢出中断

RTC时钟源:

HSI振荡器时钟

这些设备有两种类型的辅助时钟源:

40kHz的低速内部RC可用于独立看门狗的驱动和程序对RTC的选择驱动。 RTC用于从停机/待机模式自动启动系统。

32.768kHz低速外部晶体也可用于程序选择驱动RTC(RTCclk )。

RTC原理框图

RTC时钟的框图还很简单,这里把他分成HSE振荡器时钟:

3358 www.Sina.com/:用于连接到AP B1总线。 该单元还包括一组可以通过APB1总线读写的16位寄存器。 APB1接口由用于连接到APB1总线的APB1总线时钟驱动。

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

PLL时钟:由一组可编程计数器组成,分为两个部分

g )APB1 接口可以以编程方式生成RTC时间基准TR_CLK一秒钟。 RTC的预分频器模块包括20位可编程分频器(RTC预分频器)。 如果在RTC_CR寄存器中设置了适当的允许位,RTC将在每个TR_CLK循环中发出中断(秒中断)。 可以在当前系统时间初始化RTC 核心接口。 32位时钟计数器,以秒为单位计算,可以记录4294967296秒,约136年左右。 作为一般的APP应用,这就足够了。

http://www.Sina.com/http://www.Sina.com /

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是一个独立的时钟源

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 寄存器


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

注意:系统复位后所有的中断被屏蔽,因此可通过写RTC寄存器来
确保在初始化后没有挂起的中断请求。当外设正在完成前一次写操作时(标志位RTOFF=0),不
能对RTC_CRH寄存器进行写操作。

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


一般用到该寄存器的 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相关寄存器写操作之前,必须判断上一

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

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

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

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

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

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

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

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

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

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

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

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

BKP备份寄存器

备份寄存器是42个16位的寄存器。可用来存储84个字节数据。
它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。

当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。
执行以下操作将使能对后备寄存器和RTC访问:

设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。设置寄存器PWR_CR的DBP位,使能对RTC和后备寄存器的访问

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

配置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/PRLLvoid RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTLvoid 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位 CNFvoid 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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。