单身 发表于 2010-10-3 21:03:54

跪求指点 外部中断,好心前辈请指点下啊~~~~感激不尽

用的是TQ2440的板子
工程包含5个文件:s3c2440.h、 init.s、int_fun.c   interrupt.c   Main.c
s3c2440.h里面是一些寄存器定义   略过···
init.s我的初始化文件:
        AREA |Init|,CODE,READONLY
        ENTRY
start
        IMPORT Main
        IMPORT init_led
        IMPORT init_irq
        IMPORT disable_watchdog
        IMPORT EINT_Handle
        b Reset                                          ;复位异常向量
HandleUndef
        b HandleUndef                                ;未定义指令异常向量
HandleSWI
        b HandleSWI                                        ;软件中断异常向量
HandlePrefetchAbort
        b HandlePrefetchAbort                ;指令预取中止异常向量
HandleDataAbort
        b HandleDataAbort                        ;数据访问中止异常向量
HandleNotUsed
        b HandleNotUsed                                ;保留
       

        b HandleIRQ                                        ;外部中断请求异常向量
HandleFIQ
        b HandleFIQ                                        ;快速中断请求异常向量
       
       
Reset
        ldr sp, =4096
        bl disable_watchdog
       
        msr cpsr_c, #0xd2                           ;进入中断模式,并设置中断模式的栈指针
        ldr sp, =3072
       
        msr cpsr_c, #0xdf                            ;进入系统模式,并设置栈指针
        ldr sp, =4096
       
        bl init_led
        bl init_irq
       
        msr cpsr_c, #0x5f                           ;开IRQ中断
        b Main

       
HandleIRQ
        sub lr,lr, #4
        stmdb sp!,{r0-r12,lr}
        ldr lr, =int_return
        ldr pc, =EINT_Handle
int_return
        ldmia sp!, { r0-r12,pc }^
       
        END
*****************************************************************
然后是 init_fun.c其中包含一个函数就是 init_irq() 内容如下:
void init_irq()
{
        GPFCON = 0x022a;                        //        设置GPF口为第二功能
        GPFUP = 0xff;                                //        禁止上拉
       
        PRIORITY = 0x7e;                        //        优先级EINT0>EINT1>EINT2>EINT4
        EXTINT0 = 0x2022;                        //设置EINT0、EINT1、EINT4为下降沿触发,EINT2为低电平触发
       
        EINTMASK = 0x000fffef;                //使能EINT4
        INTMSK = 0xffffffe8;
}
***************************************************************
interrupt.c 是中断处理程序:
#include "s3c2440.h"

void EINT_Handle()
{
        unsigned long oft = INTOFFSET;
        switch( oft )
        {
               
                case 0:                //K4按下
                {
                        GPBDAT |= (0x0f<<5);
                        GPBDAT = ~(1<<8);
                        break;
                }
               
                case 1:                //K1按下
                {
                        GPBDAT |= (0x0f<<5);
                        GPBDAT = ~(1<<5);
                        break;
                }
               
                case 2:                //K3按下
                {
                        GPBDAT |= (0x0f<<5);
                        GPBDAT = ~(1<<7);
                        break;
                }
               
                case 4:        //K2按下
                {
                        GPBDAT |= (0x0f<<5);
                        GPBDAT = ~(1<<6);
                        break;
                }
                default :
                        break;
        }
        //清除中断标志
        if( oft == 4)
                EINTPEND = (1<<4);
        SRCPND = 1<<oft;
        INTPND = 1<<oft;
}
*************************************************
然后 main.c是什么都不做的循环
请问 这样写的程序怎么不能进入中断呢? 我在main.c中加入点亮LED 语句后程序是可以进到main.c中的,就是进不来中断,是不是我哪里少了设置寄存器,还是什么别的原因,跪求论坛前辈指点,感恩戴德啊!

单身 发表于 2010-10-3 21:05:29

4个按键分别对应的是EINT0   EINT1   EINT2EINT4,

单身 发表于 2010-10-3 21:27:42

现在都没有人来指点下了吗?5555555555555555555555555555555555555555555

单身 发表于 2010-10-4 02:01:29

问题已解决,还是要靠自己啊~~

天嵌_support1 发表于 2010-10-6 18:24:39

嘿嘿,国庆玩去了。
你把解决的过程和大家分享一下哈

单身 发表于 2010-10-7 03:26:51

呵呵其实很简单,我在ADS1.2 里面设置的 section 是init

而我的程序里面 是 Init   就这么点区别 折腾我个半死~~~
页: [1]
查看完整版本: 跪求指点 外部中断,好心前辈请指点下啊~~~~感激不尽