13569|12

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LPC1114的串口中断处理函数有点不懂 [复制链接]

可以帮忙解释一下这段代码吗?官方例程里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 编辑 ]
此帖出自NXP MCU论坛

最新回复

楼主你好。。 lpc2368 ,照着这个程序进不了中断呢, 楼主还有自己修改后的源码吗?  详情 回复 发表于 2016-11-23 10:50
点赞 关注
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 

想看程序往哪里走,和简单,直接使用仿真器仿真即可。至于代码,下面我用中文注释了一下,应该能看懂了。

 

  1. /**
      * @函数名:  UART_IRQHandler
      * @描述:  UART 中断处理程序 handler
      * @参数:  无
      * @返回值: 无
      */
    void UART_IRQHandler(void)
    {
      uint8_t IIRValue, LSRValue;
      uint8_t Dummy = Dummy;

  2.   IIRValue = LPC_UART->IIR;
      
      /* 跳过 IIR 挂起位 */ 
      IIRValue >>= 1;   
      IIRValue &= 0x07;   
      /* 检查  1~3  位, 确定中断  */
      /* 接收行状态 */
      if (IIRValue == IIR_RLS)  
      {
        LSRValue = LPC_UART->LSR;
        /* 接收行状态s */
        if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
        {
          /* 存在错误或产生了中断 */
          /* 读 LSR 将清除中断 */
          UARTStatus = LSRValue;
          Dummy = LPC_UART->RBR; 
          return;
        }
        if (LSRValue & LSR_RDR) /* 接收数据准备好 */   
        {
          /* 如果 RLS 没有产生错误, 准备正常, 保存到数据缓冲区。 */
          /* 注意: 读 RBR 将清除中断 */
          UARTBuffer[UARTCount++] = LPC_UART->RBR;
          if (UARTCount == BUFSIZE)
          {
            UARTCount = 0;  /* buffer overflow */
          } 
        }
      }
      /* 接收数据可用 */
      else if (IIRValue == IIR_RDA) 
      {
        /* 接收数据可用 */
        UARTBuffer[UARTCount++] = LPC_UART->RBR;
        if (UARTCount == BUFSIZE)
        {
          /* 缓冲区溢出 */
          UARTCount = 0;  
        }
      }
      /* 字符超时指示 */
      else if (IIRValue == IIR_CTI) 
      {
        /* 字符超时指示 */
        /* 第 9 位 CTI 错误 */
        UARTStatus |= 0x100;  
      }
      /* THRE, 发送保持寄存器空 */
      else if (IIRValue == IIR_THRE) 
      {
        /* THRE interrupt */
        LSRValue = LPC_UART->LSR;  /* 检查 LSR 状态查看
       U0THR 是否已经包含有效数据 */
        if (LSRValue & LSR_THRE)
        {
          UARTTxEmpty = 1;
        }
        else
        {
          UARTTxEmpty = 0;
        }
      }
      return;
    }

复制代码

此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 zhaojun_xf 的帖子

非常感谢赵俊版主的解答,代码是什么意思我能看懂,关键是不知道为什么要这么写。我测试过了,程序是走到else if (IIRValue == IIR_RDA)这个分支里的,但if (LSRValue & LSR_RDR)这个分支里的代码又是做什么用的呢?为什么一个接收中断要有两个中断标识,而且对两个不同的中断标识处理的代码都是一样的。这两个标识分别叫接收数据准备好RDR和接收数据可用RDA,有什么区别,数据手册上说得都不清楚。
还要补充一个问题,IIR_CTI是标识什么的,是指接收超时中断吗?Auto-baud 超时中断指的又是什么。因为我希望有这样的功能,5秒之内串口没有接收到返回值要触发一次中断,但不知道怎么去实现。
还有,我拿ULINK仿真的时候,串口中断函数进不去,最后拿个LED来指示的
此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

4
 

回复 板凳 qq243612935 的帖子

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

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

 

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

[ 本帖最后由 zhaojun_xf 于 2012-4-26 19:47 编辑 ]
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 zhaojun_xf 的帖子

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

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

6
 

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

 

 

 

 

[ 本帖最后由 zhaojun_xf 于 2012-4-27 08:13 编辑 ]
此帖出自NXP MCU论坛

点评

受教了 非常感谢  详情 回复 发表于 2013-11-11 18:37
 
个人签名我的博客
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 zhaojun_xf 的帖子

额,确实是理解错了,又看了一下数据手册,只有接收产生错误时才将IIR_RLS置位,然后进IIR_RLS中断,之前是以为LSR_RDR置位也会导致IIR_RLS置位。
但是数据已经是错的,为什么还要用UARTBuffer把它接出来啊?
此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

8
 

回复 7楼 qq243612935 的帖子

错误有几种,但是不是每种错误都会想象数据,如果不影响的情况,仍然可以把数据读出
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼 zhaojun_xf 的帖子

哦,了解了,谢谢~
此帖出自NXP MCU论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(中级)

10
 
学习了,谢谢版主。
此帖出自NXP MCU论坛
 
个人签名www.weboch.com.cn
NXP MCU RFID Logic automotive  IC & solution
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

11
 
弱弱的问一下:51串口接收完都需要清楚接收中断,这个的中断标识是哪一个啊?
此帖出自NXP MCU论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

12
 

回复 6楼zhaojun_xf 的帖子

受教了   非常感谢
此帖出自NXP MCU论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

13
 
楼主你好。。 lpc2368 ,照着这个程序进不了中断呢, 楼主还有自己修改后的源码吗?
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表