LPC2000 UART串口使用心得

针对zgpswh在串口使用上的一些难题,总结个人在前一阶段的理解,比较片面,不对的地方请高手指正。

1、LPC2000 系列芯片的串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,UART的FIFO是一个硬件环形的缓冲队列,物理上不可寻址,不可见,仅U0RBR这个FIFO出口可见。U0RBR就是接收FIFO的第一位。FIFO的长度是可设的,也叫触发点,低于这个长度的字符串不会引起中断,但在实际应用中,不可能串口读入的数据长度总为触发点值的整数倍,为此,引入了CTI即字符接收超时中断,当有不足触发点值规定的字符串读入时,将引起中断,其与串口的RDA中断具有相同的优先级,并会同时被使能。
那么,LPC2000的UART机制是如何判断串口读入数据的一次性容量呢?如果接收FIFO里已经有了1个字符,它可在一定的时间内等待下一个字符的读入,也就是说,不超过一定的时间就不会触发CTI中断,这个时间是在本次通讯协议设置的前提下,接收3.5到4.5个字符所用的时间。比如,需串口接收GPRS数传状态成功建立后的返回值“Ok_Info_WaitingForData”22个字符组成的字符串,FIFO触发点设置为14,在前14个字符读入之后,立即触发RDA中断,跳转至RDA中断服务子程序将这14个字符放入我所预设的缓冲区内,接着,后8个字符读入,这时CPU并不立刻中断,它需等待在本次串口通讯协议设置的前提下,接收3.5到4.5个字符所用的时间(需根据波特率和帧格式具体计算),这个时间一到,立刻触发CTI中断,换句话说,超过这个时间的等待,CPU就认为一个完整的字符串已经结束了,这才是字符串超时的真正含义。
   
2、为什么要用FIFO呢?我个人觉得,主要是为了提高串口的利用效率,同时可以避免一定程度上的丢包。比如,在用串口发送FIFO中断时,触发深度设为8,那么接收中断发生的条件是,FIFO里有了8个字符,但不是8个字节,因为串口异步通信的协议中,会加帧头和帧尾,但外表上还是以字符为单位。发送时,则是当FIFO里不满8个字符的时候要中断一次,所以利用FIFO发送时也要自建一个用来串口发送的缓冲池,发送中断服务程序里要做的就是从这个发送缓冲区里取数送进FIFO里,沿用上面的假设,触发深度设为8,一次性向FIFO里送15个字符,在送入第一批15个字符之后串口开始自动发送,当FIFO里只有7个字符时,立即发生中断,因此,在发送中断服务程序里要设个计数指针作为跳出中断的上限,这个上限不是8而是15。我认为,如果要发挥fifo的高效率,就必须把自设的缓冲区作成一个环状链表,即,不需要做移位处理使自设的缓冲区剩余的数据顶头。ZLG有详细的基于队列思想的例程。

3、个人觉得,当FIFO的触发深度设为1时和不用FIFO时的效果是一样的。

4、串口发送时,推荐第一个字符要在打开串口中断前送,否则可能中断只来一次。比如下面的这个用串口中断发送字符串的函数为:
/****************************************************************************************************
** 函数名称 :UART0_SendStr()
** 函数功能 :向串口发送字符串
** 入口参数 :str    要发送的字符串的首地址指针
** 出口参数 :无
*****************************************************************************************************
void UART0_SendStr( CHAR const  *str)

     Str_Send_P = str;
     U0THR = *Str_Send_P++;
     U0IER |= 0x02;      //开发送中断     
}
在中断发送程序中的处理为:
SWITCH(IIR & 0x0e)
       {
         case 0x02:              //利用串口发送中断,发送字符串
              if((*Str_Send_P)!='\0')
              U0THR = *Str_Send_P++;
              else
              U0IER &= (~0x02);   //关发送中断
              break;
这种做法的道理不太明白,但实验证明,不这么做就只发一次


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liukun321/archive/2010/05/31/5636748.aspx

转载于:https://www.cnblogs.com/jxnclyk/archive/2010/12/31/1923449.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张钹院士:可解释、可理解是人工智能研究的主攻方向 | CCF-GAIR 2018

作者:刘鹏摘要:张钹院士历经了中国人工智能的从无到有,从弱到强,因而他也最能清楚地针对中国人工智能近年来的不同发展状态,发表适合的看法和提出正确的建议。2017 年末清华大学举办的「从阿尔法 Go 到通用人工智能&am…

小甲鱼 OllyDbg 教程系列 (二) :从一个简单的实例来了解PE文件

小甲鱼视频讲解:https://www.bilibili.com/video/av6889190?p6https://www.bilibili.com/video/av6889190?p7 从一个简单的实例来了解PE文件:https://www.freebuf.com/articles/system/86596.htmlhttps://blog.csdn.net/billvsme/article/details/383…

金矿 与 淘沙工

此地是金矿 拥挤着千百万的人 有人利用了金矿 有人做了淘沙工 此地金矿否? 有若没用亦如无 生命流水 金淘沙? 此时的我 身处“金矿” 却用似金的光阴 做着淘沙工作 生命难道仅流水 黄金城市淘沙工? 转载于:https://www.cnblogs.com/freelive…

深入理解Nginx~用于调试进程和定位问题

1、是否以守护进程方式运行Nginx 语法: daemon on|off; 默认: daemon on; 守护进程(daemon)是脱离终端并且在后台运行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也…

301跳转的实现

老站首页的pr比较高,除了首页都要做301重定向,但是用了 Response.Status "301 Moved Permanently"; Response.AddHeader("Location", "http://www.baidu.com/");这种方法后发现可以跳转,但是用fid…

一键解决 go get golang.org/x 包失败

From:https://segmentfault.com/a/1190000018264719 问题描述 在 ubuntu 上用 sudo apt install golang-go 安装 go 的 sdk,之后使用 go get、go install、go mod 等命令时 (会自动下载相应的包或依赖包) 时,但由于众所周知的原因(墙)&#x…

深入理解Nginx~正常运行的配置项

1、定义环境变量 语法: env VAR|VARVALUEenv TESTPATH/tmp/; 2、嵌入其他配置文件 语法: include pathfile;include mime.types; include vhost/*.conf; 3、pid文件的路径 语法: pid path/file; 默认: pid logs/nginx.pid; 保…

「对抗深度强化学习」是如何解决自动驾驶汽车系统中的「安全性」问题的?...

原文来源:arXiv作者:Aidin Ferdowsi、 Ursula Challita、Walid Saad、Narayan B. Mandayam「雷克世界」编译:嗯~是阿童木呀、KABUDA对于自动驾驶汽车(AV)而言,要想在未来的智能交通系统中以真正自主的方式运…

Visual Studio下使用jQuery的10个技巧

广泛流行的jQuery是一个开源的,跨浏览器和兼容CSS 3的JavaScript库,你可以用它简化你的JavaScript编码任务和操作(添加,编辑和删除)HTML内容中的DOM元素,本文介绍10个在 Visual Studio下使用jQuery的10个有…

小甲鱼 OllyDbg 教程系列 (五) : 破解 PC Surgeon 之 查找字符串

https://www.bilibili.com/video/av6889190/?p11 https://www.bilibili.com/video/av6889190/?p12 程序下载地址:https://pan.baidu.com/s/1eVTLQ_AatLrmrz3FLwM5ww 提取码:wny9 修复 OllyDBG 右键 -> 复制到可执行文件 -> 所有修改 中 所…

深度概览卷积神经网络全景图,没有比这更全的了

来源: 人工智能头条 翻译 | 林椿眄摘要:深度卷积神经网络是这一波 AI 浪潮背后的大功臣。虽然很多人可能都已经听说过这个名词,但是对于这个领域的相关从业者或者科研学者来说,浅显的了解并不足够。通过这篇文章,我们…

深入理解Nginx~优化性能的配置项

1、Nginx worker进程个数 语法: worker_processes number; 默认: worker_processes 1; 一般情况下,用户要配置与CPU内核数相等的worker进程,并且使用下面的worker_cpu_affinity配置来绑定CPU内核。 2、绑定Nginx worker进程到指定…

学习C++的五十条忠告

50条忠告:(其中有几条觉得写的不够贴切,所以删了,发了余下的部分) 1.把C当成一门新的语言学习; 2.看《Thinking In C》,不要看《C变成死相》; 3.看《The C Programming Language》…

小甲鱼 OllyDbg 教程系列 (四) : 逆向 VisualSite Designer 之 硬件断点

去掉程序开始之前的界面:https://www.bilibili.com/video/av6889190?p9 去掉关闭程序后的广告:https://www.bilibili.com/video/av6889190?p10 VisualSite Designer.exe 下载地址:https://pan.baidu.com/s/1i-fi1wW-m0Cp72yyB_SBFw 提取码…

深入理解Nginx~事件类配置项

1、是否打开accept锁 语法: accept_mutex[on|off] 默认: accept_mutext on; accept_mutex是Nginx的负载均衡锁,可以让多个worker进程轮流地、序列化地与新的客户端建立TCP连接。 accept锁默认是打开的,如果关闭它,那么…

复杂人机智能系统功能分配方法综述

本文来源:人机与认知实验室摘要:功能分配是复杂人机智能系统设计进程中的重要内容, 它需要应用系统的分析方法, 合理地进行人、机两者的任务分配和科学地设计两者的功能结合。本文分析了国内外功能分配的研究现状和存在的问题。针对复杂人机智能系统的设计需求, 指出…

C++调用C#的dll

C调用C#的dll的三个方法: 1. 如果C使用clr语法编译: 通过#using(比如 #using "xxx.dll")引入C#的dll,在程序中调用C# dll中的变量或函数(采用正确的访问托管对象,即:使用 ^,而不是*&a…

JSONPath 解析 JSON 内容详解(翻译自 github)

Github :https://github.com/json-path/JsonPath http://www.ibloger.net/article/2329.html JSONPath Online Evaluator:http://jsonpath.com JsonPath 是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascr…

深入理解Nginx~虚拟主机与请求的分发

1、监听端口 语法: listen address:port[default(deprecated in 0.8.21)|default_server|[backlognum|rcvbufsize|sndbufsize|accept_filterfilter|deferred|bind|ipv6only[on|off]|ssl]]; 默认: listen 80; 配置块: server示例 listen 127…

生物学将是下一代计算平台:DNA是代码,CRISPR是编程语言

来源:36氪每一个行业都在向Crispr投入大量的资金——制药、农业、能源、材料制造。甚至连那些大麻贩子都想砸钱进去。机器里面,运行的并不是由0和1组成的互联网编码,而是能重写生命密码的分子。日前,《连线》杂志发表了一篇文章&a…