1-时钟配置:RTCCLK / RTC_PRL = TR_CLK,配置PRL的值就能配置RTC的时钟频率,决定着最小指令周期时间;DIV是一个自减计数器,其最初的加载值是PRL,然后随着RTCCLK的指令周期一个一个减,减到0时,正好对外输出个TR_CLK,因为分频嘛就是有个PRL的倍数关系,输出TR_CLK后也刚好再把PRL加载到DIV中继续自减。DIV的每一步是根据RTCCLK的指令周期的,精度更高点,比如说,为40kHz,指令周期为1/40k = 25us,也就是DIV每减少1就是过了25us,若PRL取100,则TR_CLK的指令周期只有10025 = 2500us,显然分辨率第一点。当DIV的值为80,我们能知道过了(100-80) * 25us = 500us,提高了分辨率,如果此时还检测到TR_CLK已经过了2个指令周期,那么总走过的时间是:22500+25=5025us。
2-定时器中断:首先是一个秒中断:RTC定时器每走过1秒的时间就会触发秒中断;然后是溢出中断:当计数器RTC_CNT溢出并变回0时触发中断,RTC_CNT每过1秒才会增加1,并且是个32位的寄存器,存储范围很大的,另外是把1970年对应RTC_CNT为0,然后根据CNT当前的值就可以基于1970年这个时间远点推测当前是什么日期和时间,举个随意的值,比如此时RTC_CNT 被设置为1004556,说明距离1970年已经过了1004556秒,假设计算和后刚好是2017年5月20号13点14分25秒(这只是随口说的,并没有仔细去算,大概理解过程就行),这不就起到了日历的作用了吗。并且RTC_CNT这个最大能记录到136年后,足够用了。最后是闹钟中断:把RTC_ALR设置成某个数,当CNT=ALR时就会触发闹钟中断。
此处转自RTC时钟:一个日历_学点东西吧的博客-CSDN博客_rtc 1970
要知道在已经编辑好的获取时间函数中基本都会调用固件函数库中的RTC_GetCounter函数,
代码如下:(源自stm32f10x.c)
实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。 RTC 还包含用于管理低功耗模式的自动唤醒单元。
两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。
系统可以自动将月份的天数补偿为 28、 29(闰年)、 30 和 31 天。并且还可以进行夏令时(在夏季的某一天会在凌晨时分跳过一小时,而后会在冬季补回来)补偿。
其它 32 位寄存器还包含可编程的闹钟亚秒、 秒、分钟、小时、星期几和日期。此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。
上电复位后,所有 RTC 寄存器都会受到保护,以防止可能的非正常写访问。
无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内, RTC 便不会停止工作。