—————————————————————————————————————————————————————————
无论是谁,你的一天也只有二十四小时。
你可以玩,可以睡大觉,可以去学习,也可以去探索那片从未到达的那片海。
时间不会为任何人停留,你可以选择原地踏步,当然你也可以选择勇攀高峰。
—————————————————————————————————————————————————————————————
RTC(Real Time Clock)实时时钟
RTC是个独立的定时器。RTC拥有一个连续计数的计数器,在相应软件的配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前的时间和日历。
RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即系统复位或者从待机模式唤醒后RTC的设置和时间的维持不变,但是在系统复位后,会自动禁止访问后备寄存器和RTC。防止对后备区(BKP)的意外写操作。(读RTC寄存器有解释)所以在设置时间之前,先要取消后备域的(BKP)写保护。
BKP备份寄存器
①备份寄存器是42个16位的寄存器,可用来存储84个字节的数据
②它们在备份区域,当VDD电源切断,仍然由V(BAT)纽扣电池维持供电
③当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。
④执行以下的操作将使能对后备区域的访问
设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟
设置寄存器PWB_CR的DBP位,使能对RTC和后备寄存器的访问。
RTC框图
RTC 由两个主要部分组成 ,第一部分(APB1 接口)用来和 APB1 总线相连。此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总线时钟驱动,用来与 APB1 总线连接。
另一部分(RTC 核心)由一组可编程计数器组成,分成两个主要模块。第一个模块是 RTC 的预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。第二个模块是一个 32 位的可编程计数器,可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。
RTC 还有一个闹钟寄存器 RTC_ALR,用于产生闹钟。系统时间按 TR_CLK 周期累加并与存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
自己理解:RTC有三个时钟源,一般我们选择外部的LSE,经过RTC_PRL预分频之后产生TR_CLK时钟,在TR_CLK时钟的作用下,RTC_CNT计数器(32位)每个周期加1操作。永不停息的操作,RTC_ALR是闹钟比较寄存器,当RTC_ALR和RTC_CNT相等的时候才生闹钟中断,同时还有秒中断。溢出中断。
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寄存器过程
第一 查询RTOFF位,直到RTOFF的值变为“1”
第二 置CNF为1,进入配置模式
第三 对RTC寄存器进行操作
第四 清除CNF标志位,退出配置模式
第五 查询RTOF,直到RTOFF位变为“1”,以确认写操作已经完成
当且CNF的标志位被清除时,写操作才能进行,这个过程至少需要 三个RTCLK周期
RTC的配置过程
② 使能后备寄存器访问: PWR_BackupAccessCmd();
③ 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
④设置RTC预分频系数:RTC_SetPrescaler();
⑤ 设置时间:RTC_SetCounter();
⑥开启相关中断(如果需要):RTC_ITConfig();
⑦编写中断服务函数:RTC_IRQHandler();
⑧部分操作要等待写操作完成和同步。
RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步