FIFO是先进先出缓冲区的意思,即串口接收到的数据可以先进入FIFO,不必马上进入中断服务程序接收,这样可以节省CPU时间。对于发送数据也一样可以把要发送的数据一起写入FIFO,串口控制器按照写入的顺序依次发送出去。

FIFO只是一个缓冲器而已,如果你的CPU没有什么别的工作或完全处理过来uart数据的话,可以用noFIFO模式,如果你的CPU有一些耗时工作要处理,可能uart数据来了很多才开始处理,这样就需要FIFO做缓冲区了。串口会设置触发等级,就是预先设置一个值,每当传输这个值的数据量就触发一次中断。比如设置8个字节,那么每传输8字节数据就会触发一次中断。

很多人停留在每收发一个字符就要中断处理一次的老思路上。UART收发FIFO主要是为了解决收发中断过于频繁而导致CPU效率不高的问题。这就是FIFO的必要性,在进行UART通信时,中断方式比轮询方式要简介且有效率。但是,如果没有收发FIFO,则每传输一个数据(5~8位)都要中断处理一次,这样中断方式,效率仍然不高。如果有了收发FIFO,则可以连续收发若干数据(可多至14个)后才产生一次中断,然后一起处理,这就大大提高了收发效率。

接收超时问题,如果没有接收超时功能,则在对方已经发送完毕而接收FIFO未满时并不会触发中断(FIFO满才会触发中断),结果造成最后接收到的有效数据得不到处理的问题。有了接收超时功能后,如果接收FIFO未满而对方送已经停止,则在不超过3个数据的接收时间内就会触发超时中断,因此数据会照常处理。

总之,FIFO的设计时优秀而合理的,它已经帮你向导了收发过程中存在的任何问题,只要初始化配置UART后,就可以放心的收发了,FIFO和中断例程会自动搞定一切。完全不必要担心FIFO大大减少了中断产生的次数而可能造成数据丢失的问题。

发送时,只要发送FIFO不满,数据只管往里连续放,放完后就直接退出发送子程序,随后,FIFO真正发送完成后会自动产生中断,通知主程序:我已经完成了真正的发送。

接收时,如果对方连续不间断发送,则填满FIFO后会以中断的方式通知主程序说:现在有一批数据来了,请处理。如果对方是间断性发送,也不要紧,当间隔时间过长(2~3个字符传输时间),也会产生中断,这次是超时中断,通知主程序说:对方可能已经发送完毕,但FIFO未满,请处理。

当然也可以软件字节定义一种缓冲区作为FIFO

【相关库函数】

1. UARTConfigSet()配置UART,例如UART2:波特率9600,数据位8,停止位1,无校验

UARTConfigSet(UART2_BASE, 9600, UART_CONFIG_WLEN_8 |UART_CONFIG_STOP_ONE |

UART_CONFIG_PAR_NONE);

2. UARTFIFOLevelSet()

  设置UART收发FIFO的深度,可以设置的深度有2、4、8、12、14

3. UARTSpaceAvail()

  确认在发送FIFO里是否有可利用的空间。

4. UARTCharsAvail()

  确认在接收FIFO里是否存在字符。

5. UARTCharPutNonBlocking()

  该函数要与UARTSpaceAvail()配合使用,如果已确认发送FIFO里有可用空间,则将字符直接放入发送FIFO,不等待。

6. UARTCharGetNonBlocking()

  该函数要与UARTCharsAvail()配合使用,如果已确认接收FIFO里有字符,则直接从接收FIFO里读取字符,不等待。

7. UARTCharPut()

  将字符放到发送FIFO里,如果没有可用空间则一直等待。

8. UARTCharGet()

  从接收FIFO里读取字符,如果没有字符则一直等待。

9. UARTIntEnable() 使能一个或多个UART中断,例如:同时使能接收中断(接收FIFO溢出)和接收超时中断

UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT);

转帖:http://blog.csdn.net/zlsh007/article/details/35367521

什么是UART中的FIFO的更多相关文章

  1. [tty与uart]UART中的硬件流控RTS与CTS

    转自:http://blog.csdn.net/zeroboundary/article/details/8966586 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) ...

  2. 在shell中通过fifo与服务器交互

    首先,需要说的是:1.在shell中,运行的每一个命令至少启动一个新进程,且:$$:获取当前shell的进程号(PID)$! :执行上一个指令的PID2.重定向与管道有点类似,例子:cmd1 < ...

  3. UART中的硬件流控RTS与CTS DTR DSR DTE设备和DCE设备【转】

    中低端路由器上使用disp interface 查看相应串口状态信息,其中DCD.DTR.DSR.RTS及CTS等五个状态指示分别代表什么意思? DCD ( Data Carrier Detect 数 ...

  4. UART中的硬件流控RTS与CTS【转】

    转自:http://blog.csdn.net/zeroboundary/article/details/8966586 5/23/2013 5:13:04 PM at rock-chips insh ...

  5. 网络中,FIFO、LRU、OPT这三种置换算法的缺页次数

    FIFO.LRU.OPT这三种置换算法的缺页次数 转载  由于要考计算机四级网络,这里遇到了问题,就搜了一些资料来解疑. 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3 ...

  6. [uart]UART中的硬件流控RTS与CTS

    转自:http://blog.csdn.net/zeroboundary/article/details/8966586 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) ...

  7. UART中的硬件流控RTS与CTS

    最近太忙了,没时间写对Ucos-II的移植,先将工作中容易搞错的一个知识点记录下来,关于CTS与RTS的. 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) 推出了聪明猫( ...

  8. UART中RTS、CTS

    RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据. CTS (Clear ToSend,发送允许)为输入信号,用于 ...

  9. 协议中UART的两种模式 【转】

    转自:http://wjf88223.blog.163.com/blog/static/3516800120104179327286/ ^^…… 协议栈中UART有两种模式:1.中断2.DMA 对于这 ...

随机推荐

  1. centOs安装jdk1.7

    1,下载jdk-7u75-linux-x64.tar.gz,地址http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloa ...

  2. .net 事务处理的三种方法

    方法1:直接写入到sql 中 在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现 begin trans declare@orderDetail ...

  3. django和apache交互的wsgi分析

    很多django程序员会用django进行web程序的开发,会用django的命令行命令进行程序的调试,但不会将simpleserver换成apache的配置,也有很多django程序员知道怎么用ws ...

  4. 妈妈再也不担心我的编码问题了。中文编码融汇贯通,windows,django,python,java,html 【转】

    http://blog.csdn.net/farmer_cc/article/details/41830999 HTML编码:html文件是utf-8编码的,不确定的话用记事本打开,另存为的时候就能够 ...

  5. openWrt 安装与实践

    1. 先装一个编译用的环境, ubuntu 14 2. 在ubuntu里面安装svn, g++, libncurses5-dev git libssl-dev gawk, svn因为openwrt社区 ...

  6. linux和windows下的自动ftp脚本(shell bat)

    一.先来看linux下的: 复制代码 代码如下: #! /bin/bashcd /ftp/CURRENTDATE=` date +%Y%m%d `YESTERDAY=` date -d yesterd ...

  7. 微信支付JsAPI

    https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip 下载获取微信支付demo压缩包 打开压缩包,并将其中 Wxpay ...

  8. TWebBrowser 调用最新版的Ie Internet Feature Controls (B..C)

    Internet Feature Controls (B..C)   Updated: July 2012 This article describes feature controls with n ...

  9. mongoose 的 model,query:增删改查

    简介 mongoose是node.js的一个操作mongodb的模块,比起之前mongodb模块,只需要在开始时连接,不需要手动关闭,十分方便. 连接mongodb 首先你需要安装mongodb.有了 ...

  10. 20161011001 treeView 递归

    protected void FillTree()        {            H_data H_data = new H_data(); H_data.sql_text1 = " ...