打印
[ZLG-ARM]

串口0中断求助

[复制链接]
1545|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fdy2007|  楼主 | 2007-4-19 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 void UART0_Exception(void)

    uint8 rcv_buf[14],i,IIR;
    VICIntEnClr =  1<<6;
    VICVectAddr = 0;//中断处理结束
    OS_ENTER_CRITICAL();
    OS_EXIT_CRITICAL(); 
     while(((IIR = U0IIR) & 0x01) == 0)
    {
      switch(IIR & 0x0e)
      {
        case 0x02:break;                           //THRE中断
        case 0x04:                                 //接收数据中断
                  for(i=0;i<14;i++)                   //读取FIFO的数据,并清除中断标志
                  {
                    rcv_buf = U0RBR;
                  }
        
                  for(i=0;i<14;i++)                   //读取FIFO的数据,并清除中断标志
                  {
                    U0THR = rcv_buf;
                  } break;
        case 0x06:break;                          //接收线状态
        case 0x0c:
                 // U0IER = U0IER&(~0x01);           //字符超时指示,禁止接收字符超时中断
                  break;
        default: break;
      }
      VICIntEnable = (1 << 6); 
        
    }
    }

程序如上,我设置的FIFO为14个字符,实验中,当连续发送14个字符时,一切正常,但是连续发送的字母不是14个时,程序就死在取指中断处了。我不知道到底怎么回事,想了半天也想不通,高手帮帮忙吧

相关帖子

沙发
fdy2007|  楼主 | 2007-4-19 16:56 | 只看该作者

问题已经解决

修改如下: 

case 0x0c:
                   for(i=0;i<14;i++)                   //读取FIFO的数据,并清除中断标志
                  {
                    rcv_buf = U0RBR;
                  }
                  break;


但是我不知道为什么?难道字符超时中断需要读缓冲区来清除中断?

使用特权

评论回复
板凳
zlgARM| | 2007-4-19 21:07 | 只看该作者

fdy2007

干脆试一下你的字符超时中断能不能正确发生。

使用特权

评论回复
地板
fdy2007|  楼主 | 2007-4-20 07:45 | 只看该作者

zlgARM

我试过,这样修改后以后的字符超时中断可以继续发生,串口的各个中断都正常发生

使用特权

评论回复
5
zlgARM| | 2007-4-20 08:08 | 只看该作者

fdy2007

两个地方有问题。
进入了ISR后,IRQ中断已经自动被关掉了。
为何要用OS_ENTER_CRITICAL和EXITCRITICAL?

此外不应该在ISR中这样使用发送FIFO。一般是在main。c里填充发送FIFO,然后设置THRE中断,不然填得太快,数据还没送出去,发送很容易出错。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝