LPC2294中断问题,不知道怎么处理IRQ的?

2019-07-15 17:42发布

最近在学习LPC2294的ARM,想通过中断来实现UART0的读写,现在一直不能进入中断处理程序,资料上的关于IRQ中断的部分也没有看明白,不知道该怎么把VICVectAdd6(我选择的是6的优先级),和中断处理程序联系起来,
  1. <blockquote>void __irq bc_int_uart()
复制代码上面写了就是不能跳转到我的中断处理子程序,
资料上的关于中断的部分程序如下:
  1. <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


  1. ;startup.S<font size="5">程序如下:我没有看明白怎么会跳转到IRQ中断处理部分</font>
复制代码求教高人啊,,,,,我把汇编部分的代码放在附件里面,希望高人给我指点啊,,,
  1. <blockquote>
复制代码上面的部分还需要自己扩充吗?怎么都是while(1)???


src.rar 4.13 KB, 下载次数: 0
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
iysheng
1楼-- · 2019-07-15 19:53
上面的汇编部分,应该是和ucos有关的,开始的汇编(也就是startup.S压缩包里面的)可以实现irq中断,直接运行VICVectAddr里面的地址函数。
顺便说下,我的中断不能执行的原因是我在汇编函数里面没有开中断,,然后,串口中断里面的函数也很重要,要不然话会无法读出,或者一直进入中断。正确的中断处理函数如下所示:
  1. void __irq bc_int_uart()
  2. {
  3.         while((U0IIR&0X01)==0)//这个while循环很重要。否则会一直进入中断
  4.        {
  5.         if((U0IIR&0X0e)==0X04)
  6.         {
  7.                 w_qq = U0RBR;
  8.                 bcwrite_ch(w_qq);
  9.                 U0LSR &= 0XFE;
  10.                
  11.                 led(w_qq);
  12.                 //delay1us(1000);
  13.                 //s_qq <<= 1;
  14.         }
  15.         }
  16.         VICVectAddr = 0x00;//这一步是清除中断        
  17. }
复制代码

一周热门 更多>