str r1,[r0]
2)IRQ中断处理函数
|
下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置1 置1表示目前此中断等待响应(每次只能有一位置1),从最高优先级中断位开始判断,检测到等待服务 ;中断就将pc置为中断服务函数首地址 |
IsrIRQ ;using I_ISPR register.
sub sp,sp,#4 ;reserved for PC,为PC留下空位.
stmfd sp!,{r8-r9} ;把r8,r9先入栈
ldr r9,=I_ISPR ;读入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] ;得到相应的IRQ程序地址
str r9,[sp,#8] ;把IRQ程序的地址当成PC值入栈
ldmfd sp!,{r8-r9,pc} ;对PC赋值,转到新的中断程序处。
3)定义一个加载宏。
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
;由于ADS仅支持FD(满递减)型堆栈
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)
;将要使用的R0寄存器压栈保护。
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
;将对应的中断函数首地址入栈保护
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
;将中断函数的首地址出栈,放入PC中,系统将跳转到对应中断处理函数
MEND
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

