概述
1.中断需要用到寄存器说明:
· SRCPND、SUBSRCPND 表明那些中断被触发。
SUBSRCPND中几位若有一位置位,且SUBINTMSK未屏蔽,则SRCPND中相应有一位置1(多对1关系)
· INTMSK、SUBINTMSK用于屏蔽某些中断
· INTMOD中断模式选择。1==FIQ,0==IRQ
· INTOFFSET:INTPND寄存器位[x]置1时,INTOFFSET寄存器的值为x,在清除SRCND、INTPND时,自动清除INTOFFSET
2.中断寄存器改变过程:
· 中断触发:SUBSRCPND相应位置1(自动)->SUBINTMSK未屏蔽(手动)-> SRCPND相应位置1(自动)->若是FIQ中断(INTMOD相应位为1(手动))-> INTMSK未屏蔽(手动)-> INTPND相应位置1(自动)
Note:读取INTPND、INTOFFSET可以确定中断源。
· 清除中断:SUBSRCPND(EINTPEND)-> SRCPND->INTPND(中断触发过程中自动置1的寄存器) 相应位置1
中断初始化流程
概述:
初始化中断向量表->将相应引脚的功能设置为“外部中断”->设置中断触发条件->开启子中断屏蔽寄存器(若有)(SUBINTMSK相应位设0)->设置中断模式FIQ、IRQ(INTMOD相应位设1)->设置IRQ执行优先级(PRIORITY)->开启中断屏蔽寄存器(INTMSK相应位设0)->使能IRQ或FIQ(CPSR中的I(IRQ)和F(FIQ)位设0)
1.初始化中断向量表
0x00 -> 0x1c:
复位、未定义指令终止模式、管理模式、指令预取终止、数据访问终止、保留、中断模式、快速中断模式
Note:每种模式进入C程序都需要设置各自的Stack。
2.初始化外部中断寄存器
a.打开设置引脚为中断方式
GPGCON |= EINT8 | EINT11 | EINT13 | EINT14 | EINT15 | EINT19;
b.设置CPSR IF位为1,关闭中断
msr cpsr_c, #0xdf
c.设置外部中断触发方式
EXTINTn eg. EXTINT0->EINT0[2:0] 01=下降沿触发 10x=上升沿 11x=边沿触发(x=0低电平,x=1高电平)
d.使能外部中断屏蔽设置
EXINTMSK &= (~(1<<8)) & (~(1<<11)) & (~(1<<13)) & (~(1<<14)) & (~(1<<15)) & (~(1<<19));
e.设置中断优先级.
PRIORITY
f. 使能中断屏蔽设置
INTMSK &= (~(1<<5));
g. 打开IF中断为
msr cpsr_c, #0x5f
3.中断处理
HandleIRQ:
sub lr, lr, #4 @计算中断返回地址
stmdb sp!, {r0-r12, lr} @保护现场
ldr lr, =int_return @
ldr pc, =FUNCTION_EINTHANDLE
int_return:
ldmia sp!, {r0-r12, pc}^
程序
Note:使用arm-linux-objdump –D –m arm xxx_elf > xxx.dis反汇编。必须满足中断向量表是从0x00000000开始