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

发布者:AngelicGrace最新更新时间:2021-12-10 来源: eefocus关键字: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 

       

下面是示例程序:

头文件定义:

  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程序如下:

  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_handlern");  

  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 = %xn",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. }  

执行结果如下:

  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  

[1] [2]
关键字:Exynos4412  裸机开发  RTC 引用地址:Exynos4412裸机开发 —— RTC 实时时钟单元

上一篇:Exynos4412裸机开发——中断处理
下一篇:Exynos4412裸机开发 —— 看门狗定时器

推荐阅读最新更新时间:2024-11-17 12:14

Exynos4412裸机程序之操作ICache
一、首先普及一下什么是Cache 基于程序访问的局限性,在主存和CPU通用寄存器之前设置了一类高速的、容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU在一段时间内使用,这对提高程序的运行速度有很大的作用。这类介于主存和CPU之间的高速小容量存储器称作高速cache。比较常见的cache包括icache和dcache。 icache的使用比较简单,系统刚上电时,icache中的内容是无效的,并且icache的功能是关闭的,往CP15协处理器中的寄存器1的bit 写1可以启动icache,写0可以停止icache。icache关闭时,CPU每次取指都要读主存,性能非常低。因为icach
[单片机]
<font color='red'>Exynos4412</font><font color='red'>裸机</font>程序之操作ICache
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved