| 用的是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中的,就是进不来中断,是不是我哪里少了设置寄存器,还是什么别的原因,跪求论坛前辈指点,感恩戴德啊!
 |