本学习笔记基于雅特力MCU,链接如下:
资料链接:https://www.arterytek.com/file/download/1995
实时时钟用于日历时钟功能,内部为一个 32 位递增计数器,通常使用中该计数器 1 秒增加 1,也就是该计数器相当于秒钟,然后根据当前的秒钟值,通过转换得到时间和日期,实现日历的功能,修改计数器的值便可修改时间和日期。
RTC 计数逻辑位于电池供电域,只要 VBAT 有电,RTC 便会一直运行,不受系统复位以及 VDD 掉电影响,但可通过电池供电域复位进行复位。
一、时钟:
1. RTC时钟有三个来源:HEXT/128,LEXT,LICK,比较常用是32.268kHz的LEXT,经过2的15次方分频后给RTC计数器提供1Hz的计数时钟,这样计数器每增加1,时间就增加1秒。
2. 需要注意RTC时钟的频率必须小于PCLK1频率的四分之一,不过一般不会使用这么高的RTC时钟和这么低的PCLK频率。
3. 当我们选用LEXT作为RTC时钟源时,如果MCU主电源断电,在VBAT供电的情况下RTC仍保持运行,除RTC_CTRL寄存器外RTC其他寄存器正常更新,但因主电源切断无法通过APB1访问RTC寄存器。若选用其余两种时钟源为RTC供电,主电源切断的情况下,RTC停止运行。重新上电后,RTC立即运行,不需要额外使能。
二、配置:
1. 上电复位后所有RTC寄存器处于写保护状态,需要先解除写保护,才能写RTC寄存器。
解锁步骤:
使能PWC与BPR时钟:PWCEN=1,BPREN=1。
解锁电池供电域写保护:电源控制寄存器PWC_CRTL的BPWEN位置1。
2. 若要重新配置RTC_CLK,需将电池供电域复位后,再进行配置。
电池供电域复位方法:CRM->ctrl_bit.bpdrst = 1;CRM->ctrl_bit.bpdrst = 0
RTC_CLK配置方法:
使能时钟源:如使能LEXT并等待LEXT稳定。
选择RTC时钟源:CRM_BPDC寄存器的RTCSEL位选择,并使能RTCEN位
设置RTC分频系数:分频系数 = RTC_CLK频率 - 1,等待RTC配置完成标志置起。
注意:写RTC寄存器后,需等待CFGF位置起,表示配置完成,才能再次写RTC寄存器。
3. 设置当前时间,通过将当前时间换算成秒数写入RTC_CNT寄存器。
在完成步骤1的情况下直接将秒数写入RTC_CNT寄存器即可,然后等待配置完成。
4.设置闹钟,方法与3设置当前时间类似,一般会同时开启闹钟中断,谈一谈RTC的中断
提前清中断标志:比如设置闹钟中断前,可以操作RTC_CTRL寄存器的TAF标志位清除闹钟中断,此时我们操作了RTC的寄存器,所以需要等待配置完成方可继续。
开启中断:操作RTC_CRTL寄存器的TAIEN位开启闹钟中断,同样需要等待配置完成。
配置中断优先级:调用nvic_irq_enable函数配置闹钟中断优先级,再写一个闹钟中断回调函数即可;当然也可调用nvic_irq_enable函数配置RTC全局中断,再写一个全局中断回调函数即可,建议采用第一种。同样需要等待RTC配置完成标志置起。
注意:此时如果有RTC闹钟中断/事件唤醒低功耗模式的需求,参考如下说明:
RTC 支持 RTC 全局中断向量(RTC_IRQn)和 RTC 闹钟中断向量(RTCAlarm_IRQn)。若要使用 RTC 闹钟中断从 DEEPSLEEP 模式下唤醒,需使能 RTC 闹钟中断并使用 RTCAlarm_IRQn 向量,同时将 EXINT 线 17 配置为中断模式;若要使用 RTC 闹钟事件从 DEEPSLEEP 模式下唤醒,需要将 EXINT 线 17 配置为事件模式,但无需使能 RTC 闹钟中断,若要使用 RTC 闹钟事件从 standby 模式下唤醒,则无 需配置闹钟中断和 EXINT 线 17。
最后写入闹钟值:方法与设置当前时间雷同,不赘述。
注意:RTC有三个中断可以开启,溢出中断,闹钟中断和秒中断。溢出中断很少使用,只当计数器溢出时才会触发;闹钟中断有单独的回调函数,也可以用RTC全局中断;秒中断和溢出中断都使用RTC全局中断,可以在秒中断里读出秒数。
5.日历实时显示,需要读取RTC计数器,读出当前秒数并转换成日历。
如果需要每秒刷新一次日历,可在秒标志(TSF)更新时读出计数值,并清除秒标志等待配置完成。也可在秒中断中操作。