1、实时时钟(RTC),SX1316031王茵梦,RTC概述,实时时钟(RTC)是一组计数器,它用于测量时间,在系统掉电时也可以继续运行。RTC在掉电模式下消耗的功率极低。LPC1700系列Cortex-M3微控制器中的RTC时钟源可以是单独的32KHz的时钟,它可以产生一个1Hz内部时基。RTC由自带的电源引脚Vbat供电,Vbat可以与蓄电池相连,也可以与外部3.3V电源引脚相连或保持断开。,RTC引脚和电源域的总体设计:,RTC简介,LPC1700系列ARM内置RTC模块。采用外部独立32.768KHz晶振,用于产生1Hz的内部时钟基准值,它具有如下特性:,超低功耗,支持电池供电系统,校准计
2、数器可对时间进行校准,RTC电源与芯片的其他部分分离,专门的32KHz超低功耗振荡器,带日历和时钟功能,计数器增量中断和报警中断功能,特点,目 录,RTC引脚描述:,LPC1700系列实时时钟RTC有三个引脚:RTCX1为RTC振荡器电路的输入引脚。 RTCX2为RTC振荡器电路的输出引脚。 VBAT为RTC电源:通常与外部3V蓄电池相连。如果该引脚没有供电,则RTC仍由内部供电(如果有VDD(3V3)。如果不使用RTC,RTCX1/2引脚可悬空。,RTC功能模块:,CLK1,CCLK,使用下列寄存器来配置RTC:(1)功率:在寄存器PCONP中置位PCRTC。注意:复位后,RTC被使能。 (
3、2)时钟:RTC将RTC振荡器提供的1Hz时钟信号作为它唯一的时钟源。访问寄存器时外设时钟的频率为CCLK/8。 (3)中断:利用相应的中断置位使能寄存器来使能NVIC中的中断。,RTC寄存器大致可分为五类:,RTC内部结构,寄存器描述,实时时钟寄存器映射,实时时钟寄存器映射,1、混合寄存器组,(1)中断位置寄存器,(2)时钟控制寄存器,(3)计数器增量中断寄存器,(4)报警屏蔽寄存器,(5)RTC辅助控制寄存器,(6)RTC辅助使能寄存器,2、完整时间寄存器,(1)完整时间寄存器0,(2)完整时间寄存器1,(3)完整时间寄存器2,3、时间计数器组,(1)闰年计算,RTC执行一个简单的位比较,
4、看年计数器的最低两位是否为0。如果为0,那么RTC认为这一年为闰年。RTC认为所有能被4整出的年份都为闰年。这个算法从1901年到2099年都是准确的,但在2100年出错,2100年并不是闰年。闰年对RTC的影响只是改变2月份的天数、日期(月)和年的计数值。,(2)校准寄存器,RTC内部结构,RTC寄存器结构,RTC中断,中断的产生由中断位置寄存器(ILR)、计数器增量中断寄存器(CIIR)、报警寄存器和报警屏蔽寄存器(AMR)控制。只有转换到中断状态才能产生中断。ILR单独使能CIIR和AMR中断。CIIR中的每个位都对应一个时间计数器。如果使能其中某一位,那么该位对应的计数器每增加一次就产
5、生一次中断。报警寄存器允许用户设定产生中断的日期和时间。AMR提供一个屏蔽报警比较的机制。当所有非屏蔽报警寄存器均与它们对应的时间计数器的值匹配时,就会产生中断。,RTC校准过程,校准逻辑会定时通过使计数器的值增加2对时间计数器进行调整。这样就可以在典型电压和适当的温度下对RTC振荡器直接进行校准,无需通过外部仪器来调节RTC振荡器。向后校准 向前校准,目 录,RTC基本操作,RTC的基本操作大致可分为两类:,RTC基本操作,RTC基本操作,设置RTC时间为“2014-3-12,星期三,11:11:11”:,DOM,HOUR,MIN,MONTH,SEC,YEAR,DOW,11,03,12,03
6、,2014,11,11,在RTC中,有8个与时间相关的寄存器。在初始化年、月、日时间计数器时,一般设置7个寄存器:SEC、MIN、HOUR、DOM、DOW、MONTH、YEAR。,RTCYEAR = 2014; RTCMONTH = 03; RTCDOM = 12; RTCDOW = 3; RTCHOUR = 11; RTCMIN = 11; RTCSEC = 11;,RTC基本操作,此时秒增量中断,增量中断产生,中断信号,操作代码:,CIIR = 0x01;,在RTC中,计数器增量中断寄存器(CIIR)中的每一位都对应着一个时间计数器,如果使能其中的某一位,那么改变所对应的时间计数器,每增加
7、一次,就会产生一次中断。,报警中断,RTC基本操作,报警寄存器允许用户设定产生中断的时间,当RTC的当前时间与报警时间相匹配时,就会引发报警中断。通过报警寄存器(AMR)来完成报警值的设定。,报警屏蔽寄存器 AMR,1,1,1,1,控制当前时间 是否与对应的 报警时间比较,报警中断,对应匹配,RTC基本操作,RTC的基本操作大致可分为两类:,RTC基本操作,LPC1700系列ARM的RTC模块有三组完整时间寄存CTIME,通常通过读取CTIME0和CTIME1来获取当前时间,时间读取,操作代码:,times = CTIME0; datas = CTMIE1; bak = (dates 16)
8、,RTC应用案例,主要步骤,RTC应用案例,部分程序代码RTC初始化,INT32U rtcInit (INT16U *pusRtcTime) RTCCCR = 0x0; /* 禁止时间计数器 */RTCILR = 0x03; /* 清除中断 */RTCCIIR = 0x1; /* 使能秒增量中断 */RTCAMR = 0xff; /* 禁止报警中断 */RTCYEAR = pusRtcTime0; /* 设置时间计数寄存器 */RTCMONTH = pusRtcTime1;RTCDOM = pusRtcTime2;RTCDOW = pusRtcTime3;RTCHOUR = pusRtcTim
9、e4;RTCMIN = pusRtcTime5;RTCSEC = pusRtcTime6; zyIsrSet(NVIC_RTC, (unsigned long)rtcIntIsr,PRIO_TWO); /* 设置中断并使能 */RTCCCR = 0x01; /* 启动RTC */return (1); ,RTC应用案例,int main (void) INT16U usTimeSet7 = 2014 , 3, 12 , 3, 11, 11, 11; /*设定RTC的初始时间 */targetInit(); /* 硬件初始化 */pinInit(); /* 引脚初始化 */ rtcInit(us
10、TimeSet); /* RTC初始化 */keyInit(); /* 键盘初始化 */vicSysPconSet (3); /* 进入深入掉电模式 */while (1)targetInit(); /* 硬件初始化 */rtcTimeDisplay(); /* 刷新当前时间 */keyscan(); /* 键盘扫描 */vicSysPconSet(3); /* 再次进入深度掉电模式 */ ,部分程序代码RTC初始化,目 录,RTC总结,整体来说,LPC1700系列ARM的RTC模块操作比较简单,但需要注意以下几点:,芯片从掉电模式下被唤醒,需要对目标板重新初始化。,RTC的闰年计算比较简单,当年计数器的最低两位为0时,认为该年为闰年,如2100年时就会出错。,测试RTC的低功耗模式需脱机运行,且当芯片处于睡眠模式时只能采用ISP下载程序。,