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 13:01
例程里初始化的是LPC_UART->IER = IER_RBR | IER_RLS; 而且数据手册上是说当RBR包含未读字符时,LSR_RDR就被置位,那按理来说if (LSRValue & LSR_RDR)这个分支也应该会进去啊,但事实上它没有进去,而且我想不到还有什么其它的情况可以进到这个分支里,就是这里我不明白。

一周热门 更多>