mini2440 RTC实时时钟中断和报警功能实验

本实验主要使用实时时钟的报警功能和时钟节拍功能,由于涉及到中断必须先进行mmu即内存重定向,但是这对于UART的接收返回地址有影响,具体怎么修改没有找到解决方案,所以本实验无法输入数据设置报警时间,只能在原来的基础上增加十秒来验证报警功能,另外进入显示时间选项后无法退出,需要增加外部按键中断,这里为了节约时间不再增加,本实验有待改进,希望大家能给出以上提到问题的解决方案,非常感谢!

本实验实验代码如下:

#define    GLOBAL_CLK              1

#include <stdlib.h>

#include <string.h>

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"

 

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

{

    int i;

    for(;times>0;times--)

      for(i=0;i<400;i++);

}

 

void beep_init(void)//蜂鸣器初始化

{

   rGPBCON =1<<0;// 设置GPB0为输出端口

   rGPBUP=1<<0;//禁止GPB0上拉功能

}

 

void beep(void)

   

    beep_init();//初始化蜂鸣器

    rGPBDAT =0x1;//蜂鸣器响

    delay(3000);

    rGPBDAT=0x0;//蜂鸣器不响

    delay(3000);

   

 

char Uart_Getchar(void)

 

        while(!(rUTRSTAT0 & 0x1)); //Receive data ready

        return rURXH0;

}

 

 

void Rtc_AlmSet(void)//设置报警时间

{

 

rRTCCON=0x1;

 

rALMYEAR=rBCDYEAR;

rALMMON=rBCDMON ;

rALMDATE=rBCDDATE ;

rALMHOUR=rBCDHOUR ;

rALMMIN=rBCDMIN ;

rALMSEC=rBCDSEC+0x10;//分钟设置延时10秒报警

 

rRTCALM = 0x7f;//设置报警寄存器全部使能

rRTCCON = 0x00;

}

 

void Display_Rtc(void)//每隔一秒显示一次时间

{

static int tmp;

int year;

int month, date, weekday, hour, minute, sec;

char day[][7]={"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};

rRTCCON = 0x01;

while (1)

       {

              if (rBCDYEAR == 0x99)

              {

                     year = 0x1999;

              }

              else

              {

                     year = 0x2000 + rBCDYEAR;

              }

                     month = rBCDMON;

                     weekday = rBCDDAY;

                     date = rBCDDATE;

                     hour = rBCDHOUR;

                     minute = rBCDMIN;

                     sec = rBCDSEC;

              if (sec != tmp)

                     {

                     tmp = sec;

                     break;

                     }

       }

Uart_Printf("x:x:x s, x/x/%4x\n",hour,minute,sec,day[weekday],month,date,year);

rRTCCON = 0x00;

}

 

void INT_init(void)

{

      

       rSRCPND |= (0x1<<8);

 

       rINTPND |= (0x1<<8);

 

          rINTMSK &=~(0x1<<8);

 

       rSRCPND |= (0x1<<30);

 

       rINTPND |= (0x1<<30);

 

       rINTMSK &=~(0x1<<30);

}

 

 

static void __irq Alarm_ISR(void)//报警中断函数

{

       int i;

       rSRCPND |=(0x1<<30);

 

       rINTPND |=(0x1<<30);

 

       for(i=0;i<6;i++)

 

       beep();

}

 

 

static void __irq RTCTick_ISP(void)//时钟节拍中断函数

       rSRCPND |= (0x1<<8);

 

    rINTPND |= (0x1<<8);

   

 

 

       Display_Rtc();

}

 

void Main(void)

{

       char select;

      

       MMU_Init();//内存初始化

 

       INT_init();//中断初始化

 

       pISR_RTC = (U32)Alarm_ISR;//报警中断函数入口地址传递给中断向量表

 

    pISR_TICK = (U32)RTCTick_ISP;//时钟节拍中断函数入口地址传递给中断向量表

 

       while(1)

       {

       Uart_Printf("请选择经行的操作:1、显示时间 2、设置闹钟 \n");

       select=Uart_Getchar();

       if(select=='1')

       {

              rTICNT = (1<<7)+127;//使能时钟节拍,1s中断一次

              while(1);       

       }

       if(select=='2')

       {

              Rtc_AlmSet();

 

       }

       }

 

      

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值