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();
}
}
}
本实验实验代码如下:
#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();
}
}
}
相关文章推荐
- 【iCore4 双核心板_ARM】例程十:RTC实时时钟实验——显示时间和日期
- mini2440 实时时钟实验
- cortex_m3_stm32嵌入式学习笔记(十四):RTC实时时钟(秒中断)
- 【iCore3 双核心板】例程十:RTC实时时钟实验——显示日期和时间
- 【iCore1S 双核心板_ARM】例程十一:RTC实时时钟实验——显示时间和日期
- S3C2410 实验七—— 实时时钟(RTC)实验(未完)
- 第二十章 RTC实时时钟实验
- 10、RTC实时时钟实验
- STM32F3实时时钟RTC-闹钟和唤醒中…
- RTC实时时钟
- 王爽 汇编 实验16 编写包含多个功能子程序的中断例程
- STM32的RTC实时时钟
- 一起学mini2440裸机开发(十)--mini2440外部中断实验
- linux 实时时钟(RTC)驱动
- RTC实时时钟-备份区域BKP--原理讲解
- RTC实时时钟驱动
- mini2440 中断实验
- STM32F0xx_RTC实时时钟配置详细过程
- 8.S5PV210之RTC实时时钟代码
- 一起学mini2440裸机开发(十)--mini2440外部中断实验