八、实时时钟RTC_A

时间:2021-06-15 17:17:45
实时时钟模块提供了具有日历模式的时钟计数、灵活可编程的闹钟以及可校准的时钟计数器。
8.1 RTC_A简介
             实时时钟模块提供了一个可以配置成一般目的计数器的日历时钟。
            RTC_A 的特点包括:
(1).    可配置成带日历的实时时钟或者一般目的的计数器;
(2).    在日历模式中提供了秒钟,分钟,小时,星期,日期,月份和年份;
(3).    具有中断能力;
(4).    实时时钟模式下可以配置为 BCD 或者二进制模式;
(5).    实时时钟模式下具有可编程的闹钟;
(6).    实时时钟模式里具有时间偏差的逻辑校正;
注意:实时时钟模块的大多数寄存器没有初始条件。在使用这个模块之前,用户必须通过软件对寄存器进行配置。
八、实时时钟RTC_A
 
              8.2 RTC_A的寄存器
                            说实话,RTC这一章不太好写,东西太多又太碎,不好总结。它一个人的寄存器,比前面加起来似乎还要多。不过还好控制寄存器只有几个,大部分为数值寄存器。
 
(大家浏览下列寄存器时,注意和上面的结构图配合)
 
                            贴这张图的目的仅仅在于告诉大家,16位的寄存器大部分被分成两个8位的寄存器了,操作的时候需要注意你的操作对象是8位的还是16位的。在这里常用8位寄存器来操作。(以下如未特意声明,则全部为8位寄存器)
八、实时时钟RTC_A
八、实时时钟RTC_A
 
RTCCTL0实时时钟控制寄存器r0表示读为0
八、实时时钟RTC_A
             
                     RTCTEIVE 实时时钟 - 时间事件中断使能
                                                               0 禁止中断
                                                               1 允许中断
                     RTCAIE 实时时钟 - 闹钟中断使能,在计数器模式时被清除( RTCMODE 0  
0 :禁止中断
                                                               1 允许中断
                     RTCRDYIE 实时时钟读取准备中断 使能  
0 禁止中断
                                                               1 允许中断
                     RTCTEVIFG 实时时钟 - 时间事件标志  
0  没有时间事件发生
    1  有时间事件发生
     RTCAIFG 实时时钟 - 闹钟标志位,在计数器模式时被清除( RTCMODE 0  
没有时间事件发生
  时间事件发生  
     RTCRDYIFG 实时时钟读取准备标志位  
0  实时时钟不能被安全读取
  实时时钟能被安全读取
RTCCTL1实时时钟控制寄存器rw-(0)表示读写为0
八、实时时钟RTC_A
                     RTCBCD 实时时钟 BCD 码格式选择位,选择实时时钟的 BCD 格式。只能应用于日历模式( RTCMODE 1 ),在计数器模式中会被忽略设置。改变这个位会将秒、分、小时、星期和年清零,将日期和月份置 1 。之后,实时时钟寄存器必须被软件设置。  
选择 2 进制或者十六进制
  选择 BCD
                     RTCHOLD 实时时钟保持位 
实时时钟( 32 位计数器或者是日历模式)正在运作  
计数器模式( RTCMODE 0) ),该位置 1 只会使 32 位计数器停止;在日历模式( RTCMODE 1 )日历以及预分频计数器会被停止。 RT0PS RT1PS RT0PSHOLD RT1PSHOLD 位可以忽略。
                     RTCMODERTC模式选择。 
0  32 位计数器模式
      1 日历模式。在日历模式和计数器模式之间的切换会重置实时时钟;计数器模式切换到日历模式会将秒、分、小时、星期和年清零,将日期和月份置 1 。实时时钟寄存器需要后来被软件设置。 RT0PS RT1PS 也会被清零。
     RTCRDY 实时时钟准备位  
0 实时时钟值在转换过渡(日历模式)
 1   实时时钟值可被安全读取(日历模式)。在计数器模式, RTCRDY 保持清除。
     RTCSSEL 实时时钟源选择位。选择时钟源输入到 RTC/32 计数器。在 RTC 日历模式这两位是不考虑的,其输入默认是 RT1PS 的输出。     
 00  ACLK 
     01  SMLK    
 10 RT1PS 输出    
   11  RT1PS 输出
     RTCTEV RTC 时间事件指示

 

RTC模式
RTCTEV的值
内部中断
 
 
计数器模式
00
8位溢出
01
16位溢出
10
24位溢出
11
32位溢出
 
日历模式
00
分钟改变
01
小时改变
10
午夜(00:00
11
白天(12:00

 

 
 
RTCCTL2 实时时钟控制寄存器rw-(0)表示读写为0
 八、实时时钟RTC_A
                     RTCCALS RTC 校准标志  
频率调整下降
  频率调整上升  
                     RTCCAL RTC 频率校准位  
每个 LSB 位代表大约 +4PPM(RTCCALS=1)  -2PPM(RTCCALS=0) 调整频率。
 
RTCCTL3 实时时钟控制寄存器3
八、实时时钟RTC_A
                     RTCCALF RTC 校准频率        校准测量时选择频率输出到 RTCCLK 引脚( P2.6 )上。相对应的端口必须配置为外围模块功能(即 P2SEL=BIT6 )。 RTCCLK 在计数模式不可用,此时保持为低且 RTCCALF 位的值不确定。  
00:没有频率输出到RTCCLK引脚 
01512HZ
10256HZ
111HZ
RTCPS0CTL    预分频定时器 0 控制寄存器 (16 位寄存器 )
八、实时时钟RTC_A
                     RT0SSEL 预分频定时器 0 时钟源选择位。选择时钟源输入到 RT0PS  计数器。在 RTC 日历模式该位不用关心,因为 RT0PS 时钟输入自动设置到 ACLK 32.768KHZ )。
      0 ACLK      
1 SMCLK
     RT0PSDIV 预分频定时器 0 分频,这些位控制 RT0PS 计数器的分频。在 RTC 日历模式对于 RT0PS RT1PS 这些位是不用关心的,因为 RT0PS 时钟输出自动设置到 256 分频。 RT1PS 时钟输出自动设置到 128 分频。
                                 000-111 分别表示 2 4 8 16 32 64 128 256 分频
     RT0PSHOLD 预分频定时器 0 保持位。在 RTC 日历模式这些位是不关心的。 RTCHOLD 置位时, RT0PS 停止工作。
                     RT0IP 预分频器 0 中断间隔。
000-111 分别表示 2 4 8 16 32 64 128 256 分频
                     RT0PSIE 预分频定时器 0 中断允许      
 0 中断不允许    
   1 中断允许  
     RT0PSIFG 预分频定时器 0 中断标志    
   0 没有定时事件发生   
       1 有定时事件发生
RTCPS1CTL 预分频定时器1控制寄存器(16位寄存器)
八、实时时钟RTC_A
 
RT1SSEL 预分频定时器 1 时钟源选择位。选择时钟源输入到 RT1PS  计数器。在 RTC 日历模式该位不用关心,因为 RT1PS 时钟输入自动设置为 RT0PS 的输出。
      00 ACLK      
01 SMCLK
10 RT0PS 输出  
11 RT0PS 输出  
 
其余项同RTCPS0CTL
 
 
 
 
上面的都为控制寄存器,操作比较复杂,下面讲到的都是数值寄存器。
                    RTCNT1   RTC 计数寄存器 1 ,计时器模式   
RTCNT2  RTC 计数寄存器 2 ,计数器模式   
RTCNT3 RTC 计数寄存器 3 ,计数器模式   
RTCNT4 RTC 计数寄存器 4 ,计数器模式
RTCSEC   秒寄存器。 BCD/BIN
                  先说明一下BCD/BIN的意思(下面同理)
            前面提到可以控制日历模式的数值寄存器中的数值用BCD码或者二进制码表示。以RTCSEC为例:
当选作二进制模式时:(低6位就可以表示秒1-60
八、实时时钟RTC_A
当选作BCD模式时:(低4位表示秒的各位0-94-6位表示秒的十位0-6,高位不用时默认为0
八、实时时钟RTC_A
RTCMIN    分寄存器,   BCD/BIN
RTCHOUR   时寄存器, BCD/BIN 
RTCDOW   星期日数寄存器,因为只有 1-7 ,所以无所谓 BCD/BIN   
RTCDAY   日寄存器, BCD/BIN  
RTCMON  月寄存器, BCD/BIN    
RTCYEARL   年低字节寄存器,个年位以及十年位, BCD/BIN  
 RTCYEARH   年高字节寄存器,百年位以及千年位, BCD/BIN  
RTCAMIN  分闹铃寄存器, BCD/BIN  
RTCAHOUR   时闹铃寄存器, BCD/BIN  
RTCADOW   星期闹铃寄存器
RTCADAY   日闹铃寄存器, BCD/BIN  
//上述4个闹钟寄存器的最高位都为使能位AE,置位时相应寄存器才有效
RT0PS   预分频定时器 0 计数值   
RT1PS    预分频定时器 1 计数值
RTCIV  中断向量值寄存器( 16 位寄存器)
八、实时时钟RTC_A
8.3 RTC的各种操作流程
 
              8.3.1 计时器模式
(1).   RTCMODE位置0,进入32位计时器模式;
从日历模式切换到计数器模式会将计数值寄存器( RCTNT1 RCTNT2 RCTNT3 RCTNT4 )和预换算计数器( RT0PS RT1PS )全部清零
(2).   选择时钟源,并设计二级分频;
计数器的时钟可源于 ACLK SMCLK 或者是 RT1PS 的输出。当使用 RT1PS 的输出作为计数源的时候,一定要先将 RT0PS RT1PS HOLD 位清零,使其可以正常工作,然后再分别配置二者的分频数。
再者,两个预分频器 RT0PS RT1PS 也可以作为独立的计数器来用(级联成 16 位也是可以的)。通过 RT0IP RT1IP 可以设置间隔。比如,选择 ACLK 32768HZ 作为时钟,间隔设置为 256 ,也就是说每当计数器计到 32768/256=128 的整数倍时,该标志位就会置位。
(3).            32位计数器是由48位计数器级联而成, 这能提供 8 位、 16 位、 24 位、 32 位溢出间隔。 RTCTEV 位选择触发哪一个溢出间隔,通过设置 RTCTEVIE 位,一个 RTCTEV 发生能够触发一个中断。计数器 RTCNT1 RTCNT4 ,每一个都可以单独的访问,并可能被写入。
(4).            如何关闭计数器。
为了简单一点,把所有 HOLD 位都置位,则可以保证在任何情况下都可以关闭 32 位计数器。
                                           注意: 对计数值寄存器写时,立即生效。
                                                         读时,如果该时钟与 CPU 时钟不同步,则需要暂停计数器来读数。或者通过多次读取,来软件判断哪个是正确值。
                                  
 
              8.3.2 日历模式 
RTCMODE 置位的时候,日历模式就被选中了。在日历模式中,实时时钟模块可选择以 BCD 码或者是十六进制提供秒、分、小时、星期、日期、月份和年份。日历会自动计算是否是闰年,这个算法可以精确到 1901 年到 2099 年。
(1).   时钟和预分频。
RT0PS 必须源于 ACLK ACLK 必须是 32768Hz ,。  RT0PS 会自动进行 256 分频,然后其输出再接 RT1PS RT1PS 在被自动 128 分频,最后提供的时钟信号就是间隔一秒了。从计数器模式切换到日历模式时,会将秒、分、小时、星期、年份全部置清零,会将日期和月份全部置 1 。另外, RT0PS RT1PS 也会被清零。(这里把这些状态暂定义为默认复位状态)  
(2).   日历寄存器编码格式。
RTCBCD=1 时,日历寄存器就会被选为 BCD 码格式。必须在时间设置之前选择好格式。改变 RTCBCD 的状态会使进入默认复位状态。
          在日历模式下, RT0SSEL RT1SSEL RT0PSDIV RT1PSDIV RT0PSHOLD RT1PSHOLD RTCSSEL  位都可以被忽略。置位 RTCHOLD 则会停止实时计数器、分频计数器和 RT0PS  RT1PS
(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 位来暂停闹钟功能。
 
              8.3.3 读写日历模式下的RTC寄存器
                                    因为系统时钟实际上是和实时时钟的时钟源是异步的,因此在进入实时时钟寄存器的时候要格外小心。  
在日历模式下,实时时钟寄存器每秒钟更新一次。为了防止在更新的时候读取实时时钟数据而造成错误数据的读取,系统设立了一个禁止读取的区域。每次 RTC 寄存器更新的那一刹那,左右 1/256s 被划为禁止读写的区域。 RTCRDY 位用来指示这个时间区域。 RTCRDY 0 时,表明处于这一区域;置 1 时表明在这一区域之外,可以发生读写。
                一个简单而安全读取实时时钟寄存器的方法是利用 RTCRDYIFG 中断标志位。设置 RTCRDYIE 使能 RTCRDYIFG 中断。一旦中断使能,在 RTCRDY 位上升沿的时候将会产生中断,致使 RTCRDYIFG 被置位。这样,我们几乎有一秒钟的安全时间去读写任一个寄存器。当中断得到响应的时候, RTCRDYIFG 会自动复位,当然也可以软件复位。
   8.3.4 RTC中断表
(1).    每一个中断标志都配有相应的中断使能
(2).    请注意: RTCTE 定义的时间事件(计时模式和日历模式不同)
(3).    对于 RT0PSIFG RT1PSIFG 标志位,举一个例子:
通过 RT0IP 位,可以选择地让 RT0PSIFG 位用来生成间接中断。在日历模式下, RT0PS 的时钟源是 32768Hz ACLK ,所以通过 RT0IP 控制中断间隔可以产生 16384Hz 8192Hz 4096Hz 2048Hz 1024Hz 512Hz 256Hz 128 Hz 的时间间隔。设置 RT0PSIE 位可以使能中断。
八、实时时钟RTC_A
             
       8.3.5 RTC校准
(1).    P2.6 设定为输出状态,并声明有特殊功能;
P2.6 RTCCLK 的输出引脚
(2).    通过设置 RTCCTL3 寄存器中的 RTCCALF 来设置 P2.6 输出信号的频率;
(3).    精确测量该频率,然后计算误差;
(4).    最后设置 RTCCTL2 寄存器,来调节频率增高或降低多少。
PPM 表示百万分之一所输出的频率;
 
         注意: 校准设置发生改变时,在 RTCCLK 引脚观察 512Hz 256Hz 的输出频率是不会有影响的。而校准发生改变时, 1Hz 的输出频率是有影响的