本节我们将介绍RTC
,实际上有关RTC
我们在学习S3C2440
的时候已经详细介绍过《Mini2440
裸机开发之RTC
》。
一、RTC
RTC
,英文全称Real Time Clock
,中文就是实时时钟,是一个可以为系统提供精确的时间基准的元器件,RTC
一般采用精度较高的晶振作为时钟源,有些RTC
为了在主电源掉电时还可以工作,需要外加电池供电。
1.1 概述
在断电情况下RTC
仍可以独立运行,只要芯片的外加电池一直供电,RTC
上的时间会一直走。
RTC
本质上是个独立的定时器。RTC
模块拥有一个连续计数的计数器。从定时器的角度来看,相对于通用定时器TIM
外设,它的功能十分简单,只有计时功能(也可以触发中断),但其高级之处也就在于掉电之后还可以正常运行。
两个32
位寄存器包含二进码十进数格式 (BCD
) 的秒、分钟、小时(12
或24
小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为28
、29
(闰年)、30
和31
天。
上电复位后,所有RTC
寄存器都会受到保护,以防止可能的非正常写访问。
无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC
不会停止工作。
1.2 特性
-
可编程的预分频系数:分频系数高为\(2^{20}\);
-
32
位的可编程计数器,可用于较长时间段的测量; -
2
个分离的时钟:用于APB1
接口的PCLK1
和RTC
时钟(RTC
时钟的频率必须小于PCLK1
时钟频率的四分之一以上); -
可以选择以下三种
RTC
的时钟源;HSE
时钟除以128
;LSE
振荡器时钟;LSI
振荡器时钟;
-
2
个独立的复位类型:APB1
接口由系统复位;RTC
核心(预分频器、闹钟、计数器和分频器)只能由后备域复位;
-
3
个专门的可屏蔽中断;- 闹钟中断,用来产生一个软件可编程的闹钟中断;
- 秒中断,用来产生一个可编程的周期性中断信号(长可达1秒);
- 溢出中断,指示内部可编程计数器溢出并回转为
0
的状态;
1.3 RTC
方框图

RTC
由两个主要部分组成。
- 第一部分(
APB1
接口):用来和APB1
总线相连,此单元还包含一组16
位寄存器,可通过APB1
总线对其进行读写操作。APB1
接口由APB1
总线时钟驱动,用来与APB1
总线连接; - 另一部分(
RTC
核心):由一组可编程计数器组成,分成两个主要模块;- 第一个模块是
RTC
的预分频模块(左下1):它可编程产生最长为1
秒的RTC
时间基准TR_CLK
。RTC
的预分频模块包含了一个20
位的可编程分频器(RTC
预分频器)。如果在RTC_CR
寄存器中设置了相应的允许位,则在每个实时时钟(RTC
)TR_CLK
周期中RTC
产生一个中断(秒中断); - 第二个模块是一个
32
位的可编程计数器(左下2):可被初始化为当前的系统时间;系统时间按TR_CLK
周期累加并与存储在RTC_ALR
寄存器中的可编程时间相比较,如果RTC_CR
控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
- 第一个模块是
1.3.1 RTCCLK
选择
我们在《STM32F103
系统时钟配置》中介绍了STM32
的时钟框图;

RTCCLK
可以选择以下三种作为时钟源;
HSE
时钟除以128
;LSE
振荡器时钟;LSI
振荡器时钟;
使用HSE
分频时钟或者LSI
的时候,在主电源VDD
掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC
正常工作,所以RTC
一般都时钟低速外部时钟LSE
,频率为实时时钟模块中常用的32.768KHz
。
因为32768 = 2^15
,分频容易实现,所以被广泛应用到RTC
模块。在主电源VDD
有效的情况下(待机),RTC
还可以配置闹钟事件使STM32
退出待机模式。
1.3.2 具体流程
RTCCLK
经过RTC_DIV
预分频,RTC_PRL
设置预分频系数,然后得到TR_CLK
时钟信号,我们一般设置其周期为1s
,RTC_CNT
计数器计数,假如1970
设置为时间起点为0s
,通过当前时间的秒数计算得到当前的时间。
RTC_ALR
是设置闹钟时间,RTC_CNT
计数到RTC_ALR
就会产生计数中断;
RTC_Second
为秒中断,用于刷新时间;RTC_Overflow
是溢出中断;RTC Alarm
控制开关机。
1.3.3 RTC
复位过程
除了RTC_PRL
、RTC_ALR
、RTC_CNT
和RTC_DIV
寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。RTC_PRL
、RTC_ALR
、RTC_CNT
和RTC_DIV
寄存器仅能通过备份域复位信号复位。
系统复位后,禁止访问后备寄存器和RCT
,防止对后卫区域(BKP
)的意外写操作。
1.3.4 读RTC
寄存器
RTC
内核完全独立于APB1
接口,软件通过APB1
接口对RTC
相关寄存器访问。但是相关寄存器只在RTC APB1
时钟