RTC(Real-Time Clock) 实时时钟。RTC是集成电路,通常称为时钟芯片。在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768kHz 晶体和电阻电容等。

一、RTC 控制器

实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC可以通过STRB/LDRB 指令将8位BCD码数据送至CPU。这些BCD数据包括秒、分、时、日期、星期、月和年。RTC单元通过一个外部的32.768kHz 晶振提供时钟。RTC具有定时报警的功能。

其功能说明如下:

1 -- 时钟数据采用BCD编码。

2 -- 能够对闰年的年月日进行自动处理。

3 -- 具有告警功能,当系统处于关机状态时,能产生警告中断。

4 -- 具有独立的电源输入。

5 -- 提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。

二、RTC 控制器寄存器详解

1 、Time Tick Generator 

下面是示例程序:

头文件定义:

[cpp] view plaincopy
  1. /**********************************RTC independ register********************************/
  2. #define     RTCINTP         __REG(0X10070030)
  3. #define     RTCCON          __REG(0X10070040)
  4. #define     TICCNT          __REG(0X10070044)
  5. #define     CURTICCNT       __REG(0X10070090)
  6. typedef struct {
  7. unsigned int ALM;
  8. unsigned int SEC;
  9. unsigned int MIN;
  10. unsigned int HOUR;
  11. unsigned int DAY;
  12. unsigned int MON;
  13. unsigned int YEAR;
  14. }rtclam;
  15. #define     RTCALM (* (volatile rtclam *)0X10070050)
  16. typedef struct {
  17. unsigned int BCDSEC;
  18. unsigned int BCDMIN;
  19. unsigned int BCDHOUR;
  20. unsigned int BCDWEEK;
  21. unsigned int BCDDAY;
  22. unsigned int BCDMON;
  23. unsigned int BCDYEAR;
  24. }rtcbcd;
  25. #define     RTC (* (volatile rtcbcd *)0X10070070)

C程序如下:

[cpp] view plaincopy
  1. #include "exynos_4412.h"
  2. void mydelay_ms(int time)
  3. {
  4. int i, j;
  5. while(time--)
  6. {
  7. for (i = 0; i < 5; i++)
  8. for (j = 0; j < 514; j++);
  9. }
  10. }
  11. //*(volatile unsigned int *)(0x11000c20) = 0;
  12. /*
  13. *  裸机代码,不同于LINUX 应用层, 一定加循环控制
  14. */
  15. void do_irq(void)
  16. {
  17. static int a = 1;
  18. int irq_num;
  19. irq_num = CPU0.ICCIAR&0x3ff;  //获取中断号
  20. switch(irq_num)
  21. {
  22. case 57:
  23. printf("in the irq_handler\n");
  24. EXT_INT41_PEND = EXT_INT41_PEND |((0x1 << 1)); //清GPIO中断标志位
  25. ICDICPR.ICDICPR1 = ICDICPR.ICDICPR1 | (0x1 << 25); //清GIC中断标志位
  26. break;
  27. case 76:
  28. printf("in the alarm interrupt!\n");
  29. RTCINTP  = RTCINTP | (1 << 1);
  30. ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 12); //清GIC中断标志位
  31. break;
  32. case 77:
  33. printf("in the tic interrupt!\n");
  34. RTCINTP  = RTCINTP | (1 << 0);
  35. ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 13); //清GIC中断标志位
  36. break;
  37. }
  38. CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num; //清cpu中断标志位
  39. }
  40. void rtc_init(void)
  41. {
  42. RTCCON = 1;
  43. RTC.BCDYEAR = 0x16;
  44. RTC.BCDMON = 0x2;
  45. RTC.BCDDAY = 0x25;
  46. RTC.BCDHOUR = 0x15;
  47. RTC.BCDMIN = 0x24;
  48. RTC.BCDSEC = 0x50;
  49. RTCCON = 0;
  50. }
  51. void rtc_tic(void)
  52. {
  53. RTCCON = RTCCON & (~(0xf << 4)) | (1 << 8);
  54. TICCNT = 32768;
  55. ICDDCR = 1;  //使能分配器
  56. ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 13); //使能相应中断到分配器
  57. ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 8))|(0x1 << 8); //选择CPU接口
  58. CPU0.ICCPMR = 255; //中断屏蔽优先级
  59. CPU0.ICCICR = 1;   //使能中断到CPU
  60. }
  61. void rtc_alarm(void)
  62. {
  63. RTCALM.ALM = (1 << 6)|(1 << 0);
  64. RTCALM.SEC = 0x58;
  65. ICDDCR = 1;  //使能分配器
  66. ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 12); //使能相应中断到分配器
  67. ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 0))|(0x1 << 0); //选择CPU接口
  68. CPU0.ICCPMR = 255; //中断屏蔽优先级
  69. CPU0.ICCICR = 1;   //使能中断到CPU
  70. }
  71. int main (void)
  72. {
  73. rtc_init();
  74. rtc_alarm();
  75. rtc_tic();
  76. while(1)
  77. {
  78. printf("%x %x %x %x %x BCDSEC = %x\n",RTC.BCDYEAR,
  79. RTC.BCDMON,
  80. RTC.BCDDAY,
  81. RTC.BCDHOUR,
  82. RTC.BCDMIN,RTC.BCDSEC);
  83. mydelay_ms(1000);
  84. }
  85. return 0;
  86. }

执行结果如下:

[cpp] view plaincopy
  1. 16 2 5 15 24 BCDSEC = 50
  2. in the tic interrupt!
  3. 16 2 5 15 24 BCDSEC = 51
  4. in the tic interrupt!
  5. 16 2 5 15 24 BCDSEC = 52
  6. in the tic interrupt!
  7. 16 2 5 15 24 BCDSEC = 53
  8. 16 2 5 15 24 BCDSEC = 53
  9. 16 2 5 15 24 BCDSEC = 54
  10. in the tic interrupt!
  11. 16 2 5 15 24 BCDSEC = 55
  12. in the tic interrupt!
  13. 16 2 5 15 24 BCDSEC = 56
  14. in the tic interrupt!
  15. in the alarm interrupt!
  16. 16 2 5 15 24 BCDSEC = 58
  17. in the tic interrupt!
  18. 16 2 5 15 24 BCDSEC = 59
  19. in the tic interrupt!
  20. 16 2 5 15 25 BCDSEC = 0
  21. in the tic interrupt!
  22. 16 2 5 15 25 BCDSEC = 1
  23. in the tic interrupt!
  24. 16 2 5 15 25 BCDSEC = 2
  25. in the tic interrupt!
  26. 16 2 5 15 25 BCDSEC = 3
  27. in the tic interrupt!
  28. 16 2 5 15 25 BCDSEC = 4
  29. in the tic interrupt!
  30. 16 2 5 15 25 BCDSEC = 5
  31. in the tic interrupt!

Exynos4412裸机开发 —— RTC 实时时钟单元相关推荐

  1. 【正点原子STM32连载】 第二十七章 RTC实时时钟实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  2. 【正点原子FPGA连载】第三十一章RTC实时时钟数码管显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 【正点原子FPGA连载】 第二十四章 RTC实时时钟LCD显示实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  4. 【正点原子FPGA连载】第三十二章RTC实时时钟LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  5. Linux驱动开发: Linux下RTC实时时钟驱动

    Linux内核版本: 3.5 1.1 Linux下RTC时间的读写分析 1.1.1 系统时间与RTC实时时钟时间 Linux系统下包含两个时间:系统时间和RTC时间. 系统时间:是由主芯片的定时器进行 ...

  6. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

  7. (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  8. 十九、RTC实时时钟

    一..RTC实时时钟工作框图 RTC 由两个主要部分组成,第一部分(APB1 接口)用来和 APB1 总线相连.此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作.APB1 接口 ...

  9. STM32——RTC实时时钟原理+BKP寄存器原理

    一.RTC实时时钟特征与原理 1.RTC(Real Time Clock):实时时钟 2.RTC是个独立的BCD定时器/计数器.RTC提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性 ...

最新文章

  1. codevs 2075 yh女朋友的危机
  2. 根据客户中英文系统进入中英文页面
  3. 问题集锦(56-57)
  4. java kafka 分区_Kafka 主题和分区
  5. Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))
  6. numpy基础(part14)--积分
  7. Android开发之解决ListView和ScrollView滑动冲突的方法
  8. windows8.1下使用U盘安装Ubuntu双系统
  9. 《Python Cookbook 3rd》笔记(5.13):读写压缩文件
  10. 十、vue-router学习笔记——认识路由、vue-router基本使用、vue-router嵌套路由、vue-router参数传递、vue-router导航守卫、keep-alive
  11. “新一代互联网安全(BII)管理:理论与实践研讨会”在西安交通大学成功举办...
  12. java求出遍历二叉树的路径,102. 二叉树的层序遍历
  13. outlook与shairepoint2010 数据同步
  14. 中国地质大学英语语音学习笔记(二):辅音(辅音,与清辅音浊化)
  15. 大学生体育运动网页设计模板代码 DIV布局校园运动网页作业成品 HTML学校网页制作模板 学生简单体育运动网站设计成品
  16. xp系统修复 sfc /scannow 免光盘技巧
  17. 深入理解面向对象,面向对象3个特性7个原则6种关系
  18. 学硕与专硕,全日制与非全日制,定向与非定向......8大考研常识,你清楚吗?
  19. 蓝桥杯——使用烧录软件快速写中断
  20. java 虚拟机(JVM)

热门文章

  1. 不使用中间变量交换2个数据
  2. [转]程序实现调用迅雷(以C#为例)
  3. 餐厅数据分析报告_如何使用数据科学选择理想的餐厅设计场所
  4. sql 左联接 全联接_通过了解自我联接将您SQL技能提升到一个新的水平
  5. oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之异常处理
  6. 莫烦Pytorch神经网络第四章代码修改
  7. 1854. 人口最多的年份
  8. leetcode 740. 删除并获得点数(dp)
  9. gRPC快速入门记录
  10. 浏览器中插入富文本编辑器