您的位置:首页 > 其它

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

2011-09-26 13:18 288 查看
本实验主要使用实时时钟的报警功能和时钟节拍功能,由于涉及到中断必须先进行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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: