串口UART的深入使用
文章目录
- 串口UART的深入使用
- 怎样做到效率最高的UART?
- 1、uart的三种方式
- 2、uart+DMA存在的问题
- 3、最屌的UART编程方式
- UART+DMA+空闲中断IDLE+freertos的队列(裸机的话用环形buf)
- 整个流程是什么?
- 还有问题
串口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开始接收;
使能函数如下: