主题 : 关于tiny6410外部中断的问题,有高手能帮解答一下 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 48762
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2011-06-03
最后登录: 2017-09-13
楼主  发表于: 2011-07-15 19:15

 关于tiny6410外部中断的问题,有高手能帮解答一下

这两天一直在弄这个中断,想实现按下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;
}