这两天一直在弄这个中断,想实现按下K1按键进入中断服务程序,现在已经开启了中断(按下K1后,停止当前作业,但是并没有进入中断服务程序)
现象:U-boot命令行下,通过 tftp c0008000 interrupt.bin 下载程序,通过go c0008000运行程序,程序运用后不断输出字符,当按下K1后字符停止输出,初步判断中断服务程序地址设置有问题,
程序如下:
【crt0.s】
.text
.global _start
_start:
@0x00
b Reset
@0x04
HandleUndef:
b HandleUndef
@0x08
SWI:
b SWI
@0x0c
HandlePrefetchAbort:
b HandlePrefetchAbort
@0x10
HandledataAbort:
b HandledataAbort
@0x14
HandleNotUsed:
b HandleNotUsed
@0x18
b IRQ
@0x1c
FIQ:
b FIQ
【interrupt.c】
void init_irq()
{
GPNCON = GPNCON & (~(0x00000003))| 0x00000002; //设置按键对应引脚为中断模式
GPNPUD = GPNPUD & (~(0x00000003))| 0x00000002; //设置为上拉电阻
EINT0CON0 = EINT0CON0 & (~(0x00000007)); //设置为下降沿触发
EINT0MASK = EINT0MASK & (~(0x00000001)); //掩码设为0
EINT0FLTCON0 = EINT0FLTCON0 & (~(0x1<<7)); //禁止滤波
VIC0INTSELECT=VIC0INTSELECT & 0xfffffffe; //设置vic为IRQ
VIC0VECTADDR0 = 0x18; //设置向量地址 这里有些不明白,中断后并没有进入这个地址执行中断服务程序
VIC0INTENABLE = VIC0INTENABLE | 0x00000001; //打开中断
}
void EINT_Handle()
{
if(EINT0PEND & 0x00000001)
{
Uart_SendString("\r\nHello, Mini6410\r\n");
}
EINT0PEND = EINT0PEND & 0x00000001;
VIC0ADDRESS = 0;
VIC1ADDRESS = 0;
}