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条回答
kevinyzw
1楼-- · 2019-03-24 22:36
用中断方式接收,发送时使用DMA

这么高速,进度率有啥用处啊?眼睛观察不过来吧
xg_qing
2楼-- · 2019-03-25 03:55
原帖由 kevinyzw 于 2012-10-21 18:48 发表
用中断方式接收,发送时使用DMA

这么高速,进度率有啥用处啊?眼睛观察不过来吧

发送是使用的DMA,数据传输速度如果大于1M,中断接收的开销就比较大了,毕竟CPU也才72M啊。
红 {MOD}不明白。
azhiking
3楼-- · 2019-03-25 05:39
 精彩回答 2  元偷偷看……
xg_qing
4楼-- · 2019-03-25 10:37
原帖由 azhiking 于 2012-10-24 14:02 发表
你可以采用DMA的乒乓模式进行接收,其中乒的时候,设置为接收一个字节,当收到一个字节后,切换到乓的模式进行接收,同时启动定时器。
定时器的时长根据能接收完所有数据的时间合理定义。
当定时器超时中断后,查询 ...
兵乓模式类似6楼的实现,此时DMA启动不再是接收数据字节长度位置而是一旦接收到数据就启动定接收后续,并定义超时。理解没错吧?
虽然STM32不支持兵乓模式(LM3S系列才有),但也可以用中接接收一个数据再启动DMA与超时定时器来实现。

目前为止,就这个方案最高效了。。

LM3S UART接收没必要搞得这么麻烦不?FIFO加超时机制已经非常高效了, 发送倒时可以用,更高效,又简单。
azhiking
5楼-- · 2019-03-25 10:51
确实是这样,LM3S的DMA也不支持超时中断。

ATMEL的DMA是支持超时中断的,类似于LM3S的FIFO超时中断。

不过DMA收发的话,对MCU的资源占用是非常小的,这是UART+FIFO不可比拟的。
xg_qing
6楼-- · 2019-03-25 12:35
 精彩回答 2  元偷偷看……

一周热门 更多>