6768|11

2804

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

关于Stellaris系列UART的FIFO新认识,经典! [复制链接]

【经典提问】
  有没有办法去掉UART的FIFO,或者怎样才能实现每收发一个字符就中断一次呢?Stellaris系列ARM的UART好像无法做到这一点,存在缺陷!


【精妙解答】
  误解了,根本就不是缺陷,这恰恰是优点!

  看来许多人还没有真正理解FIFO的作用和优点,仍然停留在每收发一个字符就要中断处理一次的老思路上。UART收发FIFO主要是为了解决收发中断过于频繁而导致的CPU效率不高的问题。

  FIFO的必要性。在进行UART通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发FIFO,则每传输一个数据(5~8位)都要中断处 理一次,效率仍然不高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14个)后才产生一次中断,然后一起处理。这就大大提高了收发效率。

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

  总之,FIFO的设计是优秀而合理的,它已经帮你想到了收发过程中存在的任何问题,只要初始化配置UART后,就可以放心收发了,FIFO和中断例程会自动搞定一切!

  完全不必要担心FIFO大大减少了中断产生的次数而“可能”造成数据丢失的问题!

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

  接收时,如果对方是连续不间断发送,则填满FIFO后会以中断的方式通知主程序说:现在有一批数据来了,请处理。

  如果对方是间断性发送,也不要紧,当间隔时间过长时(2~3个字符传输时间),也会产生中断,这次是超时中断,通知主程序说:对方可能已经发送完毕,但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);

最新回复

这个不错,下次在项目中试试  详情 回复 发表于 2012-2-19 02:13
 
点赞 关注
个人签名QQ:1625345502

回复
举报

849

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

回复 楼主 wanghongyang 的帖子

顶一下。。。LZ写得不错。。。如果能配合实际的操作的话,能更说明问题。。。
 
个人签名只有想不到,没有做不到。
 

回复

7231

帖子

192

TA的资源

五彩晶圆(高级)

板凳
 
跟红阳兄弟学习啊
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(高级)

4
 
其实FIFO和传统的双字节FIFO一样,主要是多了一个RT中断;开始不明白何用,后来发现是一个解决问题的办法:1/8对应16字节的触发点是2个字节,如果只收到一个字节怎么办?那就是RT中断了--达不到数量触发点时,通过超时来触发,这个思路和windows应用软件的串口编程思路是一样的。
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

5
 
不做项目是不知道这个优点的,个人感觉比DMA效率还高还实用
 
 
 

回复

246

帖子

0

TA的资源

纯净的硅(初级)

6
 

回复 楼主 wanghongyang 的帖子

好帖,楼主理解的很深入啊!顶一下!
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 楼主 wanghongyang 的帖子

真不错,理解得太好了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 

我顶

很好,很详细。。我狂顶。。。。。。
 
 
 

回复

105

帖子

0

TA的资源

一粒金砂(中级)

9
 
经典啊!必须mark
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
果然理解深刻
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

11
 

顶一下。。很不错LZ。。
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(初级)

12
 
这个不错,下次在项目中试试
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表