1. 首先晓得RTC的基本知识

  RTC被划分到timer,但RTC是面向时间点的。

  如果按照定时器的思路去思考,那么应该考虑 时间周期 和 计数值。

  RTC 不是面向时间点的,所以略有不同,

  时间周期,RTC通过自己独立的晶振提供,并且晶振的频率都为 32.768KHZ

  计数值,RTC的计数值不是用来定时,而是用来计时,RTC记录 年 月 日 时 分 秒 星期。(其中年是有一个基准值,如2000)

  此外,RTC一般有独立的电池,保证掉电后继续计时。

  整理下思路:

  我们知道对于timer,我们需要设置时间周期和计数值,

  但是对于RTC,时间周期已经设置好了,所以只需要考虑计数值。

  

2.对RTC计数值的设置

  在数据手册可以找到这张图

  可以看出

RTC计数值分为 年 月 日 时 分 秒 星期,每个都是用独立的寄存器保存。

  所以对RTC计数值的设置就是通过 Control Register 设置那几个寄存器。

  此外还需要知道 RTC 的时间使用 BCD 码表示,所以涉及 十进制和BCD码的转换

  

  BCD码就是对数字编码,使用类似字符串的方式表示数字,如 0x56 的BCD码意义是 56.

转换方式:

static unsigned int num_2_bcd(unsigned int num)
{
    )<<) | (num % ));
}

static unsigned int bcd_2_num(unsigned int bcd)
{
    )* + (bcd & (0x0f)));
}

  有了思路后,开始完成 读写RTC 时间的实验

#define     RTC_BASE     (0xE2800000)
#define        rINTP           (*((volatile unsigned long *)(RTC_BASE + 0x30)))
#define        rRTCCON         (*((volatile unsigned long *)(RTC_BASE + 0x40)))
#define        rTICCNT         (*((volatile unsigned long *)(RTC_BASE + 0x44)))
#define        rRTCALM         (*((volatile unsigned long *)(RTC_BASE + 0x50)))
#define        rALMSEC         (*((volatile unsigned long *)(RTC_BASE + 0x54)))
#define        rALMMIN         (*((volatile unsigned long *)(RTC_BASE + 0x58)))
#define        rALMHOUR       (*((volatile unsigned long *)(RTC_BASE + 0x5c)))
#define        rALMDATE     (*((volatile unsigned long *)(RTC_BASE + 0x60)))
#define        rALMMON         (*((volatile unsigned long *)(RTC_BASE + 0x64)))
#define        rALMYEAR       (*((volatile unsigned long *)(RTC_BASE + 0x68)))
#define        rRTCRST      (*((volatile unsigned long *)(RTC_BASE + 0x6c)))
#define        rBCDSEC         (*((volatile unsigned long *)(RTC_BASE + 0x70)))
#define        rBCDMIN        (*((volatile unsigned long *)(RTC_BASE + 0x74)))
#define        rBCDHOUR     (*((volatile unsigned long *)(RTC_BASE + 0x78)))
#define        rBCDDATE     (*((volatile unsigned long *)(RTC_BASE + 0x7c)))
#define        rBCDDAY      (*((volatile unsigned long *)(RTC_BASE + 0x80)))
#define        rBCDMON      (*((volatile unsigned long *)(RTC_BASE + 0x84)))
#define        rBCDYEAR     (*((volatile unsigned long *)(RTC_BASE + 0x88)))
#define        rCURTICCNT   (*((volatile unsigned long *)(RTC_BASE + 0x90)))
#define        rRTCLVD         (*((volatile unsigned long *)(RTC_BASE + 0x94)))

typedef struct rtc_time{
    unsigned int year;
    unsigned int mon;
    unsigned int day;
    unsigned int hour;
    unsigned int min;
    unsigned int sec;
    unsigned int date;
}rtc_time;

static unsigned int num_2_bcd(unsigned int num)
{
    ) << ) | (num % );
}

static unsigned int bcd_2_num(unsigned int bcd)
{
    ) * ) + (bcd & 0x0f);
}

void rtc_set_time(rtc_time t)
{
    // 开启RTC设置
    rRTCCON |=  << ;

    rBCDSEC = num_2_bcd(t.sec);
    rBCDMIN = num_2_bcd(t.min);
    rBCDHOUR = num_2_bcd(t.hour);
    rBCDDAY = num_2_bcd(t.day);
    rBCDDATE = num_2_bcd(t.date);
    rBCDMON = num_2_bcd(t.mon);
    rBCDYEAR = num_2_bcd(t.year);

    // 关闭RTC设置
    rRTCCON &= ~( << );
}

void rtc_get_time(rtc_time *t)
{
    // 开启RTC设置
    rRTCCON |=  << ;

    t->sec =    bcd_2_num(rBCDSEC);
    t->min =   bcd_2_num(rBCDMIN);
    t->hour =   bcd_2_num(rBCDHOUR);
    t->day =   bcd_2_num(rBCDDAY);
    t->date =   bcd_2_num(rBCDDATE);
    t->mon =   bcd_2_num(rBCDMON);
    t->year =   bcd_2_num(rBCDYEAR);

    // 关闭RTC设置
    rRTCCON &= ~( << );
}

从下面这张图中,还可以看出,RTC带有闹钟功能,能产生闹钟中断,现在来使用RTC闹钟功能

void rtc_sec_alarm()
{
    rALMSEC = num_2_bcd();  // 这样在每分钟的 13 秒都会发出ALRM中断

    rRTCALM |= ( << ) | ( << );
}

void isr_rtc_sec()
{
    printf("isr_rtc_sec\n");

    intc_clearvectaddr();
    rINTP |= ( << );
}

裸机——RTC的更多相关文章

  1. nrf51822裸机教程-RTC

    RTC0被协议栈使用了.所以在跑蓝牙程序的情况下.RTC0不能使用. RTC相关寄存器如下: EVTEN,EVTENSET,EVTENCLR. 这三个寄存器用来设置是否使能某个事件.(TICK,OVR ...

  2. 【ARM】2440裸机系列-RTC数字时钟

    功能 裸机程序,实现LCD显示数字时钟 主要代码   1)背景绘制 void Brush_ U32 c) { int x,y ; for ( y = 0 ; y < LCD_HEIGHT ; y ...

  3. mini2440裸机试炼之—RTC闹钟中断,节拍中断

    版权声明:博客地址:http://blog.csdn.net/muyang_ren.源代码能够在我的github上找看看 https://blog.csdn.net/muyang_ren/articl ...

  4. 13. 从0学ARM-Cortex-A9 RTC裸机程序编写

    一.RTC RTC(Real-Time Clock) 实时时钟. RTC是集成电路,通常称为时钟芯片.在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关 ...

  5. linux之I2C裸机驱动解析(转)

    1      硬件特性 1.1 概述 I2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数据线(SDA).由于I2C总线仅需要两根线,因此在电路板上占用的空间更少, ...

  6. S3C2416裸机开发系列19_Fatfs播放录像wav音频文件

    S3C2416裸机开发系列19 Fatfs播放录像wav音频文件 国际象棋男孩    1048272975 多媒体资源,一般都是以文件的形式存储在固化存储器中.Fatfs所支持的fat32为windo ...

  7. 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口

    前言   上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...

  8. STM32F746的RTC使用

    1.RTC模块采用低速晶振外接始终:32.768KHz,如下图所示 2.配置RTC模块: 其中,Fck_apre.Fck_spre始终上配置不容易理解, 如果想得到1Hz的始终频率,则需要将PERDI ...

  9. [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

    一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...

随机推荐

  1. hdu 3586 最小代价切断根与叶子联系

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 http://blog.csdn.net/woshi250hua/article/details ...

  2. es6-Set和Map数据结构

    Set 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. const s = new Set ...

  3. <Android 基础(六)> ActionBar

    介绍 Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作.界面导航等功能.使用ActionBar的好 ...

  4. 如何找到Android app启动activity和页面元素信息

    在实施app自动化的时候,我们需要知道app 的启动activity和页面元素信息,以此启动app和定位页面元素,那么如何在没有源码的情况下找打他们呢?当然是有好的工具啦,有Android sdk自带 ...

  5. Linux命令之查看服务进程(ps aux、ps -aux、ps -ef)的运用

    执行ps命令即可列出的是当前服务器进程的快照(时间点),如果想要实时动态的显示进程信息,就可以使用top命令. linux上进程有5种状态:  1. 运行(正在运行或在运行队列中等待)  2. 中断( ...

  6. 将caj转换成pdf

    1.工具准备 电脑一台 CAJViewer 7.2 foxit pdf reader [主是要拥有一个pdf的虚拟打印机,你也可以安装其他的可以取的pdf虚拟打印机的软件.] 2.步骤 (1)用CAJ ...

  7. webpack整体了解

    一.下载 新建一个文件夹,在cmd中npm init->npm install->npm install webpack --save-dev 下载完成之后,新建一个webpack.con ...

  8. 表单(三):select

    选择框的value属性 <select name='location' id='selLocation'> <option value='Sunnyvale,Ca'>Sunny ...

  9. 2018.8.15 AOP面向切面编程简单理解

    在Filter过滤器中 拦截器 表面上看 -拦截器帮我们封装了很多功能 拦截器优秀的设计,可拔插设计 aop思想 在struts2中 归纳总结

  10. 20145238-荆玉茗 《Java程序设计》第8周学习总结

    20145238 <Java程序设计>第8周学习总结 教材学习内容总结 第15章 通用API 15.1.1 ·java.util.logging包提供了日志功能相关类与接口,使用日志的起点 ...