硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3756|回复: 17
收起左侧

[DMA] 如何理解3个以上的串口使用两个DMA的问题

[复制链接]

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2021-11-14 13:08:44 | 显示全部楼层 |阅读模式


一般的情况下,STM32有两个DMA,两个串口使用两个DMA我能理解
但是两个以上的串口的使用两个DMA这种情况就一直无法理解,这个现在限制我的串口的使用数量。
我理解是这样的,设备虽然有多个DMA通道,但是只有两个DMA转换器,同一时间只能有两串口在转换。
1)对于DMA接收,如果这个时候有三个串口同时在与主设备在通讯,比如都是在向主设备发送数据,那这个时候主设备是不是就会收不到某一个设备的数据?
2)对于DMA发送,如果这个时候主设备需要给三个从设备使用串口发送数据,这时主设备的总裁器会自己判断先发送哪个吗?还是说需要自己判断DMA是否BUSY?

有大神能给解释一下吗?一直想不明白

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-11-15 00:20:58 | 显示全部楼层

回帖奖励 +2 个金币

每个DMA有8个数据流,虽然同一时刻只能选通1个数据流(由DMA仲裁控制的),但是通用DMA数据带宽处理8通道串口还是绰绰有余的。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-11-15 15:46:15 | 显示全部楼层
我有个项目用H750的7个串口同时使用DMA,没问题,什么也不用处理.H750有八个串口,但是最多只能有7个串口同时使用DMA
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-11-23 22:28:46 | 显示全部楼层
krguang 发表于 2021-11-15 15:46
我有个项目用H750的7个串口同时使用DMA,没问题,什么也不用处理.H750有八个串口,但是最多只能有7个串口同时 ...

不需要做处理,就直接使用就可以?
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-11-23 22:29:37 | 显示全部楼层
eric2013 发表于 2021-11-15 00:20
每个DMA有8个数据流,虽然同一时刻只能选通1个数据流(由DMA仲裁控制的),但是通用DMA数据带宽处理8通道串 ...

DAM数据带宽是如何计算的?之前没看到过这个概念?
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-11-23 22:32:29 | 显示全部楼层
krguang 发表于 2021-11-15 15:46
我有个项目用H750的7个串口同时使用DMA,没问题,什么也不用处理.H750有八个串口,但是最多只能有7个串口同时 ...

一般我们接收到了数据,会关闭DAM,那这个时候另外的串口在使用DMA传输,那这个时候不就会导致数据丢失吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-11-24 01:31:26 | 显示全部楼层
weboser 发表于 2021-11-23 22:28
不需要做处理,就直接使用就可以?

没问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-11-24 01:32:02 | 显示全部楼层
weboser 发表于 2021-11-23 22:29
DAM数据带宽是如何计算的?之前没看到过这个概念?

看下就有感性认识了。

STM32H7的MDMA,DMA2D和DMA性能测试出来了,DMA2D和MDMA有一拼,DMA1和2的性能太挫
http://www.armbbs.cn/forum.php?m ... 4058&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-11-24 01:33:02 | 显示全部楼层
weboser 发表于 2021-11-23 22:32
一般我们接收到了数据,会关闭DAM,那这个时候另外的串口在使用DMA传输,那这个时候不就会导致数据丢失吗 ...

没问题。
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-12-3 22:59:29 | 显示全部楼层
eric2013 发表于 2021-11-24 01:32
看下就有感性认识了。

STM32H7的MDMA,DMA2D和DMA性能测试出来了,DMA2D和MDMA有一拼,DMA1和2的性能 ...

好的,多谢大佬
之前有串口自带的fifo满足的了这个功能,但是现在看来并不能满足还是需要使用DMA
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-12-3 23:12:09 | 显示全部楼层
eric2013 发表于 2021-11-24 01:32
看下就有感性认识了。

STM32H7的MDMA,DMA2D和DMA性能测试出来了,DMA2D和MDMA有一拼,DMA1和2的性能 ...

是不是可以这么理解,比如我一个DMA(DMA1)配合两个串口使用(串口1和串口2)
比如串口1和串口2都在接收数据,DMA1可以同时处理两个串口的接收,DMA1的处理方式是在两个串口间反复横跳的这个工作模式是吧?
串口1RDR数据寄期和串口2RDR寄存器同时有值,DMA先后把这两个值搬运到设置的地址;但是这个时候串口的以为寄存器后没有完成一个数据的接收,由于DMA的带宽比较大,所以不会造成数据的丢失的情况?
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-12-3 23:14:49 | 显示全部楼层

在处理输出的时候关闭了DMA,还是会造成数据的丢失吧?这个目前仍然无法理解?
比如,串口1接收完毕,进入到空闲中断,这个时候需要关闭DMA1,而DMA1这个时候在处理串口2的数据,串口2的数据不会因为DMA1的关闭而导致数据丢失吗?
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-12-3 23:17:14 | 显示全部楼层

这个是我的参考网上的代码,在串口接收空闲中断里关闭了DMA
Snipaste_2021-12-03_23-15-39.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-12-4 01:04:00 | 显示全部楼层
weboser 发表于 2021-12-3 23:12
是不是可以这么理解,比如我一个DMA(DMA1)配合两个串口使用(串口1和串口2)
比如串口1和串口2都在接收 ...

对,另外DMA是有FIFO的,可以缓冲一些数据的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-12-4 01:05:06 | 显示全部楼层
weboser 发表于 2021-12-3 23:14
在处理输出的时候关闭了DMA,还是会造成数据的丢失吧?这个目前仍然无法理解?
比如,串口1接收完毕,进 ...

仅关闭串口1的DMA通道即可,串口2还在用,不关闭它用的通道就行。
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-12-4 20:39:04 | 显示全部楼层
eric2013 发表于 2021-12-4 01:04
对,另外DMA是有FIFO的,可以缓冲一些数据的。

https://www.armbbs.cn/forum.php? ... peid%26typeid%3D173
硬汉,多谢您的回复,我看了这个帖子,又有点糊涂了
#10楼的回复:“我来说说我的理解,stm32的dma需要等待上一个请求的数据量全部传完了才会响应下一个请求,响应新请求的时候又会根据优先级来响应
如果请求的数据量太大,高优先级请求太频繁,然后dma速度又不够的话就会导致较低优先级的其他通道无法及时响应甚至被阻塞”
这个对于两个串口的接收也是同样试用的吗?假如串口1的DMA请求优先级比串口2的高,当串口同时接收时DAM的操作是下面的哪种情况?
1)DMA需要接收完串口1的所有数据才会响应串口2的吗?
2)还是仅搬运完串口1当前RDR寄存器的数据后,就会去搬运串口2的RDR寄存器的数据(类似于反复横跳)
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-12-4 20:40:23 | 显示全部楼层
eric2013 发表于 2021-12-4 01:05
仅关闭串口1的DMA通道即可,串口2还在用,不关闭它用的通道就行。

多谢,硬件,我又仔细去看了下代码,的确是关闭了那个串口的DMA的传输,真的太感谢你了
传道受业解惑的硬汉老师
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-4-26 20:00:37 | 显示全部楼层
weboser 发表于 2021-12-3 23:12
是不是可以这么理解,比如我一个DMA(DMA1)配合两个串口使用(串口1和串口2)
比如串口1和串口2都在接收 ...

同时DMA传输会有仲裁,串口波特率高,数据量大会有丢包风险
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 04:48 , Processed in 0.225712 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表