STM32的DMA应用于UART数据接收讨论

2019-03-23 19:02发布

STM32的UART不带FIFO,通讯速度高时不使用DMA开销太大(LM3S有16级深的FIFO可以7/8满触发中断,带超时功能,亮点啊)。打算用DMA配置成外设到内存的数据传输方式实现数据接收,实现下来确实有难度啊。
具体如下
配置DMA时,必须先指定接收BUF大小,DMA传输中断可选择为传输错误、半传输或传输完成时产生。

关键问题是实现通讯时事先不知道要接收的数据包大小,对端不同类型数据包发送完成时DMA传输进度也会各不相同(和配置的DMA buf深度没有没系),无法保证所有包会产生半传输或传输完成中断。考虑增加一个定时器发送消息提示DMA进度,但高速通讯时,定时器的开销也较大。不知道有没有更好的办法。

应用中需要高传输速度与快速响应。STM32似忽很难实现啊。

实现不行只能放弃使用DMA,直接中断处理了。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
MouseCat
1楼-- · 2019-03-25 14:56
官方有利用DMA用作FIFO的文档,不知道实际怎么做,没仔细看!!!
xg_qing
2楼-- · 2019-03-25 19:12
到ST官网上查看了AP, 确实如你所说,AN3109有描述该问题及解决方案。它用两种方式实现了DMA超时处理。一种用定时器捕捉检测空闲,另一种用UART中断检测空闲。前一种更高效,但占用定时器资源。

两种方式都比我的要高效,且实时性和TI的FIFO加超时是一样的。看来该问题已经可以完结了。本来已经用自己的方试实现了,现在看来还得改了。以后要多去去官网看看。。。

多谢大家!
damiaa
3楼-- · 2019-03-25 19:43
 精彩回答 2  元偷偷看……
sblpp
4楼-- · 2019-03-25 23:32
“STM32的UART不带FIFO,通讯速度高时不使用DMA开销太大”
有多大开销?
接收到一个字节后进中断,中断服务中将其取出来后放到一个缓冲区中不就完了嘛!
115200的波特率,一个字节的完成时间约是100uS。
罗菜鸟
5楼-- · 2019-03-26 00:51
UART IDLE中断

一周热门 更多>