[牛人杂谈] 串口收发效率

[复制链接]
 楼主| huahuagg 发表于 2019-11-24 14:21 | 显示全部楼层 |阅读模式
UART有收/发FIFO,如果要实现UART快速收发就要用到UART FIFO功能。而用到UART FIFO功能就不得不提一下超时功能。
UART 的FIFO,RX的阀值可以设定,如下:
597195dda217920fbb.png
可以设定RX FIFO中接收的字节数超过一定字节才发生中断,这样可以降低CPU的loading。如果设定RFITL为11b,就是收到14个字节才发生中断。一旦接收的数据不足14个字节,已经收到RX FIFO中的字节怎么办呢?这就需要设定超时功能了,寄存器如下。TOIC的单位为波特率。

 楼主| huahuagg 发表于 2019-11-24 14:22 | 显示全部楼层
27895dda2191d3a58.png
例如TMCTL = 40,就是RX FIFO中有数据,但是间隔40个波特率时间没有再收到数据,就会发生超时中断。调用下面的函数使能接收FIFO满中断(RDA)和超时中断
UART_ENABLE_INT(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk));
 楼主| huahuagg 发表于 2019-11-24 14:27 | 显示全部楼层
中断处理函数如下:
  1. /*FIFO +超时 */
  2. static VOID UART0_INT_HANDLE(void)
  3. {
  4. UINT8 bInChar;
  5. if(UART0->INTSTS & (UART_INTSTS_RDAINT_Msk|UART_INTSTS_RXTOINT_Msk))
  6. //RDA or Timeout
  7. {
  8. /* Get all the input characters */
  9. //while(UART_IS_RX_READY(UART0)){
  10.   while(UART_GET_RX_EMPTY(UART0)==0) {
  11.   /* Get the character from UART Buffer */
  12.   bInChar = UART_READ(UART0);
  13.   }
  14.   }
  15.   }
 楼主| huahuagg 发表于 2019-11-24 14:27 | 显示全部楼层
上面的代码注意不能用红色的那行代码,只有RX FIFO中的字节数>= RFITL设定时,UART_IS_RX_READY才会为TRUE。就是说,一旦读出一个字节,它就会为FALSE了。如果希望中断中一次将UART收到的字节全部读出,需要查看RX EMPTY标志。
xuanhuanzi 发表于 2019-11-24 15:06 | 显示全部楼层
FIFO的用法。
heisexingqisi 发表于 2019-11-24 20:36 | 显示全部楼层
学习了
幸福小强 发表于 2019-11-24 21:43 | 显示全部楼层
不是太懂如何使用,是默认就使用了FIFO吗
manufact 发表于 2019-11-25 16:46 | 显示全部楼层
幸福小强 发表于 2019-11-24 21:43
不是太懂如何使用,是默认就使用了FIFO吗

一般是需要自己创建FIFO功能
tianxj01 发表于 2019-11-26 09:19 | 显示全部楼层
幸福小强 发表于 2019-11-24 21:43
不是太懂如何使用,是默认就使用了FIFO吗

使用FIFO,可以有效提高系统资源的利用率,本来每次完成都会发生的中断,可以在累计到一定次数才发生,然后统一处理,这在协议明确,数据串操作的时候,程序运行效率可以有效提高。
正因为是累积到一定次数,所以对于那些有部分数据可能没法短时间满足充满FIFO的情况,如果还不发生中断,则会造成信号处理的严重滞后,这就需要对FIFO内部未满,而通过超时来完成中断处理了。
这就是FIFO启用后,设置超时处理的原因。
至于各种FIFO,默认状态自动启用的有,类似的CAN处理,而默认一般不启动的也有,比如串口。
publicpeople 发表于 2020-2-8 19:00 | 显示全部楼层
LZ,你有串口发送中断的使用说明吗?我看了新塘的例程库,没有找到清除发送中断的操作。
heisexingqisi 发表于 2020-2-9 13:10 | 显示全部楼层
publicpeople 发表于 2020-2-8 19:00
LZ,你有串口发送中断的使用说明吗?我看了新塘的例程库,没有找到清除发送中断的操作。 ...

再次发送时候自动清除。
jiekou001 发表于 2020-2-12 18:40 | 显示全部楼层
好贴。。。。。。。。。。。
小明的同学 发表于 2020-2-12 20:54 | 显示全部楼层
分享的不错代码很好。
曲水流觞100 发表于 2020-5-7 15:45 | 显示全部楼层
huahuagg 发表于 2019-11-24 14:27
上面的代码注意不能用红色的那行代码,只有RX FIFO中的字节数>= RFITL设定时,UART_IS_RX_READY才会为TRUE ...

帮了我大忙了   多谢大佬
 楼主| huahuagg 发表于 2020-5-10 10:54 | 显示全部楼层
曲水流觞100 发表于 2020-5-7 15:45
帮了我大忙了   多谢大佬

haha,客气了,
wahahaheihei 发表于 2020-5-10 21:50 | 显示全部楼层
宝贵经验。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

159

主题

1408

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部