LPC2138串口的接收和发送FIFO
月城清浅 2022-01-28

    LPC2138的串口带有16字节的接收和发送FIFO,并且接收FIFO的触发点可设为1,4,8,14字节。

      
     1)接收


      当接收到的字节数达到设置的触发点(通过FCR寄存器设置)时,就会产生接收中断;而当接收到的字节数未能达到设置的触发点(比如触发点设置为14,但是只接收到了10个字节的数据),那么经过短暂的等待时间后会产生超时中断。在这两种情况下需要正确读取RBR寄存器,妥善保存接收到的数据。
      举例来说,假设接收FIFO的触发点设置为14,而要接收的数据一共有16字节。那么接收过程中会产生两次中断:第一次是当接收到第14个字节时产生的接收中断;之后只剩2个字节要接收,达不到触发点14,所以经过等待时间后会产生超时中断。
      中断服务程序里,对于这两种中断可进行如下的处理(假设使用UART1):


      switch (U1IIR & 0x0E)
      {
            case 0x0C:            // 若为超时中断(注意此处不要加break)
            case 0x04:            // 若为接收中断
                  while ((U1LSR & 0x01) == 1)             // 若U1RBR包含有效数据
                        Rec_Buffer[index++] = U1RBR;    // 保存接收到的数据
      }


      
      2)发送


      发送FIFO并没有触发点的问题。要发送数据时,首先把数据写入THR寄存器,之后会将其移入发送FIFO缓冲区中,一旦THR寄存器被移空,就会产生发送中断。换句话说,在使能了发送中断的情况下,每向THR寄存器写一个字节就会引起一次发送中断。所以要发送一系列的数据时,只需要发送第一个字节来启动发送过程,剩余的字节由中断服务程序来完成就可以了。
      假设Send_Length为要发送的总字节数,程序中的处理如下:


      U1THR = Txd_Buffer[0];
      index = 1;
     
      void __irq Uart1_isp(void)                           // 中断服务程序
      {
            if ((U1IIR & 0x0E) == 0x02)                   // 判断是否为发送中断
            {
                  if (index != Send_Length)
                  {
                        U1THR = Txd_Buffer[index];
                        index ++;
                  }
            }
      }


      个人觉得,使能发送中断会导致MCU的工作效率变低。因为一旦THR寄存器为空就会进入中断服务程序,会出现连续的无效中断。(如果理解有错误,还请指正)
      在不使能发送中断的情况下,可用查询方式实现以上的发送过程:


      int i;
      for (i = 0; i < Send_Length; i++)
     {
           U1THR = Txd_Buffer[i];
           while (!(U1LSR & 0x20));         // 等待当前字节发送完毕
      }
 

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 单片机系统振荡电路图

    [导读]振荡电路 图 振荡电路图单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶

    8小时前
  • 单片机常识—结构和相关公司

    [导读]概述绝大多数现在的单片机都是基于冯·诺伊曼结构的,这种结构清楚地定义了嵌入式系统所必需的四个基本部分:一个中央处理器核心,程序存储器(只读

    8小时前
  • AVR单片机一些学习笔记

    [导读]下面是自己在学习AVR单片机时的学习经验,分享出来给大家,一起学习。1、 AVR单片机采用RISC架构,8051单片机采用CISC架构。前者速度为后者的

    8小时前
  • 单片机编程中关于堆栈的一些问题

    [导读]编译器在生成代码使用两个堆栈:一个是用于子程序调用和中断操作的硬件堆栈,一个是用于以堆栈结构传递的参数临时变量和局部变量的软件堆栈。硬件堆栈是从数据内存

    8小时前
  • 单片机应用系统种类及应具备的功能

    [导读]单片机应用系统有几种类别答:按照单片机系统扩展与系统配置,单片机应用系统可以分为最小应用系统、最小功耗系统、典型应用系统等。单片机典型应用系统应具备的功

    8小时前
  • MCS-51单片机硬件结构的基本特点是什么?

    [导读]MCS-51单片机硬件结构的基本特点是什么?答:由于MCS-51单片机是在MCS-48的基础上推出的增强型产品。比后者提高了芯片的集成度,性能大为提高,

    8小时前
  • MCS-51单片机输入/输出(I/O)是怎样设置的?

    [导读]MCS-51单片机I/O是怎样设置的答:MCS-51单片内部I/O口的数量和种类多而齐全,尤其是它有一个全双工的串行口,更突出了这种单片机的本身特点。该

    8小时前
  • 51系列单片机关于时序问题

    [导读]单片机的基本操作周期为机器周期,一个机器周期分为六个状态,每个状态由两个脉冲组成,也就是所谓的两箱(前一个脉冲P1叫相位1,后一个脉冲P2为相位2)。所

    8小时前
  • 如何看懂时序图?

    [导读]操作时序永远使用是任何一片IC芯片的最主要的内容。一个芯片的所有使用细节都会在它的官方器件手册上包含。所以使用一个器件事情,要充分做好的第一件事就是要把

    8小时前
  • 单片机的烧写原理

    [导读]我要问的不是如何制作烧写接口。 而是,电脑在通过接口向单片机烧写时(此时单片机 内没有程序),电脑是如何通过接口访问内部rom的??对应p口怎么就会指向

    8小时前
  • 单片机最小电源供电模块介绍

    [导读]电源供电模块 图 电源模块电路图对于一个完整的电子设计来讲,首要问题就是为整个系统提供电源供电模块,电源模块的稳定可靠是系统平稳运行的前提和基础。51

    05-13
  • PIC单片机之I2C(从模式)

    [导读]网上有许多讲解单片机 实现I2C主模式,但是从模式的很少。我现在就来讲讲PIC单片机使用MSSP模块实现I2C从模式。有关I2C协议的具体介绍可以看 《

    05-13
下载排行榜
更多
广告