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