原创 manymany-2440裸机篇之4 RTC实时时钟

2009-6-8 00:35 4125 4 12 分类: MCU/ 嵌入式

//***************************************************************
//manymany-2440裸机篇之4  RTC实时时钟
//***************************************************************

//目的:掌握RTC实时时钟功能,每秒显示实时时钟
//            实现实时闹钟功能,掌握控制RTC各个寄存器
//***************************************************************
//功能:每秒显示实时时钟,能读取年,月,日,星期,时,分,秒
//            实现闹钟功能,控制蜂鸣器响灭。
//***************************************************************
//Designed by:
http://blog.ednchina.com/Manymany/
//2009-05-17 
//***************************************************************
//这是一个很实用的模块,现在先用串口显示,等过段时间写到液晶显示再
//改换液晶显示,那样更直观明了。
//***************************************************************
// 共两个c文件 这个为rtc.c,另一个为rtcalarm.c
//***************************************************************
  
#include "2440lib.h"
#include "2440addr.h"


extern void setRTCtime(U8,U8,U8,U8,U8,U8,U8);
extern void setRTCalm(U8,U8,U8,U8,U8,U8);
extern void OpenAlarm(void);
extern void OpenAlarm(void);
extern void OpenRtc(void);
extern void alarm(void);


//******************************************************************
void xmain(void)          //主函数   在这里主要讨论RTC寄存器的使用,其他的不深究
{
  ChangeClockDivider(3,1);   
  ChangeMPllValue(127,2,1);   //405MHZ
 
  rGPBCON="0x155555";
 
  Isr_Init(); //中断初始化
  Uart_Init(0, 115200);   //串口初始化
  Uart_Select(0);   //串口选择
  Uart_Printf("the main is running\n");  //打印显示
    
       //以下这两个函数用来设置系统开始时间和闹钟时间
      
//注意BCDYAER寄存器的8和9不能用08和09代替
  setRTCalm(9,05,17,11,50,30); //年、月、日、时、分、秒 
  setRTCtime(9,05,16,5,12,35,01); //年、月、日、星期、时、分、秒
  
  OpenAlarm();    //开闹钟功能
  OpenRtc();      //开RTC时钟
 
  alarm();      //判断闹钟是否到时间,蜂鸣器的响与停
  while(1); 
}
//**************************************************************
//以下为rtcalarm.c
//**************************************************************

#include "2440lib.h"
#include "2440addr.h"


char *week[8] = { "","SUN","MON", "TUES", "WED",


                                   "THURS","FRI", "SAT" } ;  //星期的数组
int year, month,date,weekday,hour,min,sec;
int beep = 1;       //闹钟用的蜂鸣器的标志位,初始化为1,不响
extern void Buzzer_PWM_Run(void);
extern char *week[8];
void CloseAlarm(void);
//********************************************************************
void Get_Rtc(void)  //读出当前的时间函数
{
        rRTCCON = 0x01; //RTC读写使能,选择BCD时钟、计数器,无复位


     if (rBCDYEAR == 0x99)   //判断具体年份,因为8位寄存器只能保存0-255
     year = 0x1999;
     else   
     year = 0x2000 + rBCDYEAR; 
     month="rBCDMON";     //读取年,月,日,时,分,秒各个寄存器的数据。
     date="rBCDDATE";
     weekday="rBCDDAY";
     hour="rBCDHOUR";
     min="rBCDMIN";
     sec="rBCDSEC";



   rRTCCON = 0x0;   


                 //RTC读写禁止,选择BCD时钟、计数器,无复位
}
//******************************************************************************
// 利用中断,进行实时时钟RTC和闹钟的进行
//***************************************************************************

void __irq TICKINT_Handler(void)   //RTC中断服务函数
{
    Get_Rtc();       //读出当前的时间函数
                           //串口打印,显示当前时间,在这里我们先用串口显示,


                           //等做到液晶的时候,我们再用液晶代替串口,可能直观点。
    Uart_Printf("RTC TIME : %4x-%02x-%02x - %s - %02x:%02x:% 


    02x\n",year,month,date,week[weekday],hour,min,sec);
   ClearPending(BIT_TICK);   //清除TICK中断函数。即分别往rSRCPND,


                                               //  rINTPND的TICK位置1即可。
 
}


void __irq IsrAlarm(void)    //利用中断,闹钟实时进行中断函数
{
     ClearPending(BIT_RTC);   //SRCPND,INTPND分别置1.
     Uart_Printf("mini2440 RTCALM  oucer \n"); 
     beep = 0;  // 蜂鸣器标志位清0
     CloseAlarm();   //关闹钟,即如果要开闹钟的先要把它关了,再开。
}
//******************************************************************************


             //设置RTC ALARM 时间
void setRTCalm(U8 almyear,U8 almmon,U8 almdate,
               U8 almhour,U8 almmin,U8 almsec)//年、月、日、时、分、秒
{   rRTCCON="0x0001";      //RTCCON实时时钟控制寄存器,
                                           //【0】位RTC使能信号控制位,0为禁止,1为允许
                                           //对RTC模块进行读写操作前应对其最低位至1
    rALMYEAR = almyear;
    rALMMON  = almmon;
    rALMDATE = almdate;
    rALMHOUR = almhour;
    rALMMIN  = almmin;
    rALMSEC  = almsec;
 
     rRTCCON = 0;    //读取数据完后禁止使能信号,以防误操作,
                                  //整个文件的设置都一样,不重覆
}


         //置时钟定时时间
void setRTCtime(U8 wRTCyear,U8 wRTCmon,U8 wRTCdate,
                          U8 wRTCday,U8 wRTChour,U8 wRTCmin,U8 wRTCsec)


             //年、月、日、星期、时、分、秒
{
 rRTCCON=0x01;
 
 rBCDYEAR = wRTCyear;
 rBCDMON  = wRTCmon;
 rBCDDATE = wRTCdate;
 rBCDDAY  = wRTCday;
 rBCDHOUR = wRTChour;
 rBCDMIN  = wRTCmon;
 rBCDSEC  = wRTCsec;
 
    rRTCCON = 0x00; 
}
//****************************************************************************
//时钟和闹钟的开关操作函数:
//OpenRtc(); //RTC开函数        CloseRtc(); //RTC关函数
//OpenAlarm():开闹钟功能函数    CloseAlarm():关闹钟功能函数
//****************************************************************************

//RTC开
void OpenRtc(void)
{
    pISR_TICK=(unsigned)TICKINT_Handler;   //执行RTC中断服务函数
    rTICNT="0xFF";  //TICNT该寄存器用于是否允许时间滴答中断和时间中断的计数值。
               //TICNT[7]为0,禁止,为1,使能。
              //TICNT[6:0]时间滴答计数值,1-127,自动递减,不能读取其实时数值。
    EnableIrq(BIT_TICK);  //开RTC中断服务
}


      //RTC关
void CloseRtc(void)
{
    rTICNT &= ~(1<<7);   //禁止TICNT
    DisableIrq(BIT_TICK);  //关RTC中断服务


}
     //开闹钟功能函数
void OpenAlarm()   
{
   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 alarm()      //判断闹钟是否到时间,蜂鸣器的响与停
{
  if(beep)     //如果标志位为1,则没有到时间
   {
     rGPBDAT &=~(1<<0); //蜂鸣器不响
     Delay(1000);
   }
   else        //如果标志位为0,则到时间
   {
     rGPBDAT |=(1<<0);   //蜂鸣器响
     Delay(1000);
   }
}
//这里是整个工程文件压缩rariconicon大家顶一下啊icon

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

用户1585202 2015-3-29 03:54

已经找到irq_int,

用户1585202 2015-3-29 03:37

请教一下irq_init();这个函数的初始化在什么地方呀!

用户377235 2014-7-20 23:30

真诚感谢楼主分享,祝福楼主越来越好!

用户345671 2011-6-14 22:49

顶一下

用户1719025 2011-2-22 13:47

楼主,为什么这个程序我运行出错啊?不知道什么地方出了问题,能留一下你的QQ吗?想跟您请教一下啊,我的QQ是289786215

用户586549 2010-10-25 01:24

楼上的问题我遇到过,是一位没有设置FCLK PCLK HCLK UCLK 造成的就是差cal_cpu_bus_clk()这个函数。友善纸币官方2440test里面有。 希望楼主能够 真正的测试过 再发程序,不要发些错误的东西来误导初学者

用户578360 2009-8-30 23:05

有问题想请教下博主, month="rBCDMON";这一语句加分号什么意思啊?不加有什么区别?

liming19860925_603539841 2009-8-10 17:15

楼主 问一下 你这个程序bin文件有几十k 是不是要下载到RAM里啊 也就是说 用usb下载的时候 地址设为:0x30000000. 但是我下载了 没反应啊
相关推荐阅读
用户188963 2009-08-28 16:56
我来猜09年全国电赛小车的题目
我来猜09年全国电赛小车的题目 小车+无线收发模块+2米卷尺+光电传感器+继电器 1.无线模块用来设置小车的行驶轨迹,圆的,方的,任意轨迹的。2.2米卷尺和光电传感器:小车行驶速度,距离。3.壁障4....
用户188963 2009-07-20 09:39
manymany-2440裸机篇之8 ADC模数转换
//manymany-2440裸机篇之8 ADC模数转换//***************************************************//为了对温度,压力,流量,速度,位移...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之开篇
                              manymany-2440裸机篇之开篇          manymany前段时间买了块广州友善之臂的mini2440开发板,现在想学习AR...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之1 流水灯与蜂鸣器
//***************************************************//manymany-2440裸机篇之流水灯与蜂鸣器//*******************...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之2 下载与调试
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />玩裸机的时候,肯定要用到下载与调试,...
用户188963 2009-06-08 00:36
manymany-2440裸机篇之3 按键点亮LED
//***************************************************//manymany-2440裸机篇之3 按键点亮LED//*****************...
EE直播间
更多
我要评论
8
4
关闭 站长推荐上一条 /3 下一条