0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >技术信息 > 用S3C2440的实时时钟学习RTC知识【带程序】

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

来源: elecfans
2020-09-02
类别:技术信息
eye 65
文章创建人 拍明

原标题:用S3C2440的实时时钟学习RTC知识【带程序】

  在一个嵌入式系统中(如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上显示。

  下面来实操:

  #include "def.h"

  #include "option.h"

  #include "2440addr.h"

  U8 beep=1;

  void __irq IsrAlARM(void);//下面这些都是函数声明

  void delay(int x);

  void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,

  U8 almhour,U8 almmin,U8 almsec);

  void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec );

  void OpenAlarm(void) ;

  void CloseAlarm(void) ;

  //==================================================================================

  void RTC_Time_Set( U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec )//时间设置函数,操作是不是比较简单?呵呵

  {

  rRTCCON = 1 ; //RTC 读写使能

  rBCDYEAR = wRTCyear ; //年

  rBCDMON = wRTCmon ; //月

  rBCDDATE = wRTCdate ; //日

  rBCDDAY = wRTCday ; //星期

  rBCDHOUR = wRTChour ; //小时

  rBCDMIN = wRTCmin ; //分

  rBCDSEC = wRTCsec ; //秒

  rRTCCON &= ~1 ; //RTC read and write disable

  }

  void RTC_Alm_Set(U8 almyear,U8 almmon,U8 almdate,

  U8 almhour,U8 almmin,U8 almsec)//年、月、日、时、分、秒//闹钟设置

  { rRTCCON=0x01; //RTCCON实时时钟控制寄存器,

  //【0】位RTC使能信号控制位,0为禁止,1为允许

  //对RTC模块进行读写操作前应对其最低位至1

  rALMYEAR = almyear;

  rALMMON = almmon;

  rALMDATE = almdate;

  rALMHOUR = almhour;

  rALMMIN = almmin;

  rALMSEC = almsec;

  rRTCCON = 0; //读取数据完后禁止使能信号,以防误操作,

  //整个文件的设置都一样,不重覆

  }

  void OpenAlarm(void) //开闹钟函数

  {

  pISR_RTC = (unsigned)IsrAlarm; //中断寄存器ISR中的RTC中断位

  ClearPending(BIT_RTC);

  rRTCALM = (0x7f); //RTCALM闹钟控制寄存器,

  //【0-7】分别对应秒到年的闹钟 使能,

  //相应位0表示禁止,1表示允许

  EnableIrq(BIT_RTC); //开中断

  }

  //关闹钟功能函数

  void CloseAlarm(void)

  {

  rRTCALM = 0; //RTCALM闹钟控制寄存器所有位禁止

  DisableIrq(BIT_RTC); //关中断

  }

  void __irq IsrAlarm(void) //利用中断,闹钟时进入中断函数

  {

  ClearPending(BIT_RTC); //SRCPND,INTPND分别置1.

  beep = 0; // 蜂鸣器标志位清0

  CloseAlarm(); //关闹钟,即如果要开闹钟的先要把它关了,再开。

  }

  void delay(int x)//延时函数

  {

  while(x)

  {

  int k,j;

  for(k=0xff;k>0;k--)

  for(j=0xff;j>0;j--);

  x--;

  }

  }

  //==================================================================================

  void RTCmain(void)

  {

  rGPBCON = (1<<0)|(1<<10)|(1<<12)|(1<<16)|(1<<20); // GPB5,GPB6,GPB8,GPB10设置为输出,分别连了4个LED

  rGPBDAT|=0x560;//4个LED全灭

  RTC_Time_Set(0x11,0x08,0x06,0x06,0x10,0x00,0x00) ;//设置时间

  RTC_Alm_Set(0x11,0x08,0x06,0x10,0x01,0x00);//设置闹钟时间按

  OpenAlarm();

  while(1)

  {

  IF(beep==0)

  {

  rGPBDAT=0x01;//灯亮,蜂鸣器响

  delay(1000);

  rGPBDAT=0x561;//灯灭,实际是闪烁

  delay(1000);

  }

  }

  }


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

标签: S3C2440

相关资讯