什么是UART中的FIFO
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的更多相关文章
- [tty与uart]UART中的硬件流控RTS与CTS
转自:http://blog.csdn.net/zeroboundary/article/details/8966586 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) ...
- 在shell中通过fifo与服务器交互
首先,需要说的是:1.在shell中,运行的每一个命令至少启动一个新进程,且:$$:获取当前shell的进程号(PID)$! :执行上一个指令的PID2.重定向与管道有点类似,例子:cmd1 < ...
- UART中的硬件流控RTS与CTS DTR DSR DTE设备和DCE设备【转】
中低端路由器上使用disp interface 查看相应串口状态信息,其中DCD.DTR.DSR.RTS及CTS等五个状态指示分别代表什么意思? DCD ( Data Carrier Detect 数 ...
- UART中的硬件流控RTS与CTS【转】
转自:http://blog.csdn.net/zeroboundary/article/details/8966586 5/23/2013 5:13:04 PM at rock-chips insh ...
- 网络中,FIFO、LRU、OPT这三种置换算法的缺页次数
FIFO.LRU.OPT这三种置换算法的缺页次数 转载 由于要考计算机四级网络,这里遇到了问题,就搜了一些资料来解疑. 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3 ...
- [uart]UART中的硬件流控RTS与CTS
转自:http://blog.csdn.net/zeroboundary/article/details/8966586 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) ...
- UART中的硬件流控RTS与CTS
最近太忙了,没时间写对Ucos-II的移植,先将工作中容易搞错的一个知识点记录下来,关于CTS与RTS的. 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) 推出了聪明猫( ...
- UART中RTS、CTS
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据. CTS (Clear ToSend,发送允许)为输入信号,用于 ...
- 协议中UART的两种模式 【转】
转自:http://wjf88223.blog.163.com/blog/static/3516800120104179327286/ ^^…… 协议栈中UART有两种模式:1.中断2.DMA 对于这 ...
随机推荐
- [整理]Centos6.5 + hadoop2.6.4环境搭建
搭建Hadoop集群环境(3台机器) 1 准备环境 1.1 安装系统,并配置网络使3台机器互联互通,且SSH可直连(无需密码.保存私钥) 1.1.1 安装系统 安装Centos 6.5系统 安装过程略 ...
- php 读取输出其他文件的方法
ob_start();iconv('utf-8','gb2312',readfile('1.html')); //直接输出文本内容echo '<hr>'; $data = file_get ...
- android.widget.Toast
widget 小部件 toast 烤面包 Toast.makeText(当前活动, 信息, 时间长短) 例:Toast.makeText(FirstActivity.this, "You c ...
- CopyFile类通过调用这个类的delete(String filePath)方法可以组合成一个Cut类
package folderoperation; import java.io.File;/** * 注意它会删除文件,文件夹以及文件夹下的所有内容(根据指定的地址) * @author Dawn * ...
- Remove-Azureaccount (Can't get Azure credentials to stick in Powershel)
https://social.technet.microsoft.com/forums/azure/en-US/260df055-7c4e-4ce2-8f8d-190ad20a4b76/cant-ge ...
- 【数学】Matrix Multiplication
Matrix Multiplication Time Limit: 2000MS Memory Limit: 65536K Total S ...
- JVM基础知识
JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.J ...
- 【GO】GO语言学习笔记四
流程控制 1.条件语句 举个栗子: if x>5 { return 1; }else{ return 0; } 注意: 条件语句不需要使用括号将条件包含起来(); 无论语句体内有几条语句, ...
- git的一些命令行
以下代码均在命令行中执行:在目标文件夹目录下: 1.初始化一个Git仓库,使用git init命令. 2.添加文件到Git仓库,分两步: 第一步,使用命令git add <file>,注意 ...
- java读取输入流
java读取输入流两种 private static byte[] readStream(InputStream in){ if(in==null){ return null; } byte[] bu ...