本人刚学ARM,正在用的是公板s3c44b0
正在学习中断,遇到以下问题,望知道的给个答复,不胜感激!
1:测试外部中断EXTINT4/5/6/7,用非向量中断模式的话,第一次中断可以进,但第二次中断就进不了了。EXTINTPND,INTPND的相应位都显示有中断请求,但第二次就是不能跳到0x18处,自然也就不能再进中断服务程序; why?
2:把INTCON 改为0x05,即向量中断模式的话,其他设置不变,就出错,程序跑飞
3:向量中断与非向量中断要进入中断服务程序的话,在代码上有什么区别?是不是说只要把INTCON设置好就行?我一直不懂向量中断机制是怎么在启动代中直接跳入相应中断地址的.启动代码中三段相关代码如下:
AREA Init,CODE,READONLY
__ENTRY
b ResetHandler
b HandlerUndef
b HandlerSWI
b HandlerPabort
b HandlerDabort
b .
b HandlerIRQ
b HandlerFIQ
VECTOR_BRANCH
ldr pc,=HandlerEINT0
ldr pc,=HandlerEINT1
ldr pc,=HandlerEINT2
ldr pc,=HandlerEINT3
ldr pc,=HandlerEINT4567
ldr pc,=HandlerTICK
b .
b .
ldr pc,=HandlerZDMA0
ldr pc,=HandlerZDMA1
ldr pc,=HandlerBDMA0
ldr pc,=HandlerBDMA1
ldr pc,=HandlerWDT
ldr pc,=HandlerUERR01
b .
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
IsrIRQ ;using I_ISPR register.
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}
;IMPORTANT CAUTION
;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.
ldr r9,=I_ISPR
ldr r9,[r9]
mov r8,#0x0
0
movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0
1
ldr r9,=HandleADC
add r9,r9,r8
ldr r9,[r9]
str r9,[sp,#8]
ldmfd sp!,{r8-r9,pc}
非向量中断机制跳入中断服务程序好理解:由b HandlerIRQ到HandlerIRQ HANDLER HandleIRQ 再到判断哪个中断发生了,即IsrIRQ,然后再跳入设定的中断服务程序地址
按照大多数资料的显示:向量中断进入中断服务程序地址的路径是:0x18处IRQ然后经硬件自动处理到lpc pc,=extint4567,只要在这extint4567对应的RAM地址处放上中断服务程序地址就行。可我就是没见过详细的向量中断模式进入中断服务程序的代码,这是为什么呢??就连我买板子附送的资料上都没有向量中断模式的例子,why??/
有没有能给个进入向量中断模式的详细的代码,有解释当然最好咯。
再次恳请了解,清楚的高人看在培养后人的份上给予解释啊~~~~~~ |