打印
[牛人杂谈]

串口收发效率

[复制链接]
1122|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huahuagg|  楼主 | 2019-11-24 14:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
UART有收/发FIFO,如果要实现UART快速收发就要用到UART FIFO功能。而用到UART FIFO功能就不得不提一下超时功能。
UART 的FIFO,RX的阀值可以设定,如下:

可以设定RX FIFO中接收的字节数超过一定字节才发生中断,这样可以降低CPU的loading。如果设定RFITL为11b,就是收到14个字节才发生中断。一旦接收的数据不足14个字节,已经收到RX FIFO中的字节怎么办呢?这就需要设定超时功能了,寄存器如下。TOIC的单位为波特率。

使用特权

评论回复
沙发
huahuagg|  楼主 | 2019-11-24 14:22 | 只看该作者

例如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 | 只看该作者
中断处理函数如下:
/*FIFO +超时 */ 
static VOID UART0_INT_HANDLE(void)
{
UINT8 bInChar;
if(UART0->INTSTS & (UART_INTSTS_RDAINT_Msk|UART_INTSTS_RXTOINT_Msk))
//RDA or Timeout
{
/* Get all the input characters */
//while(UART_IS_RX_READY(UART0)){
  while(UART_GET_RX_EMPTY(UART0)==0) {
  /* Get the character from UART Buffer */
  bInChar = UART_READ(UART0);
  }
  }
  }

使用特权

评论回复
地板
huahuagg|  楼主 | 2019-11-24 14:27 | 只看该作者
上面的代码注意不能用红色的那行代码,只有RX FIFO中的字节数>= RFITL设定时,UART_IS_RX_READY才会为TRUE。就是说,一旦读出一个字节,它就会为FALSE了。如果希望中断中一次将UART收到的字节全部读出,需要查看RX EMPTY标志。

使用特权

评论回复
5
xuanhuanzi| | 2019-11-24 15:06 | 只看该作者
FIFO的用法。

使用特权

评论回复
6
heisexingqisi| | 2019-11-24 20:36 | 只看该作者
学习了

使用特权

评论回复
7
幸福小强| | 2019-11-24 21:43 | 只看该作者
不是太懂如何使用,是默认就使用了FIFO吗

使用特权

评论回复
8
manufact| | 2019-11-25 16:46 | 只看该作者
幸福小强 发表于 2019-11-24 21:43
不是太懂如何使用,是默认就使用了FIFO吗

一般是需要自己创建FIFO功能

使用特权

评论回复
9
tianxj01| | 2019-11-26 09:19 | 只看该作者
幸福小强 发表于 2019-11-24 21:43
不是太懂如何使用,是默认就使用了FIFO吗

使用FIFO,可以有效提高系统资源的利用率,本来每次完成都会发生的中断,可以在累计到一定次数才发生,然后统一处理,这在协议明确,数据串操作的时候,程序运行效率可以有效提高。
正因为是累积到一定次数,所以对于那些有部分数据可能没法短时间满足充满FIFO的情况,如果还不发生中断,则会造成信号处理的严重滞后,这就需要对FIFO内部未满,而通过超时来完成中断处理了。
这就是FIFO启用后,设置超时处理的原因。
至于各种FIFO,默认状态自动启用的有,类似的CAN处理,而默认一般不启动的也有,比如串口。

使用特权

评论回复
10
publicpeople| | 2020-2-8 19:00 | 只看该作者
LZ,你有串口发送中断的使用说明吗?我看了新塘的例程库,没有找到清除发送中断的操作。

使用特权

评论回复
11
heisexingqisi| | 2020-2-9 13:10 | 只看该作者
publicpeople 发表于 2020-2-8 19:00
LZ,你有串口发送中断的使用说明吗?我看了新塘的例程库,没有找到清除发送中断的操作。 ...

再次发送时候自动清除。

使用特权

评论回复
12
jiekou001| | 2020-2-12 18:40 | 只看该作者
好贴。。。。。。。。。。。

使用特权

评论回复
13
小明的同学| | 2020-2-12 20:54 | 只看该作者
分享的不错代码很好。

使用特权

评论回复
14
曲水流觞100| | 2020-5-7 15:45 | 只看该作者
huahuagg 发表于 2019-11-24 14:27
上面的代码注意不能用红色的那行代码,只有RX FIFO中的字节数>= RFITL设定时,UART_IS_RX_READY才会为TRUE ...

帮了我大忙了   多谢大佬

使用特权

评论回复
15
huahuagg|  楼主 | 2020-5-10 10:54 | 只看该作者
曲水流觞100 发表于 2020-5-7 15:45
帮了我大忙了   多谢大佬

haha,客气了,

使用特权

评论回复
16
wahahaheihei| | 2020-5-10 21:50 | 只看该作者
宝贵经验。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

138

主题

1251

帖子

2

粉丝