C/C++教程

ARM接口技术——RTC实时时钟

本文主要是介绍ARM接口技术——RTC实时时钟,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

RTC

RTC简介

RTC(Real Time Clock)即实时时钟,它是一个可以为系统提供精确的时间基准的元器件;

与一般元器件使用的时钟源不同,RTC一般采用精度较高的晶振作为时钟源,因为它对精度要求较高;

一般RTC为了在主电源掉电时还可以工作,需要额外加电池供电。

 

Exynos4412下的RTC控制器

Overview:

有以下关键信息:

  • Exynos4412集成的RTC需要外部通过一个32.768 kHz的高精度时钟晶振;
  • 提供BCD码,BCD码是用4 Bit 表示一个十进制数,比如12的二进制是1100,用BCD码表示就是0001 0010;
  • 提供闰年判断;
  • 提供闹铃的功能,即它不但有实际的时间,还可以设定一个时间,时间到了可以产生中断或者从低功耗模式“叫醒”;
  • 提供独立的电源引脚,一般MCU和SOC都有,但是开发板没有接入电池,也就没有使用到这个独立电源引脚;

 

RTC获取当前时间实验

RTC实验分析

RTC实时时钟框图:

 

  • 前面提到它的工作需要外部提供一个32.768 kHz的时钟晶振,然后在RTC内部有一个2^15分频的分频器,分频之后的频率正好是1Hz,这个时钟就可以给秒寄存器;
  • 秒寄存器接收到时钟后会自增,加到60的时候就会发给分寄存器,以此类推;
  • 此外还有Leap Year Generator,可以支持闰年的计算,Alarm Generator,闹铃功能。

 

RTC相关寄存器:

 

有以下寄存器:

  • BCD前缀的寄存器,用于存储实际的时间,把时间按照BCD码存储的时间信息,根据时间单位拆分成7个寄存器分别存储,这些寄存器需要用于读取;
  • ALM前缀的寄存器,用于闹铃的功能,在这些寄存器设定一个时间,当实际的时间到达ALM时间可以提供闹铃功能,这里的实验不用;
  • INTP寄存器用于挂起中断,与ALM功能一起使用,这里也用不上;
  • RTCCON用于配置RTC,需要配置;
  • 还有其它的暂时用不到。

 

需要关注的寄存器:

BCDXXX:

 

以BCDYEAR为例,它使用BCD码表示实际时间的年,只用了低12位;

比如 0000 0010 0010,即022,可以用来表示2022年;其它的BCDXXX寄存器同理。


 

RTCCON:

 

RTCCON寄存器只使用了低10位,1-9位都使用默认设置;

只需要关注第0位CTLEN:打开RTC时钟。


 

RTC实验代码

#include "exynos_4412.h"

void RTC_Init()
{
    RTCCON |= 1; /* 打开RTC设置 */

    /* 校准时间 */
    RTC.BCDYEAR = 0x22;     /* 设为022,BCD码: 0000 0010 0010 */
    RTC.BCDMON = 0x04;
    RTC.BCDDAY = 0x04;      /* week,它的日和星期弄反了 */    
    RTC.BCDWEEK = 0x28;     /* day */
    RTC.BCDHOUR = 0x02;
    RTC.BCDMIN = 0x07;
    RTC.BCDSEC = 0x50;

    RTCCON &= (~1); /* 禁止RTC设置 */
}

int main()
{
    RTC_Init();
    while(1)
    {
        printf("20%x-%x-%x %x:%x:%x", RTC.BCDYEAR,  RTC.BCDMON, RTC.BCDWEEK, RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC);
    }
    return 0;
}

 

这篇关于ARM接口技术——RTC实时时钟的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!