Exynos4412裸机开发 —— RTC 实时时钟单元

 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
在CODE上查看代码片派生到我的代码片
  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.   
  7. typedef struct {  
  8.                 unsigned int ALM;  
  9.                 unsigned int SEC;  
  10.                 unsigned int MIN;  
  11.                 unsigned int HOUR;  
  12.                 unsigned int DAY;  
  13.                 unsigned int MON;  
  14.                 unsigned int YEAR;  
  15. }rtclam;  
  16.   
  17. #define     RTCALM (* (volatile rtclam *)0X10070050)  
  18.   
  19.   
  20. typedef struct {  
  21.   
  22.                 unsigned int BCDSEC;  
  23.                 unsigned int BCDMIN;  
  24.                 unsigned int BCDHOUR;  
  25.                 unsigned int BCDWEEK;  
  26.                 unsigned int BCDDAY;  
  27.                 unsigned int BCDMON;  
  28.                 unsigned int BCDYEAR;  
  29. }rtcbcd;  
  30. #define     RTC (* (volatile rtcbcd *)0X10070070)  

C程序如下:

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

执行结果如下:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  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!  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exynos4412裸机开发——中断处理

以KEY2控制LED3亮灭为例&#xff1a; 一、轮询方式 【0】检测按键k2&#xff0c;按键k2按下一次&#xff0c;灯LED2闪一次。 【1】查看原理图&#xff0c;连接引脚和控制逻辑 &#xff08;1&#xff09;按键k2 连接在GPX1_1引脚 &#xff08;2&#xff09;控制逻辑 k2 按…

远程WEB控制MP3播放器设计(基于mini2440)

网上有很多 基于mini2440的MP3播放器设计的资料&#xff0c;多是按键控制&#xff0c;这里博主做了些轻微改动&#xff0c;利用远程WEB来控制MP3播放&#xff0c;具体怎么实现&#xff0c;下面会给出&#xff0c;大家先看看效果&#xff1a; WEB界面&#xff1a; 后台运行&…

嵌入式数据库 SQLite 浅析

SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS&#xff0c;它可移植性好&#xff0c;很容易使用&#xff0c;很小&#xff0c;高效而且可靠。SQLite嵌入到使用它的应用程序中&#xff0c;它们共用相同的进程空间&#xff0c;而不是单独的一个进程。从外…

socket 请求Web服务器过程

HTTP协议只是一个应用层协议&#xff0c;它底层是通过TCP进行传输数据的。因此&#xff0c;浏览器访问Web服务器的过程必须先有“连接建立”的发生。 而有人或许会问&#xff1a;众所周知&#xff0c;HTTP协议有两大特性&#xff0c;一个是“无连接”性&#xff0c;一个是“无状…

有些事情现在不做一辈子就都不会做了

这句话最近一直印在我的脑海里。这句话最早是在Casperkid的百度空间里面看见的&#xff0c;那时他生日。作为师傅的刺&#xff08;道哥&#xff09;送了他自己写的一本《白帽子讲WEB安全》给他&#xff0c;并在扉页上写着这句话。那时一看到这句话&#xff0c;仿佛有种触电的感…

HTTP 数据包头解析

一、连接至Web服务器 一个客户端应用&#xff08;如Web浏览器&#xff09;打开到Web服务器的HTTP端口的一个套接字&#xff08;缺省为80&#xff09;。 例如&#xff1a;http://www.myweb.com:8080/index.html 在Java中&#xff0c;这将等同于代码&#xff1a; [java] view pla…

Shell 脚本中如何使用make命令

最近开发的项目中需要编写Shell脚本对整个工程进行自动化编译&#xff0c;即在Shell脚本中使用make命令来进行编译&#xff0c;下面回顾一下Shell脚本中如何使用make命令&#xff09; 在开发一个系统时&#xff0c;一般是将一个系统分成几个模块&#xff0c;这样做提高了系统的…

Shell 脚本知识回顾 (六) —— Shell 函数

一、Shell函数&#xff1a;Shell函数返回值、删除函数、在终端调用函数 函数可以让我们将一个复杂功能划分成若干模块&#xff0c;让程序结构更加清晰&#xff0c;代码重复利用率更高。像其他编程语言一样&#xff0c;Shell 也支持函数。Shell 函数必须先定义后使用。 Shell 函…

Shell 脚本知识回顾 (五) —— Shell 循环

一、Shell for循环 与其他编程语言类似&#xff0c;Shell支持for循环。 for循环一般格式为&#xff1a;for 变量 in 列表 docommand1command2...commandN done 列表是一组值&#xff08;数字、字符串等&#xff09;组成的序列&#xff0c;每个值通过空格分隔。每循环一次&…

Shell 脚本知识回顾 (四) —— Shell 命令及Shell 相关语句

一、Shell echo命令 echo是Shell的一个内部指令&#xff0c;用于在屏幕上打印出指定的字符串。命令格式&#xff1a;echo arg您可以使用echo实现更复杂的输出格式控制。 显示转义字符 echo "\"It is a test\""结果将是&#xff1a;"It is a test"…

Shell 脚本知识回顾 (三) —— 替换、运算符、字符串、数组

一、Shell替换&#xff1a;Shell变量替换&#xff0c;命令替换&#xff0c;转义字符 如果表达式中包含特殊字符&#xff0c;Shell 将会进行替换。例如&#xff0c;在双引号中使用变量就是一种替换&#xff0c;转义字符也是一种替换。 举个例子&#xff1a; [cpp] view plaincop…

Shell 脚本知识回顾 (二) —— Shell变量

一、Shell变量&#xff1a;Shell变量的定义、删除变量、只读变量、变量类型 Shell支持自定义变量。定义变量 定义变量时&#xff0c;变量名不加美元符号&#xff08;$&#xff09;&#xff0c;如&#xff1a; [cpp] view plaincopy variableName"value" 注意&…

Shell 脚本知识回顾 (一) —— 基础篇

一、Shell简介&#xff1a;什么是Shell&#xff0c;Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序&#xff0c;它是用户使用Unix/Linux的桥梁&#xff0c;用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言&#xff0c;又是一种程序设计语言。作为命令…

红帽集群RHCS

1、简介&#xff1a;RHCS是RedHatClusterSuite的缩写&#xff0c;也就是红帽子集群套件&#xff0c;RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合&#xff0c;它将集群系统中三大集群架构融合一体&#xff0c;可以给web应用、数据库应用…

Java 基础——数组解析

数组对于每一门编辑应语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。 Java语言中提供的数组是用来存储固定大小的同类型元素。 可以声明一个数组变量&#xff0c;如numbers[100]来代替直接声明100个独立变量number0&#xff0c;number…

《在你身边,为你设计》-哪位知道下载、在线阅读地址啊?

《在你身边&#xff0c;为你设计》-前端UI必读出自腾讯CDChttp://cdc.tencent.com/?p6761今天听同事说这本书写的非常好&#xff0c;改变了他关于前端UI的许多看法&#xff0c;可谓&#xff1a;醍醐灌顶。可惜我网上找了下都需要Money买&#xff0c;哪位有在线阅读、PDF下载地…

一、OpenStack架构

DashBoardHorizon提供WEB界面ComputerNova计算也就是虚拟机NetworkingNeutron提供给nova网络支持Object StorageSwift提供对象存储Block StorageCinder提供云硬盘给nova&#xff0c;同时备份到SwiftIdentity SserviceKeystone提供所有组件的认证Image ServiceGlance提供给nova镜…

Java 三大特性 —— 多态

Java中多态性的实现 一、什么是多态 1.面向对象的三大特性&#xff1a;封装、继承、多态。从一定角度来看&#xff0c;封装和继承几乎都是为多态而准备的。这是我们最后一个概念&#xff0c;也是最重要的知识点。 2.多态的定义&#xff1a;指允许不同类的对象对同一消息做出响应…

linux /proc/cpuinfo文件分析

为什么80%的码农都做不了架构师&#xff1f;>>> 基于不同指令集&#xff08;ISA&#xff09;的CPU产生的/proc/cpuinfo文件不一样&#xff0c;基于X86指令集CPU的/proc/cpuinfo文件包含如下内容&#xff1a; processor  &#xff1a; 0vendor_id  &#xff1a;…

Java 高级类(下) —— 内部类和匿名类

Java内部类&#xff08;Inner Class&#xff09;&#xff0c;类似的概念在C里也有&#xff0c;那就是嵌套类&#xff08;Nested Class&#xff09;&#xff0c;乍看上去内部类似乎有些多余&#xff0c;它的用处对于初学者来说可能并不是那么显著&#xff0c;但是随着对它的深入…