发 帖  
原厂入驻New

[经验] 用S3C2440的实时时钟学习RTC知识【带程序】

2020-9-1 22:30:07  302 RTC 实时时钟 S3C2440
分享
4
在一个嵌入式系统中(如S3C2440开发板),实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。即使系统处于关机状态下,它也能够正常工作(通常采用后备电池供电,能够可靠工作十年),其外围也不需要太多的辅助电路,只需要一个高精度的晶振

它具有以下特点:
•  时钟数据采用BCD编码或二进制表示;
•  能够对闰年的年、月、日进行自动处理;
•  具有告警功能,当系统处于关机状态时,能产生告警中断;
•  具有独立的电源输入;
•  提供毫秒级的时钟中断,该中断可用于嵌入操作系统的内核时钟。

实时时钟特殊功能寄存器:

1、实时时钟控制(RTCCON)寄存器
RTCCON 寄存器由4 位组成,如控制BCD 寄存器读/写使能的RTCEN、CLKSEL、CNTSEL 和测试用的
CLKRST。
RTCEN 位可以控制所有CPU 与RTC 之间的接口,因此在系统复位后在RTC 控制程序中必须设置为1 来使
能数据的读/写。同样的在掉电前,RTCEN 位应该清除为0 来预防误写入RTC 寄存器中。

2、RTC 闹钟控制(RTCALM)寄存器
RTCALM 寄存器决定了闹钟使能和闹钟时间。请注意RTCALM 寄存器在掉电模式中同时通过INT_RTC 和
PMWKUP 产生闹钟信号,但是在正常工作模式中只产生INT_RTC。

闹钟秒数据(ALMSEC)寄存器:闹钟秒数据寄存器
同理:闹钟分数据(ALMMIN)寄存器,闹钟时数据(ALMHOUR)寄存器,闹钟日数据(ALMDATE)寄存器,闹钟月数据(ALMMON)寄存器,闹钟年数据(ALMYEAR)寄存器
BCD 秒(BCDSEC)寄存器:存储的是当前时间秒,同样还有,BCDMIN,BCDHOUR,BCDDATE(日),BCDDAY(星期),BCDMON,BCDYEAR
注意以上这些寄存器存储的数据都是BCD码,即是自动处理的数据,如果自己想做时钟显示时,如果调时间的请注意时间加减时实际上是十六进制的
下面结合具体的程序介绍一下RTC操作
程序编写包括三步,第一步是时钟初始化,第二步把嵌入式控制系统投入运行时要将当前准确时间写入RTC,俗称效表;第三步是系统正常运行后,读取RTC时间在LCD上显示。

下面来实操:
  1. #include "def.h"
  2. #include "option.h"
  3. #include "2440addr.h"
  4. U8 beep=1;
  5. void __irq IsrAlarm(void);//下面这些都是函数声明
  6. void delay(int x);
  7. void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
  8.                U8 almhour,U8 almmin,U8 almsec);
  9.                void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec );
  10. void OpenAlarm(void) ;
  11. void CloseAlarm(void) ;
  12. //==================================================================================  
  13. void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec )//时间设置函数,操作是不是比较简单?呵呵

  14. {
  15. rRTCCON = 1 ;  //RTC 读写使能

  16. rBCDYEAR = wRTCyear ;  //年
  17.     rBCDMON  = wRTCmon ;  //月
  18.     rBCDDATE = wRTCdate ;  //日
  19. rBCDDAY  = wRTCday ;  //星期
  20. rBCDHOUR = wRTChour ;  //小时
  21.     rBCDMIN  = wRTCmin ;  //分
  22.     rBCDSEC  = wRTCsec ;  //秒

  23. rRTCCON &= ~1 ;  //RTC read and write disable
  24. }
  25. void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,
  26.                U8 almhour,U8 almmin,U8 almsec)//年、月、日、时、分、秒//闹钟设置
  27. {   rRTCCON=0x01;      //RTCCON实时时钟控制寄存器,
  28.                                            //【0】位RTC使能信号控制位,0为禁止,1为允许
  29.                                            //对RTC模块进行读写操作前应对其最低位至1
  30.     rALMYEAR = almyear;
  31.     rALMMON  = almmon;
  32.     rALMDATE = almdate;
  33.     rALMHOUR = almhour;
  34.     rALMMIN  = almmin;
  35.     rALMSEC  = almsec;

  36.      rRTCCON = 0;    //读取数据完后禁止使能信号,以防误操作,
  37.                                   //整个文件的设置都一样,不重覆
  38. }
  39. void OpenAlarm(void) //开闹钟函数  
  40. {
  41.    pISR_RTC = (unsigned)IsrAlarm;    //中断寄存器ISR中的RTC中断位
  42.    ClearPending(BIT_RTC);
  43.    rRTCALM = (0x7f); //RTCALM闹钟控制寄存器,

  44.                                    //【0-7】分别对应秒到年的闹钟 使能,     
  45.                                    //相应位0表示禁止,1表示允许
  46. EnableIrq(BIT_RTC);   //开中断

  47. }

  48.       //关闹钟功能函数
  49. void CloseAlarm(void)   
  50. {
  51.    rRTCALM = 0; //RTCALM闹钟控制寄存器所有位禁止
  52.    DisableIrq(BIT_RTC);    //关中断
  53. }
  54. void __irq IsrAlarm(void)    //利用中断,闹钟时进入中断函数
  55. {
  56.      ClearPending(BIT_RTC);   //SRCPND,INTPND分别置1.
  57.      beep = 0;  // 蜂鸣器标志位清0
  58.      CloseAlarm();   //关闹钟,即如果要开闹钟的先要把它关了,再开。
  59. }
  60. void delay(int x)//延时函数
  61. {
  62. while(x)
  63. {
  64.   int k,j;
  65.   for(k=0xff;k>0;k--)
  66.    for(j=0xff;j>0;j--);
  67.   x--;
  68. }
  69. }



  70. //==================================================================================
  71. void RTCmain(void)
  72. {
  73. rGPBCON = (1<<0)|(1<<10)|(1<<12)|(1<<16)|(1<<20); // GPB5,GPB6,GPB8,GPB10设置为输出,分别连了4个LED
  74. rGPBDAT|=0x560;//4个LED全灭
  75. RTC_Time_Set(0x11,0x08,0x06,0x06,0x10,0x00,0x00) ;//设置时间
  76. RTC_Alm_Set(0x11,0x08,0x06,0x10,0x01,0x00);//设置闹钟时间按
  77. OpenAlarm();
  78.     while(1)
  79.     {
  80.   IF(beep==0)
  81.   {
  82.    rGPBDAT=0x01;//灯亮,蜂鸣器响
  83.    delay(1000);
  84.    rGPBDAT=0x561;//灯灭,实际是闪烁
  85.    delay(1000);
  86.   }
  87.     }
  88. }
复制代码

S3C2440全套中文手册.pdf

下载积分: 积分 -1 分

12.84 MB, 下载次数: 1, 下载积分: 积分 -1 分

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表