实时时钟模块提供了具有日历模式的时钟计数、灵活可编程的闹钟以及可校准的时钟计数器。
8.1 RTC_A 简介
(1).
可配置成带日历的实时时钟或者一般目的的计数器;
(2).
在日历模式中提供了秒钟,分钟,小时,星期,日期,月份和年份;
(3).
具有中断能力;
(4).
实时时钟模式下可以配置为
BCD
或者二进制模式;
(5).
实时时钟模式下具有可编程的闹钟;
(6).
实时时钟模式里具有时间偏差的逻辑校正;
注意:实时时钟模块的大多数寄存器没有初始条件。在使用这个模块之前,用户必须通过软件对寄存器进行配置。
(大家浏览下列寄存器时,注意和上面的结构图配合)
RTCCTL0实时时钟控制寄存器0 (r0表示读为0)
0
:禁止中断
0:
禁止中断
0:
没有时间事件发生
0 :
没有时间事件发生
0:
实时时钟不能被安全读取
RTCCTL1实时时钟控制寄存器1 (rw-(0)表示读写为0)
0 :
选择
2
进制或者十六进制
0 :
实时时钟(
32
位计数器或者是日历模式)正在运作
1 :
计数器模式(
RTCMODE = 0)
),该位置
1
只会使
32
位计数器停止;在日历模式(
RTCMODE = 1
)日历以及预分频计数器会被停止。
RT0PS
和
RT1PS
、
RT0PSHOLD
和
RT1PSHOLD
位可以忽略。
0:
32
位计数器模式
0:
实时时钟值在转换过渡(日历模式)
RTC模式
|
RTCTEV的值
|
内部中断
|
计数器模式
|
00
|
8位溢出
|
01
|
16位溢出
|
|
10
|
24位溢出
|
|
11
|
32位溢出
|
|
日历模式
|
00
|
分钟改变
|
01
|
小时改变
|
|
10
|
午夜(00:00)
|
|
11
|
白天(12:00)
|
RTCCTL2 实时时钟控制寄存器2 (rw-(0)表示读写为0)
0 :
频率调整下降
每个
LSB
位代表大约
+4PPM(RTCCALS=1)
或
-2PPM(RTCCALS=0)
调整频率。
RTCCTL3 实时时钟控制寄存器3
00:没有频率输出到RTCCLK引脚
01:512HZ
10:256HZ
11:1HZ
1:
SMCLK
000-111,
分别表示
2
、
4
、
8
、
16
、
32
、
64
、
128
、
256
分频
RTCPS1CTL 预分频定时器1控制寄存器(16位寄存器)
RT1SSEL:
预分频定时器
1
时钟源选择位。选择时钟源输入到
RT1PS
计数器。在
RTC
日历模式该位不用关心,因为
RT1PS
时钟输入自动设置为
RT0PS
的输出。
01:
SMCLK
10:
从
RT0PS
输出
11:
从
RT0PS
输出
(其余项同RTCPS0CTL)
上面的都为控制寄存器,操作比较复杂,下面讲到的都是数值寄存器。
RTCNT2:
RTC
计数寄存器
2
,计数器模式
RTCNT3:
RTC
计数寄存器
3
,计数器模式
RTCNT4:
RTC
计数寄存器
4
,计数器模式
当选作二进制模式时:(低6位就可以表示秒1-60)
当选作BCD模式时:(低4位表示秒的各位0-9;4-6位表示秒的十位0-6,高位不用时默认为0)
RTCMIN:
分寄存器,
BCD/BIN
RTCHOUR:
时寄存器,
BCD/BIN
RTCDOW:
星期日数寄存器,因为只有
1-7
,所以无所谓
BCD/BIN
了
RTCDAY:
日寄存器,
BCD/BIN
RTCMON:
月寄存器,
BCD/BIN
RTCYEARL
:
年低字节寄存器,个年位以及十年位,
BCD/BIN
RTCAMIN:
分闹铃寄存器,
BCD/BIN
RTCAHOUR:
时闹铃寄存器,
BCD/BIN
RTCADOW:
星期闹铃寄存器
RTCADAY:
日闹铃寄存器,
BCD/BIN
//上述4个闹钟寄存器的最高位都为使能位AE,置位时相应寄存器才有效
RT0PS:
预分频定时器
0
计数值
RT1PS:
预分频定时器
1
计数值
RTCIV:
中断向量值寄存器(
16
位寄存器)
8.3 RTC 的各种操作流程
(1). RTCMODE位置0,进入32位计时器模式;
(2). 选择时钟源,并设计二级分频;
计数器的时钟可源于
ACLK
、
SMCLK
或者是
RT1PS
的输出。当使用
RT1PS
的输出作为计数源的时候,一定要先将
RT0PS
,
RT1PS
的
HOLD
位清零,使其可以正常工作,然后再分别配置二者的分频数。
再者,两个预分频器
RT0PS
和
RT1PS
也可以作为独立的计数器来用(级联成
16
位也是可以的)。通过
RT0IP
和
RT1IP
可以设置间隔。比如,选择
ACLK 32768HZ
作为时钟,间隔设置为
256
,也就是说每当计数器计到
32768/256=128
的整数倍时,该标志位就会置位。
(3). 32位计数器是由4个8位计数器级联而成,
这能提供
8
位、
16
位、
24
位、
32
位溢出间隔。
RTCTEV
位选择触发哪一个溢出间隔,通过设置
RTCTEVIE
位,一个
RTCTEV
发生能够触发一个中断。计数器
RTCNT1
到
RTCNT4
,每一个都可以单独的访问,并可能被写入。
(4). 如何关闭计数器。
为了简单一点,把所有
HOLD
位都置位,则可以保证在任何情况下都可以关闭
32
位计数器。
当
RTCMODE
置位的时候,日历模式就被选中了。在日历模式中,实时时钟模块可选择以
BCD
码或者是十六进制提供秒、分、小时、星期、日期、月份和年份。日历会自动计算是否是闰年,这个算法可以精确到
1901
年到
2099
年。
(1). 时钟和预分频。
RT0PS
必须源于
ACLK
,
ACLK
必须是
32768Hz
,。
RT0PS
会自动进行
256
分频,然后其输出再接
RT1PS
,
RT1PS
在被自动
128
分频,最后提供的时钟信号就是间隔一秒了。从计数器模式切换到日历模式时,会将秒、分、小时、星期、年份全部置清零,会将日期和月份全部置
1
。另外,
RT0PS
和
RT1PS
也会被清零。(这里把这些状态暂定义为默认复位状态)
(2). 日历寄存器编码格式。
当
RTCBCD=1
时,日历寄存器就会被选为
BCD
码格式。必须在时间设置之前选择好格式。改变
RTCBCD
的状态会使进入默认复位状态。
(3). 灵活的闹钟
用户可编程闹钟功能只有在日历模式运行的时候才有效。
每一个闹钟寄存器都包括一个闹钟使能位,
AE
可用来使能每一个闹钟寄存器。通过设置各式各样闹钟寄存器的
AE
位,可以生成多种闹钟。
比如说,一个用户需要在每一小时的
15
分钟(也就是
00
:
15
:
00
、
01
:
15
:
00
、
02
:
15
:
00
等等时刻)进行一次闹钟。这只要将
RTCAMIN
设置成
15
即可实现上述功能要求。通过置位
RTCAMIN
的
AE
位和清零闹钟寄存器的所有其它
AE
位,就会使能闹钟。正常工作时,对应的闹钟标志位
RTCCIFG
就会在
00
:
14
:
59
到
00
:
15
:
00
、
01
:
14
:
59
到
01
:
15
:
00
、
02
:
14
:
59
到
02
:
15
:
00
等等时刻被置位。
此外,修改闹钟时间的时候,为了避免错误,请先清
RTCAIE
、
RTCAIFG
、
AE
位来暂停闹钟功能。
在日历模式下,实时时钟寄存器每秒钟更新一次。为了防止在更新的时候读取实时时钟数据而造成错误数据的读取,系统设立了一个禁止读取的区域。每次
RTC
寄存器更新的那一刹那,左右
1/256s
被划为禁止读写的区域。
RTCRDY
位用来指示这个时间区域。
RTCRDY
置
0
时,表明处于这一区域;置
1
时表明在这一区域之外,可以发生读写。
(1).
每一个中断标志都配有相应的中断使能。
(2).
请注意:
RTCTE
定义的时间事件(计时模式和日历模式不同)
(3).
对于
RT0PSIFG
和
RT1PSIFG
标志位,举一个例子:
通过
RT0IP
位,可以选择地让
RT0PSIFG
位用来生成间接中断。在日历模式下,
RT0PS
的时钟源是
32768Hz
的
ACLK
,所以通过
RT0IP
控制中断间隔可以产生
16384Hz
、
8192Hz
、
4096Hz
、
2048Hz
、
1024Hz
、
512Hz
、
256Hz
和
128 Hz
的时间间隔。设置
RT0PSIE
位可以使能中断。
(1).
把
P2.6
设定为输出状态,并声明有特殊功能;
P2.6
为
RTCCLK
的输出引脚
(2).
通过设置
RTCCTL3
寄存器中的
RTCCALF
来设置
P2.6
输出信号的频率;
(3).
精确测量该频率,然后计算误差;
(4).
最后设置
RTCCTL2
寄存器,来调节频率增高或降低多少。
PPM
表示百万分之一所输出的频率;