什么是rtc
rtc (real time clock):实时时钟
rtc是个独立的定时器。rtc模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 rtc还包含用于管理低功耗模式的自动唤醒单元。
在断电情况下 rtc仍可以独立运行 只要芯片的备用电源一直供电,rtc上的时间会一直走。
rtc实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器tim外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。
两个 32 位寄存器包含二进码十进数格式 (bcd) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。
上电复位后,所有rtc寄存器都会受到保护,以防止可能的非正常写访问。
无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,rtc使不会停止工作。
rct特征:
可编程的预分频系数:分频系数高为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原理框图
rtc时钟的框图还是比较简单的,这里我们把他分成 两个部分:
apb1 接口:用来和 apb1 总线相连。此单元还包含一组 16 位寄存器,可通过 apb1 总线对其进行读写操作。apb1 接口由 apb1 总 线时钟驱动,用来与 apb1 总线连接。
通过apb1接口可以访问rtc的相关寄存器(预分频值,计数器值,闹钟值)。
rtc 核心接口:由一组可编程计数器组成,分成 两个主要模块 。
第一个模块是 rtc 的 预分频模块,它可编程产生 1 秒的 rtc 时间基准 tr_clk。rtc 的预分频模块包含了一个 20 位的可编程分频器(rtc 预分频器)。如果在 rtc_cr 寄存器中设置了相应的允许位,则在每个 tr_clk 周期中 rtc 产生一个中断(秒中断)。
第二个模块是一个 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是一个独立的时钟源
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/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);
1
② 使能后备寄存器访问:
pwr_backupaccesscmd(enable); //使能 rtc 和后备寄存器访问
1
③复位备份区域,开启外部低速振荡器。
bkp_deinit();//复位备份区域
1
④ 配置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。
NGMN联盟开始启动6G发展事宜
技术资讯 I 哪些原因会导致 BGA 串扰?
改变PCB设计和制造的物联网传感器技术
英特尔为加速设计全新系统芯片,斥资收购NetSpeed Systems
区块链+旅游将会催生出怎样的商业模式
一文看懂RTC实时时钟
荷兰首座电动汽车“换电站”投入使用(图)
“小数据,大任务”范式是人工智能统一的目标
物联网MCU为下一代便携式物联网应用构建紧凑的小尺寸设计
TWS充电盒专用蓝牙芯片MS1656
[图文]C1972大功率功放
中国大陆的大尺寸液晶面板产能本季度有望超过日本,位居全球第三
浅析音响设备出现噪音的四个原因
IO拓展模块-ET1020新品上市!参与新品活动可免费领取!
基于校园网的数字视频监控系统设计
列举单火线设计软硬件联调的6个典型问题
摇表怎么测接地线好不好
5G即将商用,在澳大利亚5G速度居然比4G还慢
用什么来建设智慧城市
适用于所有动力总成解决方案