您的位置 首页 数字

深化了解ARM系统架构(S3C6410)—rtc实例

实时时钟(RTC)的主要功能是在系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。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上显现功用,

源码如下

头文件:

[cpp]view plaincopyprint?

  1. //RTC
  2. #defineRTC_BASE(0x7E005040)
  3. #definerRTCCON(*(volatileunsigned*)RTC_BASE)
  4. #definerTICNT(*(volatileunsigned*)(RTC_BASE+0x4))
  5. #definerRTCALM(*(volatileunsigned*)(RTC_BASE+0x10))
  6. #definerALMSEC(*(volatileunsigned*)(RTC_BASE+0x14))
  7. #definerALMMIN(*(volatileunsigned*)(RTC_BASE+0x18))
  8. #definerALMHOUR(*(volatileunsigned*)(RTC_BASE+0x1c))
  9. #definerALMDATE(*(volatileunsigned*)(RTC_BASE+0x20))
  10. #definerALMMON(*(volatileunsigned*)(RTC_BASE+0x24))
  11. #definerALMYEAR(*(volatileunsigned*)(RTC_BASE+0x28))
  12. #definerBCDSEC(*(volatileunsigned*)(RTC_BASE+0x30))
  13. #definerBCDMIN(*(volatileunsigned*)(RTC_BASE+0x34))
  14. #definerBCDHOUR(*(volatileunsigned*)(RTC_BASE+0x38))
  15. #definerBCDDATE(*(volatileunsigned*)(RTC_BASE+0x3c))
  16. #definerBCDDAY(*(volatileunsigned*)(RTC_BASE+0x40))
  17. #definerBCDMON(*(volatileunsigned*)(RTC_BASE+0x44))
  18. #definerBCDYEAR(*(volatileunsigned*)(RTC_BASE+0x48))
  19. #definerCURT%&&&&&%NT(*(volatileunsigned*)(RTC_BASE+0x50))
  20. #definerINTP(*(volatileunsigned*)(RTC_BASE0x10))

初始化rtc:

[cpp]view plaincopyprint?

  1. voidinit_rtc()
  2. {
  3. rRTCCON=0x85;
  4. }

设置实时数据:

[cpp]view plaincopyprint?

  1. voidset_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. }

获取实时数据:

[cpp]view plaincopyprint?

  1. voidget_rtc(unsignedcharrtc_data[6])
  2. {
  3. rRTCCON|=0x01;
  4. rtc_data[0]=rBCDSEC;
  5. rtc_data[1]=rBCDMIN;
  6. rtc_data[2]=rBCDHOUR;
  7. rtc_data[3]=rBCDDATE;
  8. rtc_data[4]=rBCDMON;
  9. rtc_data[5]=rBCDYEAR;
  10. rRTCCON&=~(0x01);
  11. if(rtc_data[0]==0)
  12. {
  13. rRTCCON|=0x01;
  14. rtc_data[0]=rBCDSEC;
  15. rtc_data[1]=rBCDMIN;
  16. rtc_data[2]=rBCDHOUR;
  17. rtc_data[3]=rBCDDATE;
  18. rtc_data[4]=rBCDMON;
  19. rtc_data[5]=rBCDYEAR;
  20. rRTCCON&=~(0x01);
  21. }
  22. }

mian:

[cpp]view plaincopyprint?

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/276987.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部