可以帮忙解释一下这段代码吗?官方例程里void UART_IRQHandler(void);的一段,就是IIR寄存器的IIR_RDR可以标识接收中断,IIR_RLS又细分出来一个LSR_RDR也是标识接收中断,后面接收的代码都是一样的。我就不清楚了,接收的时候程序到底是走到哪里呢?
-
- if (IIRValue == IIR_RLS) /* Receive Line Status */
- {
- LSRValue = LPC_UART->LSR;
- /* Receive Line Status */
- if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
- {
- /* There are errors or break interrupt */
- /* Read LSR will clear the interrupt */
- UARTStatus = LSRValue;
- Dummy = LPC_UART->RBR; /* Dummy read on RX to clear
- interrupt, then bail out */
- return;
- }
- if (LSRValue & LSR_RDR) /* Receive Data Ready */
- {
- /* If no error on RLS, normal ready, save into the data buffer. */
- /* Note: read RBR will clear the interrupt */
- UARTBuffer[UARTCount++] = LPC_UART->RBR;
- if (UARTCount == BUFSIZE)
- {
- UARTCount = 0; /* buffer overflow */
- }
- }
- }
- else if (IIRValue == IIR_RDA) /* Receive Data Available */
- {
- /* Receive Data Available */
- UARTBuffer[UARTCount++] = LPC_UART->RBR;
- if (UARTCount == BUFSIZE)
- {
- UARTCount = 0; /* buffer overflow */
- }
- }
复制代码
[
本帖最后由 zhaojun_xf 于 2012-4-26 07:41 编辑 ]
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
还要补充一个问题,IIR_CTI是标识什么的,是指接收超时中断吗?Auto-baud 超时中断指的又是什么。因为我希望有这样的功能,5秒之内串口没有接收到返回值要触发一次中断,但不知道怎么去实现。
还有,我拿ULINK仿真的时候,串口中断函数进不去,最后拿个LED来指示的
从中断函数可以看出,UART有多种中断。不同情况进入不同中断,使用服务函数中有这两种判断,至于什么情况下进入什么中断,跟初始化中断有关。超时中断一般都是使用多字符接收缓冲时有效,例如设置8字节缓冲,那么应该会连续接收8字节,如果中有一定是时间间隙将产生超时中断。 至于ULINK不进断点,这个
不好说,我一般都使用JLINK,感觉比ULINK稳定。
如果你要每字节中断,而且要超时,可以使用定时器实现超时判断。
[ 本帖最后由 zhaojun_xf 于 2012-4-26 19:47 编辑 ]你的问题是没有看懂程序流程吧,我把它对齐了,你再看看就明白了。因为你的程序根本没有进入IIR_RLS中断,所以不会进入LSR_RDR中断。。。。。。
但是数据已经是错的,为什么还要用UARTBuffer把它接出来啊?
一周热门 更多>