电子说
RTC(Real-Time Clock) 实时时钟。
RTC是集成电路,通常称为时钟芯片。在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能正常工作(通常采用后备电池供电)。
它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768kHz 晶体和电阻电容等,并且具有闹钟的功能。
本篇主要以Cortex-A9 soc为例讲解RTC的使用方法。
实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC可以通过STRB/LDRB 指令将8位BCD码数据送至CPU。这些BCD数据包括秒、分、时、日期、星期、月和年。
RTC单元通过一个外部的32.768kHz 晶振提供时钟。
RTC具有定时报警的功能。
其功能说明如下:
1 -- 时钟数据采用BCD编码。
2 -- 能够对闰年的年月日进行自动处理。
3 -- 具有告警功能,当系统处于关机状态时,能产生警告中断。
4 -- 具有独立的电源输入。
5 -- 提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。
RTC Block Diagram
RTC在Linux中主要实现两种功能,分别是系统掉电后的时间日期维持和时间日期报警(类似定时器)。
「1)时间日期维持功能:」
主要是由RTC实时时钟控制寄存器RTCCON进行功能的使能控制,由节拍时间计数寄存器TICNT来产生节拍时间中断来实现实时操作系统功能相关的时间和实时同步。其中对时间日期的操作实际上是对BCD码操作,而BCD码则是由一系列的寄存器组成(BCD秒寄存器BCDSEC、BCD分寄存器BCDMIN、BCD小时寄存器BCDHOUR、BCD日期寄存器BCDDATE、BCD日寄存器BCDDAY、BCD月寄存器BCDMON、BCD年寄存器BCDYEAR)。
「2)报警功能:」
主要由RTC报警控制寄存器RTC ALM进行功能使能控制,并产生报警中断。报警时间日期的设置也是对一系列的寄存器进行操作(报警秒数据寄存器ALMSEC、报警分钟数据寄存器ALMMIN、报警小时数据寄存器ALMHOUR、报警日期数据寄存器ALMDATE、报警月数据寄存器ALMMON、报警年数据寄存器ALMYEAR)。
「3)闰年发生器」
可以根据BCDDAY、BCDMON和BCDEEAR的值自动计算闰年。
备用电池可以驱动RTC逻辑。备用电池通过RTCVDD引脚向RTC块,即使系统电源关闭。如果系统关闭,您应该阻止CPU和RTC逻辑。为了减少功耗,备用电池单独驱动振荡电路和BCD计数器。
RTC在断电模式或正常运行模式都可以在执行的时间产生一个ALARM_INT 和ALARM_WK信号。在正常工作模式下,它会产生ALARM_INT。在断电模式下,它会ALARM_WK以及ALARM_INT信号。RTC报警寄存器(RTCALM)确定报警启用/禁用状态和报警时间设置的条件。
32.768 kHz X-Tal Connection Example
晶振时钟频率 32.768 kHz。
引脚连接图:由电路图可知,只连接了RTC振荡器时钟输入引脚XT_RTC_I 。
寄存器组
设置对应的bit为1就可以清除中断。
RTCCON | 位 | 描述 | 复位值 |
---|---|---|---|
保留 | [31:10] | 保留 | 0 |
CLKOUTEN | [9] | 使能RTC通过XRTCCLKO输出 0 disable 1 enbale | 0 |
TICEN | [8] | 嘀嗒计时器0 = 禁止1 = 使能 | 0 |
TICCKSEL | [7:4] | 嘀嗒计时器子时钟源选择**「4'b0000 = 32768 Hz」** 4'b0001 = 16384 Hz4'b0010 = 8192 Hz4'b0011 = 4096 Hz4'b0100 = 2048 Hz4'b0101 =1024 Hz4'b0110 =512 Hz4'b0111 =256 Hz4'b1000 =128 Hz4'b1001 =64 Hz4'b1010 =32 Hz 4'b1011 =16 Hz4'b1100 =8 Hz4'b1101 =4 Hz4'b1110 =2 Hz4'b1111 =1 Hz | 4'b0000 |
CLKRST | [3] | RTC时钟计数复位0 = 不复位1 = 复位 0 | |
CNTSEL | [2] | BCD计数选择 0 = 分配 BCD 计数 1 = 保留 | 0 |
CLKSEL | [1] | BCD 时钟选择0 = XTAL 1/2 divided clock1 = 保留(XTAL 供频) | 0 |
RTCEN | [0] | RTC控制使能0 = 禁止1 = 使能 | 0 |
「举例:」 我们要将当前时间设置为 「2020年11月11日, 15:24:50」 。
1) 先将RTC控制使能开启,即RTCCON[0]置为1;2)然后将时间对应的BCD格式数值,设置到应对的寄存器,BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC;3) 将RTCCON[0]置为0,防止误操作修改了时间;4)如果我们要访问当前时间,可以直接读取寄存器BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC。
void rtc_init(void)
{
RTCCON = 1;//使能RTC控制写功能
RTC.BCDYEAR = 0x20;// 2020年11月11日, 15:24:50.以BCD码格式写入
RTC.BCDMON = 0x11;
RTC.BCDDAY = 0x11;
RTC.BCDHOUR = 0x15;
RTC.BCDMIN = 0x24;
RTC.BCDSEC = 0x50;
RTCCON = 0;//关闭RTC控制写功能
}
全部0条评论
快来发表一下你的评论吧 !