LPC1114的串口中断处理函数有点不懂

2019-03-25 20:09发布

可以帮忙解释一下这段代码吗?官方例程里void UART_IRQHandler(void);的一段,就是IIR寄存器的IIR_RDR可以标识接收中断,IIR_RLS又细分出来一个LSR_RDR也是标识接收中断,后面接收的代码都是一样的。我就不清楚了,接收的时候程序到底是走到哪里呢?
  1. if (IIRValue == IIR_RLS) /* Receive Line Status */
  2.   {
  3.     LSRValue = LPC_UART->LSR;
  4.     /* Receive Line Status */
  5.     if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
  6.     {
  7.       /* There are errors or break interrupt */
  8.       /* Read LSR will clear the interrupt */
  9.       UARTStatus = LSRValue;
  10.       Dummy = LPC_UART->RBR; /* Dummy read on RX to clear 
  11. interrupt, then bail out */
  12.       return;
  13.     }
  14.     if (LSRValue & LSR_RDR) /* Receive Data Ready */
  15.     {
  16.       /* If no error on RLS, normal ready, save into the data buffer. */
  17.       /* Note: read RBR will clear the interrupt */
  18.       UARTBuffer[UARTCount++] = LPC_UART->RBR;
  19.       if (UARTCount == BUFSIZE)
  20.       {
  21.         UARTCount = 0; /* buffer overflow */
  22.       }
  23.     }
  24.   }
  25.   else if (IIRValue == IIR_RDA) /* Receive Data Available */
  26.   {
  27.     /* Receive Data Available */
  28.     UARTBuffer[UARTCount++] = LPC_UART->RBR;
  29.     if (UARTCount == BUFSIZE)
  30.     {
  31.       UARTCount = 0; /* buffer overflow */
  32.     }
  33.   }
复制代码

[ 本帖最后由 zhaojun_xf 于 2012-4-26 07:41 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
qq243612935
2019-03-26 05:21
非常感谢赵俊版主的解答,代码是什么意思我能看懂,关键是不知道为什么要这么写。我测试过了,程序是走到else if (IIRValue == IIR_RDA)这个分支里的,但if (LSRValue & LSR_RDR)这个分支里的代码又是做什么用的呢?为什么一个接收中断要有两个中断标识,而且对两个不同的中断标识处理的代码都是一样的。这两个标识分别叫接收数据准备好RDR和接收数据可用RDA,有什么区别,数据手册上说得都不清楚。
还要补充一个问题,IIR_CTI是标识什么的,是指接收超时中断吗?Auto-baud 超时中断指的又是什么。因为我希望有这样的功能,5秒之内串口没有接收到返回值要触发一次中断,但不知道怎么去实现。
还有,我拿ULINK仿真的时候,串口中断函数进不去,最后拿个LED来指示的

一周热门 更多>