中断处理(中断向量寄存器)
2014-04-08 20:10
495 查看
#define GPNCON (*((volatile unsigned long *)0x7F008830))
#define GPNDAT (*((volatile unsigned long *)0x7F008834))
#define EINT0CON0 (*((volatile unsigned long *)0x7F008900))
#define EINT0MASK (*((volatile unsigned long *)0x7F008920))
#define EINT0PEND (*((volatile unsigned long *)0x7F008924))
#define PRIORITY (*((volatile unsigned long *)0x7F008280))
#define SERVICE (*((volatile unsigned long *)0x7F008284))
#define SERVICEPEND (*((volatile unsigned long *)0x7F008288))
#define VIC0IRQSTATUS (*((volatile unsigned long *)0x71200000))
#define VIC0FIQSTATUS (*((volatile unsigned long *)0x71200004))
#define VIC0RAWINTR (*((volatile unsigned long *)0x71200008))
#define VIC0INTSELECT (*((volatile unsigned long *)0x7120000c))
#define VIC0INTENABLE (*((volatile unsigned long *)0x71200010))
#define VIC0INTENCLEAR (*((volatile unsigned long *)0x71200014))
#define VIC0PROTECTION (*((volatile unsigned long *)0x71200020))
#define VIC0SWPRIORITYMASK (*((volatile unsigned long *)0x71200024))
#define VIC0PRIORITYDAISY (*((volatile unsigned long *)0x71200028))
#define VIC0VECTADDR0 (*((volatile unsigned long *)0x71200100))
#define VIC0VECTADDR1 (*((volatile unsigned long *)0x71200104))
#define VIC0ADDRESS (*((volatile unsigned long *)0x71200f00))
void eint0_3_irq(void)
//分辨组内哪个中断
{
int i;
printf("eint0_3_irq\n\r"); /* K1~K4 */
for (i = 0; i < 4; i ++)
{
if (EINT0PEND & (1<<i))
{
if (GPNDAT & (1<<i))
{
printf("K%d released\n\r", i+1);
}
else
{
printf("K%d pressed\n\r", i+1);
}
}
}
}
void eint4_11_irq(void)
{
int i;
printf("eint4_11_irq\n\r"); /* K5~K6 */
for (i = 4; i < 6; i ++)
{
if (EINT0PEND & (1<<i))
{
if (GPNDAT & (1<<i))
{
printf("K%d released\n\r", i+1);
}
else
{
printf("K%d pressed\n\r", i+1);
}
}
}
}
void irq_init(void)
{
/* 配置GPIO引脚为中断引脚 */
/* GPN0~5 设为中断引脚 */
GPNCON &= ~(0xfff);
GPNCON |= 0xaaa;
/* 设置中断触发方式为: 双边沿触发 */
EINT0CON0 &= ~(0xfff);
EINT0CON0 |= 0x777;
/* 使能中断 */
EINT0MASK &= ~(0x3f);
/* 在中断控制器里使能这些中断 */
VIC0INTENABLE |= (0x3); /* bit0: eint0~3, bit1: eint4~11 */
VIC0VECTADDR0 = eint0_3_irq;
VIC0VECTADDR1 = eint4_11_irq;
}
void do_irq(void)
{
int i = 0;
void (*the_isr)(void);
the_isr = VIC0ADDRESS;
//分辨哪个组中断
/* 2.1 分辨是哪个中断 */
/* 2.2 调用它的处理函数 */
/* 2.3 清中断 */
the_isr();
EINT0PEND = 0x3f; /* 清中断 */
VIC0ADDRESS = 0;
}
#define GPNDAT (*((volatile unsigned long *)0x7F008834))
#define EINT0CON0 (*((volatile unsigned long *)0x7F008900))
#define EINT0MASK (*((volatile unsigned long *)0x7F008920))
#define EINT0PEND (*((volatile unsigned long *)0x7F008924))
#define PRIORITY (*((volatile unsigned long *)0x7F008280))
#define SERVICE (*((volatile unsigned long *)0x7F008284))
#define SERVICEPEND (*((volatile unsigned long *)0x7F008288))
#define VIC0IRQSTATUS (*((volatile unsigned long *)0x71200000))
#define VIC0FIQSTATUS (*((volatile unsigned long *)0x71200004))
#define VIC0RAWINTR (*((volatile unsigned long *)0x71200008))
#define VIC0INTSELECT (*((volatile unsigned long *)0x7120000c))
#define VIC0INTENABLE (*((volatile unsigned long *)0x71200010))
#define VIC0INTENCLEAR (*((volatile unsigned long *)0x71200014))
#define VIC0PROTECTION (*((volatile unsigned long *)0x71200020))
#define VIC0SWPRIORITYMASK (*((volatile unsigned long *)0x71200024))
#define VIC0PRIORITYDAISY (*((volatile unsigned long *)0x71200028))
#define VIC0VECTADDR0 (*((volatile unsigned long *)0x71200100))
#define VIC0VECTADDR1 (*((volatile unsigned long *)0x71200104))
#define VIC0ADDRESS (*((volatile unsigned long *)0x71200f00))
void eint0_3_irq(void)
//分辨组内哪个中断
{
int i;
printf("eint0_3_irq\n\r"); /* K1~K4 */
for (i = 0; i < 4; i ++)
{
if (EINT0PEND & (1<<i))
{
if (GPNDAT & (1<<i))
{
printf("K%d released\n\r", i+1);
}
else
{
printf("K%d pressed\n\r", i+1);
}
}
}
}
void eint4_11_irq(void)
{
int i;
printf("eint4_11_irq\n\r"); /* K5~K6 */
for (i = 4; i < 6; i ++)
{
if (EINT0PEND & (1<<i))
{
if (GPNDAT & (1<<i))
{
printf("K%d released\n\r", i+1);
}
else
{
printf("K%d pressed\n\r", i+1);
}
}
}
}
void irq_init(void)
{
/* 配置GPIO引脚为中断引脚 */
/* GPN0~5 设为中断引脚 */
GPNCON &= ~(0xfff);
GPNCON |= 0xaaa;
/* 设置中断触发方式为: 双边沿触发 */
EINT0CON0 &= ~(0xfff);
EINT0CON0 |= 0x777;
/* 使能中断 */
EINT0MASK &= ~(0x3f);
/* 在中断控制器里使能这些中断 */
VIC0INTENABLE |= (0x3); /* bit0: eint0~3, bit1: eint4~11 */
VIC0VECTADDR0 = eint0_3_irq;
VIC0VECTADDR1 = eint4_11_irq;
}
void do_irq(void)
{
int i = 0;
void (*the_isr)(void);
the_isr = VIC0ADDRESS;
//分辨哪个组中断
/* 2.1 分辨是哪个中断 */
/* 2.2 调用它的处理函数 */
/* 2.3 清中断 */
the_isr();
EINT0PEND = 0x3f; /* 清中断 */
VIC0ADDRESS = 0;
}
相关文章推荐
- Java 读取文件
- 存储16进制数据的字节数组BYTE与字符串之间的互换
- POJ 3046
- Android Mms专题之:信息发送流程
- 【顺时针打印矩阵】
- C#学习
- C plus plus 控制格式
- 高质量C/C++编程之文件结构
- Oracle 数据库实例启动关闭过程
- 用线性组合表示两个数的最大公约数
- 谷歌将推出智能电视Android TV
- 谷歌将推出智能电视Android TV
- hadoop2.0 federation与HA的配置
- POJ 2385 Apple Catching (DP)
- 1
- 2014年3月份 月会
- Windows Phone-框架结构和启动过程
- android jni中C++与java互相调用小结
- Oracle sqlplus 常用设置
- Oracle实例精解-第一章阅读笔记