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条回答
zhaojun_xf
1楼-- · 2019-03-26 04:06
 精彩回答 2  元偷偷看……
qq243612935
2楼-- · 2019-03-26 05:21
非常感谢赵俊版主的解答,代码是什么意思我能看懂,关键是不知道为什么要这么写。我测试过了,程序是走到else if (IIRValue == IIR_RDA)这个分支里的,但if (LSRValue & LSR_RDR)这个分支里的代码又是做什么用的呢?为什么一个接收中断要有两个中断标识,而且对两个不同的中断标识处理的代码都是一样的。这两个标识分别叫接收数据准备好RDR和接收数据可用RDA,有什么区别,数据手册上说得都不清楚。
还要补充一个问题,IIR_CTI是标识什么的,是指接收超时中断吗?Auto-baud 超时中断指的又是什么。因为我希望有这样的功能,5秒之内串口没有接收到返回值要触发一次中断,但不知道怎么去实现。
还有,我拿ULINK仿真的时候,串口中断函数进不去,最后拿个LED来指示的
zhaojun_xf
3楼-- · 2019-03-26 10:52

从中断函数可以看出,UART有多种中断。不同情况进入不同中断,使用服务函数中有这两种判断,至于什么情况下进入什么中断,跟初始化中断有关。超时中断一般都是使用多字符接收缓冲时有效,例如设置8字节缓冲,那么应该会连续接收8字节,如果中有一定是时间间隙将产生超时中断。 至于ULINK不进断点,这个

不好说,我一般都使用JLINK,感觉比ULINK稳定。

 

如果你要每字节中断,而且要超时,可以使用定时器实现超时判断。

[ 本帖最后由 zhaojun_xf 于 2012-4-26 19:47 编辑 ]
qq243612935
4楼-- · 2019-03-26 13:01
例程里初始化的是LPC_UART->IER = IER_RBR | IER_RLS; 而且数据手册上是说当RBR包含未读字符时,LSR_RDR就被置位,那按理来说if (LSRValue & LSR_RDR)这个分支也应该会进去啊,但事实上它没有进去,而且我想不到还有什么其它的情况可以进到这个分支里,就是这里我不明白。
zhaojun_xf
5楼-- · 2019-03-26 18:20

你的问题是没有看懂程序流程吧,我把它对齐了,你再看看就明白了。因为你的程序根本没有进入IIR_RLS中断,所以不会进入LSR_RDR中断。。。。。。

 

 

1.jpg

2.jpg

 

 

[ 本帖最后由 zhaojun_xf 于 2012-4-27 08:13 编辑 ]
qq243612935
6楼-- · 2019-03-26 21:07
额,确实是理解错了,又看了一下数据手册,只有接收产生错误时才将IIR_RLS置位,然后进IIR_RLS中断,之前是以为LSR_RDR置位也会导致IIR_RLS置位。
但是数据已经是错的,为什么还要用UARTBuffer把它接出来啊?

一周热门 更多>