串口UART的深入使用

串口UART的深入使用

怎样做到效率最高的UART?

1、uart的三种方式

uart:查询、中断、DMA

查询是直接排除了;

中断是,接收每个字节都会触发中断来中断cpu效率低;

DMA效率高,比如自己定义收满100个数据就触发一次中断,去中断cpu;

总结就是uart+DMA效率最高;

2、uart+DMA存在的问题

都是接收的问题,发送没这么多问题;

就是说DMA要接收满1000个字节,但是只有200个字节怎么办?或者如果是发生错误怎么办?

答:就要用到IDLE中断;

3、最屌的UART编程方式
UART+DMA+空闲中断IDLE+freertos的队列(裸机的话用环形buf)

注意这是接收,发送的话直接UART+DMA就行了不用管这么多;

DMA设置的接收1000个字节,但是只有200字节,此时就会触发IDLE的位空闲而中止的回调函数;

发生错误也有对应的IDLE的回调函数;

DMA需要的三个参数:哪一个串口用——huart4、存到一个buf里面——g_uart4_rx_buf、要存满多少个——100;

这个只是使能的函数;

整个流程是什么?

1、使能/启动DMA中断,开始接收

2、等待接收完成

1、接收完设置的DMA的1000,接收完成回调函数

2、没到1000,只有200,那就是空闲回调函数

3、发生错误,触发错误回调函数

4、接收一半数据,但是这个不常用

还有问题

数据如何传输的?

接收到数据后,存入FIFO,DMA会把数据搬运到buf中,不用经过cpu,搬运完指定数量才中断一下cpu;

这就出现了问题:数据丢失

就正常使能后,在这个while循环里面,后面放一个函数要执行很久比如30min,那么可能导致问题是,UART不停的有数据传输进FIFO,但是DMA接收完一次数据比如设置了1000个,那DMA要等待while的第二次循环再去使能他才能再次开始接收,也就是等待30min,这期间UART的FIFO里面还在不断有数据接收进去,满的话,多的数据就直接丢失了;

解决办法:

在while前面就直接使能DMA;

然后这里面的各种回调函数都要写个重新使能DMA;这就永动了,接受完的回调函数又立马使能DMA开始接收;

使能函数如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值