1、编写start.S
在start.S文件中设置中断向量,s3c2440中断向量表中,IRQ硬件中断是在第六个向量中,因此将irq中断放到向量表的第六个上,前面的五个中断有其他用处,我们暂时不用,当出现他们时我们设置一个死循环。
.text
.global _start
_start:
b reset
b halt
b halt
b halt
b halt
ldr pc, =irq_addr
irq_addr:
.word do_irq
do_irq:
ldr sp, = 0x33e00000
sub lr,lr, #4
stmdb sp!,{r0-r12, lr}
bl key_handle
ldmia sp!,{r0-r12, pc}^
reset:
.........(关闭看门狗、设置MPLL、判断NOR或NAND启动、代码重定位)
mrs r0,cpsr //将cpsr读出来
bic r0,r0,#0xf //设置为use模式
bic r0,r0,#(1<<7) //清除I位,使能中断
msr cpsr,r0
ldr sp, =0x33f00000
ldr pc, =sdram
sdram:
bl uart0_init //跳转到sdram初始化函数
ldr pc, =main
halt:
b halt
2、编写中断函数,interrupt.c
查看arm手册,寻找相关寄存器,并设置寄存器。
void eint_init(void)
{
使能INTMSK,使其不再屏蔽相应位的中断
设置中断源,将相应引脚设置为中断引脚
设置中断触发方式:双边沿触发
设置EINTMASK使能相应中断
}
void key_eint_irq(int irq)
{
中断处理函数
清中断,EINTPEND
}
void key_handle(void) //中断处理函数
{
判断中断源
调用相应的处理函数
从源头清中断,SRCPND、INTPND
}