深入理解ARM体系架构(S3C6410)---rtc实例

发布者:CMOS最新更新时间:2016-06-23 来源: eefocus关键字:ARM  S3C6410)  rtc实例 手机看文章 扫描二维码
随时随地手机看文章
实时时钟(RTC)的主要功能是在系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。s3c6410内部集成了RTC模块,其内部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时,星期,日,月和年,表示时间的数值都是BCD码。

S2C6410中的闰年问题:

 

闰年产生器基于BCDDAY,BCDMOD,BCDYEAR从而能决定每月最后的日期是28,29,30,还是31。一个8位的计数器只能表示2个BCD数据,因此不能判断“00”结尾的年份是不是闰年。例如它不能判断1900和2000是不是闰年。为了解决这个问题,S3C6410中有一硬件逻辑来支持2000的闰年问题。因此S3C6410支持1901到2099年的范围。


读写操作:

 

在读BCD寄存器时,RTCCON寄存器0位必须至1,为了显示秒,分,小时,日,月,年,cpu必须从其对应的寄存器中取值(BCDSEC, BCDMIN, BCDHOUR,BCDDATE, BCDDAY, BCDMON, BCDYEAR)。多寄存器同时读取可能会产生1秒误差。例如用户从BCDMIN到BCDYEAR都进行了读,得到的结果为2059年12月31日23时59分,当读取这个结果时BCDSEC的数值在1~59之间,读到的2059年12月31日23时59分是没有问题的,但是当读取这个结果时BCDSEC的值为0,实际结果可能是2059年12月31日23时59分也可能是2060年1月1日0时0分。所以此时应重读这些寄存器,从而得到正确的数值。


后备电源操作:

 

实时时钟逻辑能被后备电源驱动,通过RTCVDD向RTC模块供电。当系统关闭时,cpu和RTC接口是封闭的,这时后备电源只驱动振荡电路和BCD计数器,从而把功耗降到最低。


逻辑图:

 

接口:

 

 

 

以下程序完成了时间设置获取,在lcd上显示功能,

源码如下

头文件:

 

  1. //RTC  
  2. #define RTC_BASE    (0x7E005040)  
  3. #define rRTCCON     (*(volatile unsigned *)RTC_BASE)  
  4. #define rTICNT      (*(volatile unsigned *)(RTC_BASE 0x4))  
  5. #define rRTCALM     (*(volatile unsigned *)(RTC_BASE 0x10))  
  6. #define rALMSEC     (*(volatile unsigned *)(RTC_BASE 0x14))  
  7. #define rALMMIN     (*(volatile unsigned *)(RTC_BASE 0x18))  
  8. #define rALMHOUR    (*(volatile unsigned *)(RTC_BASE 0x1c))  
  9. #define rALMDATE    (*(volatile unsigned *)(RTC_BASE 0x20))  
  10. #define rALMMON     (*(volatile unsigned *)(RTC_BASE 0x24))  
  11. #define rALMYEAR    (*(volatile unsigned *)(RTC_BASE 0x28))  
  12. #define rBCDSEC     (*(volatile unsigned *)(RTC_BASE 0x30))  
  13. #define rBCDMIN     (*(volatile unsigned *)(RTC_BASE 0x34))  
  14. #define rBCDHOUR    (*(volatile unsigned *)(RTC_BASE 0x38))  
  15. #define rBCDDATE    (*(volatile unsigned *)(RTC_BASE 0x3c))  
  16. #define rBCDDAY     (*(volatile unsigned *)(RTC_BASE 0x40))  
  17. #define rBCDMON     (*(volatile unsigned *)(RTC_BASE 0x44))  
  18. #define rBCDYEAR    (*(volatile unsigned *)(RTC_BASE 0x48))  
  19. #define rCURTICNT   (*(volatile unsigned *)(RTC_BASE 0x50))  
  20. #define rINTP       (*(volatile unsigned *)(RTC_BASE 0x10))  

 

 

 

初始化rtc:

 

  1. void init_rtc()  
  2.  
  3.     rRTCCON 0x85;  
  4.  

设置实时数据:

 

 

  1. void set_rtc()  
  2.  
  3. //2012,04.14.13,06  
  4.     rRTCCON |= 0x01;  
  5.     rBCDSEC 5*16 +1;  
  6.     rBCDMIN 6;  
  7.     rBCDHOUR 1*16 +3;  
  8.     rBCDDATE 1*16+4;  
  9.     rBCDMON =4;  
  10.     rBCDYEAR 1*16+2;  
  11.     rRTCCON &= ~(0x01);  
  12.  

获取实时数据:

 

 

  1. void get_rtc(unsigned char rtc_data[6])  
  2.  
  3.   
  4.     rRTCCON |= 0x01;  
  5.     rtc_data[0] =rBCDSEC;  
  6.     rtc_data[1] rBCDMIN;  
  7.     rtc_data[2] rBCDHOUR;  
  8.     rtc_data[3] rBCDDATE;  
  9.     rtc_data[4] rBCDMON;  
  10.     rtc_data[5] rBCDYEAR;  
  11.       
  12.     rRTCCON &= ~(0x01);   
  13.   
  14.     if(rtc_data[0] == 0)  
  15.      
  16.     rRTCCON |= 0x01;  
  17.     rtc_data[0] =rBCDSEC;  
  18.     rtc_data[1] rBCDMIN;  
  19.     rtc_data[2] rBCDHOUR;  
  20.     rtc_data[3] rBCDDATE;  
  21.     rtc_data[4] rBCDMON;  
  22.     rtc_data[5] rBCDYEAR;   
  23.     rRTCCON &= ~(0x01);   
  24.      
  25.   
  26.  



mian:

 

 

  1. init_rtc();   
  2. LCD_Init();  
  3. Paint_background(0xffffff,0,0,480,272);  
  4. set_rtc();  
  5.   
  6. while(1)  
  7.  
  8.   
  9. get_rtc(tmp_rtc);  
  10. rtc_data_tmp[13] tmp_rtc[0];  
  11. rtc_data_tmp[12] tmp_rtc[0]/16;  
  12.   
  13. rtc_data_tmp[11] tmp_rtc[1];  
  14. rtc_data_tmp[10] tmp_rtc[1]/16;  
  15.       
  16. rtc_data_tmp[9] tmp_rtc[2];  
  17. rtc_data_tmp[8] tmp_rtc[2]/16;  
  18.   
  19. rtc_data_tmp[7] tmp_rtc[3];  
  20. rtc_data_tmp[6] tmp_rtc[3]/16;  
  21.   
  22. rtc_data_tmp[5] tmp_rtc[4];  
  23. rtc_data_tmp[4] tmp_rtc[4]/16;  
  24.       
  25. rtc_data_tmp[3] tmp_rtc[5];  
  26. rtc_data_tmp[2] tmp_rtc[5]/16;  
  27.   
  28. rtc_data_tmp[1] tmp_rtc[6];  
  29. rtc_data_tmp[0] tmp_rtc[6]/16;  
  30.   
  31. for(jj=0;jj<14;jj++)       
  32.  
  33.     Paint_text(124+8*jj, 20, 0x0,charnum[rtc_data_tmp[jj]],8, 16);  
  34.  
  35. delay_rtc();  
  36.   
  37.  

关键字:ARM  S3C6410)  rtc实例 引用地址:深入理解ARM体系架构(S3C6410)---rtc实例

上一篇:arm linux 下中断流程简要分析注册中断
下一篇:深入理解ARM体系架构(S3C6410)---ad转化实例

推荐阅读最新更新时间:2024-03-16 14:58

Linux kernel的中断子系统之(六):ARM中断处理过程
一、前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作。具体整个处理过程分成三个步骤来描述: 1、第二章描述了中断处理的准备过程 2、第三章描述了当发生中的时候,ARM硬件的行为 3、第四章描述了ARM的中断进入过程 4、第五章描述了ARM的中断退出过程 本文涉及的代码来自3.14内核。另外,本文注意描述ARM指令集的内容,有些source code为了简短一些,删除了THUMB相关的代码,除此之外,有些debug相关的内容也会删除。 二、中断处理的准备过程 1、中断模式的stack准备 ARM处理器有多种processor mode,例如user mod
[单片机]
Linux kernel的中断子系统之(六):<font color='red'>ARM</font>中断处理过程
达人教你如何选择嵌入式操作系统
嵌入式操作系统是ARM CPU的软件基础,从8位/16位单片机发展到以arm CPU核为代表的32位嵌入式处理器,嵌入式操作系统将替代传统的由手工编制的监控程序或调度程序,成为重要的基础组件。更重要的是嵌入式操作系统对应用程序可以起到屏蔽的作用,使应用程序员面向操作系统级开发应用软件,并易于在不同的arm核的嵌入式处理器上移植。   嵌入式操作系统都具有一定的实时性,易于裁剪和伸缩,可以适合于从ARM7到Xscale各种ARM CPU和各种档次的应用,嵌入式操作系统可以使用广泛流行的ARM开发工具,如arm公司的SDT/ADS和RealView等,也可以使用开发软件,如GCC/GDB、KDE或Eclipe开发环境,市场上还有专用的开
[嵌入式]
ARM指令集----杂项指令
ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load、Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种是直接向PC寄存器写入目标地址的值 通过直接向PC寄存器写入目标寄存器的数字可以实现在4GB 地址空间的任意跳转,这种跳转又称为长跳转,如果在残肢令前面使用MOV LR,PC等指令,可以保存返回来的地址值,这样就实现了在4GB空间中的子程序调用 ARM的跳转指令可以从当前指令向前或者是向后的32位的地址进行空间跳转,这类跳转指令有一下4种 B 跳转指令 BL带换回的跳转指令 BLX 带返回的跳转和切换指令
[单片机]
ARM-Linux嵌入式系统的Boot Loader分析与设计
0 引言 由Boot Loader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basic input output system)。但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。它的实现严重地依赖于硬件,特别是在嵌入式系统中,即使基于同一个CPU的Boot Loader,对于不同的板子,也有很大的不同。 1
[单片机]
<font color='red'>ARM</font>-Linux嵌入式系统的Boot Loader分析与设计
ARM嵌入式汽车节能控制系统
  由于各种原因,公交车总是不断重复加速-减速或停车-再加速的过程。通过加装本节能装置,当汽车需要制动时,在主控单元的控制下,可将汽车行驶时具有的巨大动能通过空气压缩机转化成高压气体的势能并储存起来,从而实现汽车减速或停车。当汽车需要启动或加速时,用储存起来的高压气体势能代替燃油来驱动汽车,从而实现汽车能量的回收再利用,达到节能的效果。同时由于汽车在起动或加速时能耗最大,如果汽车是用燃油驱动,则此时油料燃烧不充分,燃烧效果最差,而且产生的噪音最大。   系统工作原理   本系统主要由三部分组成,即检测部分,控制部分和执行机构。检测部分包括踏板位置传感器、曲轴位置传感器、压缩机活塞位置传感器、汽车运行速度传感器、储气罐压力传感器
[单片机]
<font color='red'>ARM</font>嵌入式汽车节能控制系统
2011年ARM开发者大会系列:ARM Techcon系列之Synopsys
Synopsys是为全球设计提供设计自动化()的主导企业。为全球电子市场提供技术先进的IC设计与验证平台,致力于复杂的芯片上系统(SoC)的开发。
[机器人]
关于keil4ARM 通过Jlink在线调试的问题
keilC中的设置如下: 注意第4张图和第5张图的区别 当我点选上updata target before debugging的时候,就能够直接进行在线调试,如果不点选的话,flash里面的程序还是上次的程序,这时候进行在线调试,还是对上次的程序进行调试。 点选上之后,每次的程序都是新的,可以直接进行在线调试。这种动作类似于先将程序在flash download中下载,然后直接点击调试按钮仿真 是一样的。
[单片机]
S3C6410裸机AC97驱动
目前能够初始化AC97,能够进入就绪中断,说明能够检测到WM9714,但是无法读取WM9714,不知道哪里出错了,目前正在解决中... AC97.c /************************************************************************************************************* * 文件名: AC97.c * 功能: S3C6410 AC97底层驱动函数 * 作者: cp1300@139.com * 创建时间: 2012年10月6日20:41 * 最后修改时间:2012年10月6日 * 详细:
[单片机]
<font color='red'>S3C6410</font>裸机AC97驱动
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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