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.

转换方式:

  1. static unsigned int num_2_bcd(unsigned int num)
  2. {
  3. )<<) | (num % ));
  4. }
  5.  
  6. static unsigned int bcd_2_num(unsigned int bcd)
  7. {
  8. )* + (bcd & (0x0f)));
  9. }

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

  1. #define RTC_BASE (0xE2800000)
  2. #define rINTP (*((volatile unsigned long *)(RTC_BASE + 0x30)))
  3. #define rRTCCON (*((volatile unsigned long *)(RTC_BASE + 0x40)))
  4. #define rTICCNT (*((volatile unsigned long *)(RTC_BASE + 0x44)))
  5. #define rRTCALM (*((volatile unsigned long *)(RTC_BASE + 0x50)))
  6. #define rALMSEC (*((volatile unsigned long *)(RTC_BASE + 0x54)))
  7. #define rALMMIN (*((volatile unsigned long *)(RTC_BASE + 0x58)))
  8. #define rALMHOUR (*((volatile unsigned long *)(RTC_BASE + 0x5c)))
  9. #define rALMDATE (*((volatile unsigned long *)(RTC_BASE + 0x60)))
  10. #define rALMMON (*((volatile unsigned long *)(RTC_BASE + 0x64)))
  11. #define rALMYEAR (*((volatile unsigned long *)(RTC_BASE + 0x68)))
  12. #define rRTCRST (*((volatile unsigned long *)(RTC_BASE + 0x6c)))
  13. #define rBCDSEC (*((volatile unsigned long *)(RTC_BASE + 0x70)))
  14. #define rBCDMIN (*((volatile unsigned long *)(RTC_BASE + 0x74)))
  15. #define rBCDHOUR (*((volatile unsigned long *)(RTC_BASE + 0x78)))
  16. #define rBCDDATE (*((volatile unsigned long *)(RTC_BASE + 0x7c)))
  17. #define rBCDDAY (*((volatile unsigned long *)(RTC_BASE + 0x80)))
  18. #define rBCDMON (*((volatile unsigned long *)(RTC_BASE + 0x84)))
  19. #define rBCDYEAR (*((volatile unsigned long *)(RTC_BASE + 0x88)))
  20. #define rCURTICCNT (*((volatile unsigned long *)(RTC_BASE + 0x90)))
  21. #define rRTCLVD (*((volatile unsigned long *)(RTC_BASE + 0x94)))
  22.  
  23. typedef struct rtc_time{
  24. unsigned int year;
  25. unsigned int mon;
  26. unsigned int day;
  27. unsigned int hour;
  28. unsigned int min;
  29. unsigned int sec;
  30. unsigned int date;
  31. }rtc_time;
  32.  
  33. static unsigned int num_2_bcd(unsigned int num)
  34. {
  35. ) << ) | (num % );
  36. }
  37.  
  38. static unsigned int bcd_2_num(unsigned int bcd)
  39. {
  40. ) * ) + (bcd & 0x0f);
  41. }
  42.  
  43. void rtc_set_time(rtc_time t)
  44. {
  45. // 开启RTC设置
  46. rRTCCON |= << ;
  47.  
  48. rBCDSEC = num_2_bcd(t.sec);
  49. rBCDMIN = num_2_bcd(t.min);
  50. rBCDHOUR = num_2_bcd(t.hour);
  51. rBCDDAY = num_2_bcd(t.day);
  52. rBCDDATE = num_2_bcd(t.date);
  53. rBCDMON = num_2_bcd(t.mon);
  54. rBCDYEAR = num_2_bcd(t.year);
  55.  
  56. // 关闭RTC设置
  57. rRTCCON &= ~( << );
  58. }
  59.  
  60. void rtc_get_time(rtc_time *t)
  61. {
  62. // 开启RTC设置
  63. rRTCCON |= << ;
  64.  
  65. t->sec = bcd_2_num(rBCDSEC);
  66. t->min = bcd_2_num(rBCDMIN);
  67. t->hour = bcd_2_num(rBCDHOUR);
  68. t->day = bcd_2_num(rBCDDAY);
  69. t->date = bcd_2_num(rBCDDATE);
  70. t->mon = bcd_2_num(rBCDMON);
  71. t->year = bcd_2_num(rBCDYEAR);
  72.  
  73. // 关闭RTC设置
  74. rRTCCON &= ~( << );
  75. }

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

  1. void rtc_sec_alarm()
  2. {
  3. rALMSEC = num_2_bcd();  // 这样在每分钟的 13 秒都会发出ALRM中断
  4.  
  5. rRTCALM |= ( << ) | ( << );
  6. }
  7.  
  8. void isr_rtc_sec()
  9. {
  10. printf("isr_rtc_sec\n");
  11.  
  12. intc_clearvectaddr();
  13. rINTP |= ( << );
  14. }

裸机——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. C语言函数调用简简介

    1.函数的声明: 在编写程序时,首先要对函数进行声明,然后对函数进行定义: 函数的声明是要让编译器知道函数的名称.参数.返回值类型等信息: 函数的定义是要让编译器知道函数的功能: 函数声明的格式由函数 ...

  2. 夜色的 cocos2d-x 开发笔记 03

    本章添加敌人,首先我们在.h文件里添加新的方法 之后进入.cpp文件,写出方法内容 当然还要调用一次,我把这个方法添加在了这里,也就是和发子弹是同步的,当然想要多久调用一次大家可以自己调整 运行一下 ...

  3. 一、Dapper基本操作

    参考资料:Cooper Liu 毒逆天 一.Dapper安装 添加引用-->NuGet管理-->搜索Dapper-->安装 二.新建表 --创建一个员工表 create table ...

  4. 图片延迟插件 Jquery.lazyload.min.js

    当一个页面打开的图片太多,我们可以用jquery的一个延迟加载插件.名为:jquery.lazyload.min.js 使用非常简单,如下: <div style="height:70 ...

  5. nginx的安装及简单负载均衡配置

    Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性.本人目前所在公司也使用nginx,主要用来做负载均衡服务器.同时也可以作为邮件代理服务器. 1. nginx的安装.本 ...

  6. ASP.NET Core - VSCode安装和配置

    在深入了解ASP.NET Core之前先研究了下主要的两个开发工具(VS 2015和VS Code), VS 2015对Core的支持已经相当的完备,很多操作得到简化用起来很是方便.VS Code是微 ...

  7. cesium 加载kml polygon和mark(贴地形terrain效果)

    key code: var options = { camera : viewer.scene.camera, canvas : viewer.scene.canvas, clampToGround: ...

  8. POJ-2151 Check the difficulty of problems---概率DP好题

    题目链接: https://vjudge.net/problem/POJ-2151 题目大意: ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 问 每队至少解出一题且冠军队至少解出N ...

  9. RandomUserAgentMiddleware练习

    # 请求头添加随机user-agent class RandomUserAgentMiddleware(object): def __init__(self, agents): self.agent ...

  10. LSD-SLAM使用方法

    preparation:按照官網步驟完成LSD的安裝. 1.testdata:need images file & cameraCalibration.cfg 2.開啟終端機    -> ...