最近在学习LPC2294的
ARM,想通过中断来实现UART0的读写,现在一直不能进入中断处理程序,资料上的关于IRQ中断的部分也没有看明白,不知道该怎么把VICVectAdd6(我选择的是6的优先级),和中断处理程序联系起来,
- <blockquote>void __irq bc_int_uart()
复制代码上面写了就是不能跳转到我的中断处理子程序,
资料上的关于中断的部分程序如下:
- <blockquote> MACRO
复制代码 SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP!, {R3}
STMFD SP, {LR}^ ; 保存用户状态的SP,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
SUB SP, SP, #4
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {LR}^ ; 恢复用户状态的SP,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
ADD SP, SP, #4 ;
LDMFD SP!, {R3}
MSR SPSR_cxsf, R3
LDMFD SP!, {R0-R3, R12, PC}^ ;
MEND
- ;startup.S<font size="5">程序如下:我没有看明白怎么会跳转到IRQ中断处理部分</font>
复制代码求教高人啊,,,,,
我把汇编部分的代码放在附件里面,希望高人给我指点啊,,,- <blockquote>
复制代码上面的部分还需要自己扩充吗?怎么都是while(1)???
-
-
src.rar
4.13 KB, 下载次数: 0
顺便说下,我的中断不能执行的原因是我在汇编函数里面没有开中断,,然后,串口中断里面的函数也很重要,要不然话会无法读出,或者一直进入中断。正确的中断处理函数如下所示:
- void __irq bc_int_uart()
- {
- while((U0IIR&0X01)==0)//这个while循环很重要。否则会一直进入中断
- {
- if((U0IIR&0X0e)==0X04)
- {
- w_qq = U0RBR;
- bcwrite_ch(w_qq);
- U0LSR &= 0XFE;
-
- led(w_qq);
- //delay1us(1000);
- //s_qq <<= 1;
- }
- }
- VICVectAddr = 0x00;//这一步是清除中断
- }
复制代码一周热门 更多>