OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 24137|回复: 33

stm32 串口使用 DMA 速度并不快

[复制链接]

13

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-7-17
在线时间
0 小时
发表于 2013-11-24 11:38:13 | 显示全部楼层 |阅读模式
stm32 串口使用 DMA 和不使用 DMA 速度基本没有差别,难道 DMA 不能显著提升速度吗,还是另有隐情
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-11-24 16:28:00 | 显示全部楼层
速度受限于你的波特率,和DMA无关.
你波特率9600,难道用DMA就变成115200了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

25

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-11-24
在线时间
5 小时
发表于 2013-11-24 20:42:09 | 显示全部楼层
回复【3楼】ricefat:
---------------------------------我也想知道这个问题啊,这个问题困惑我五六年了
回复 支持 0 反对 1

使用道具 举报

13

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2013-11-24 21:54:34 | 显示全部楼层
回复【3楼】ricefat:
---------------------------------
请高手不吝赐教
回复 支持 1 反对 0

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2017-5-27 15:58:20 | 显示全部楼层
本帖最后由 275891381 于 2017-5-27 16:17 编辑

串口的dma发送的时候,我一般是,数据长度固定就建立个数组循环发送,程序运行过程中修改要发送的数组全部或者部分数据,修改完就不用管了,dma会直接发出去。数据长度不固定用发送完成中断,发送完成后中断内修改数据长度,再开启dma,他就自动发送了,你就不用管了。
串口接收的时候就更方便了,开启串口空闲中断,串口空闲的时候触发中断,开启一个标志量,读出串口接收的长度,主函数里面判断标志量直接处理收到的数据就可以了,接收中断一般没啥用,因为你设置的接收区长度一般很大,不会收满,串口就会触发空闲中断了。要是需求数据速度快,就开启两个接收缓冲区,串口空闲中断内切换dma指向的数组地址,设计个标志量标记那个正在接收,主函数内查询当前那个正在接收,处理另一个缓冲区的数据就可以了
要是串口接收的长度固定,更方便,开启dma串口接收中断,收完直接处理就可以了


回复 支持 1 反对 0

使用道具 举报

3

主题

2177

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3321
金钱
3321
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-24 18:52:31 | 显示全部楼层
你要明白DMA究竟是什么,什么情况下才用DMA。
回复 支持 反对

使用道具 举报

3

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2012-8-13
在线时间
32 小时
发表于 2013-11-24 19:40:21 | 显示全部楼层
回复【2楼】正点原子:

速度受限于你的波特率,和DMA无关.
你波特率9600,难道用DMA就变成115200了?

---------------------------------
出错的时候有可能
个人小店,弄了些大人玩具,希望各位老小玩童们喜欢。 http://autocute.taobao.com/
回复 支持 反对

使用道具 举报

25

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-11-24
在线时间
5 小时
发表于 2013-11-24 20:42:45 | 显示全部楼层
回复【3楼】ricefat:

你要明白DMA究竟是什么,什么情况下才用DMA。

---------------------------------
烦请你解释一下好吗
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2013-11-24 21:53:03 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
波特率是 115200 不变,如果只受限于波特率和 DMA 无关的话,那么 stm32 上串口可以使用 DMA 是多此一举?
回复 支持 反对

使用道具 举报

头像被屏蔽

2

主题

164

帖子

1

精华

禁止访问

积分
1316
金钱
1316
注册时间
2012-5-13
在线时间
127 小时
发表于 2013-11-24 22:20:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

3

主题

2177

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3321
金钱
3321
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-25 09:43:10 | 显示全部楼层
回复【6楼】noname:
---------------------------------
刚看到,不好意思。DMA的作用就是脱开CPU进行数据传输,只需要给出数据源和目的地,中间的传输过程不需要干预,传输期间CPU可以干其他的工作。8楼的高手已经解释了,我就不重复啦。
回复 支持 反对

使用道具 举报

8

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2012-12-19
在线时间
16 小时
发表于 2013-11-25 11:13:50 | 显示全部楼层
串口发送完成一个字节的数据发送后进入中断这个时候也不需要CPU干预吗?
DMA只是存储区的搬运不需要CPU参与.
回复 支持 反对

使用道具 举报

3

主题

2177

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3321
金钱
3321
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-25 11:30:43 | 显示全部楼层
回复【11楼】sdwhupk:
---------------------------------
如果仅仅是几个字节的数据传输就不必用DMA了。DMA仅仅是一次性大数据量传输时候才有必要
回复 支持 反对

使用道具 举报

25

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-11-24
在线时间
5 小时
发表于 2013-11-25 19:53:54 | 显示全部楼层
回复【10楼】ricefat:
---------------------------------完全不占用CPU时间吗?
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2013-11-25 20:36:53 | 显示全部楼层
for(i=0; i<1500; i++)
{
USART_SendData(USART1, data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
其实我就是想知道,100ms发送一次数据,用DMA取代上面的方法是否会高效一些
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-11-25 20:43:11 | 显示全部楼层
回复【14楼】qiuzhi339:
---------------------------------
打个简单的比分给你.
你本来每天要洗衣服,扫地,做饭,这些杂事你都得自己做.但是你只想看电视.不过没有其他人帮你做家务,你就只能硬着头皮,先做完家务再看电视.
但是,如果有个帮手,假设使你的佣人,你可以吩咐他去扫地,洗衣做饭,自己就专心看电视好了.

 你   = CPU
DMA =佣人
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2013-11-25 21:38:35 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
原子哥,这些我都懂,我也是科班出身,
其实我是想说,for 循环发送数据每次都要进行 i++ 操作、判断是否达到循环终止条件、等待发送完成,
这些操作是否会拖累串口发送数据、降低串口发送数据的效率,所以我想到用DMA,是否会省掉这些操作,提升一下发送效率。
其实我的程序中,虽然用了 DMA,但仍不能把 CPU 空闲出来做其它事情,因为下面的语句影响串口正在发送的数据,
所以必须等到 DMA 发送完成以后,再执行下面的语句。这样做其实没有发挥出 DMA 最大的优势(把 CPU 空闲出来做其他事情),
所以,我一直在强调使用 DMA 是否会在发送数据的效率方面有所提高,如果不能提高的话,那我就完全没有必要用 DMA 了,
因为在串口发送数据的时候,我不需要做其他事情。
回复 支持 反对

使用道具 举报

3

主题

2177

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3321
金钱
3321
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-25 22:38:56 | 显示全部楼层
回复【13楼】noname:
---------------------------------
传输过程中是完全不依赖CPU的,所要做的就是检查是否传输完成。
回复 支持 反对

使用道具 举报

3

主题

2177

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3321
金钱
3321
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-25 22:53:16 | 显示全部楼层
回复【16楼】qiuzhi339:
---------------------------------
本身你用这种一次只发一个字节的发送结构就完全没必要用DMA,更不用说还是100ms一次。DMA只是代替你搬东西而非火车换飞机。

如果想用DMA,设置好数据源地址、目的地址(USART—DR),设置地址自增,以及传输数量1500.那么开启DMA后 这1500字节的发送过程就不需要你人为去干预了。
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-7-17
在线时间
0 小时
 楼主| 发表于 2013-11-27 16:13:15 | 显示全部楼层
非常感谢大家的解答。也许 DMA 的核心就不包括提高传输效率,而我恰好想提高效率。总结一下大家的讨论,我就不用 DMA 了。
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-15 16:50:04 | 显示全部楼层
回复【3楼】ricefat:
---------------------------------
DMA就是开辟了一个内存到外设之间的通道,开通之后不需要MCU参与传输处理了,在传输中释放了MCU,这个时候有点像操作系统的延时释放CPU一样,但是速度还是通过串口的基本参数配置的
合肥-文盲
回复 支持 反对

使用道具 举报

17

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2015-3-9
在线时间
67 小时
发表于 2016-1-19 16:42:26 | 显示全部楼层
qiuzhi339 发表于 2013-11-25 21:38
回复【15楼】正点原子:
---------------------------------
原子哥,这些我都懂,我也是科班出身,
其实我 ...

目前我也遇到楼主的问题,dma开启传输后,还要等待传输完成才可以让cpu做别的事情,这样dma传输期间cpu也是浪费了,没达到原本cpu dma分开工作的目的,楼主现在搞定这个问题了吗
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-19 16:51:24 | 显示全部楼层
论软件架构的重要性。

如果你不针对DMA的特性或者根本不会调整软件架构,那么DMA对你来说没任何意义

就好比Intel新发明一个指令,用于进行快速傅里叶变换,一个指令就搞定了,然而所有的编译器都不针对该指令调整编译策略,
遂所有人一致认为:该指令无意义,

Intel的心情是这样的:
7_感觉不会再爱了.gif
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2015-4-21
在线时间
40 小时
发表于 2016-4-26 22:25:20 | 显示全部楼层
为什么SPI用DMA的话会显著的提高传输速度?
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
发表于 2016-8-21 19:27:39 | 显示全部楼层
谢小是 发表于 2016-4-26 22:25
为什么SPI用DMA的话会显著的提高传输速度?

为什么为什么
回复 支持 反对

使用道具 举报

zhengjing 该用户已被删除
发表于 2017-3-23 17:10:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-5-21 19:39:41 来自手机 | 显示全部楼层
楼主可以充分利用定时器中断,dma传输完成中断,串口传输完成中断等来实现你的效率优化。具体代码我就不写了,思路很重要。如果你不需要定时发送,还可以调用dma的循环模式
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2017-5-23 10:09:10 | 显示全部楼层
速度不仅仅取决于波特率吧。毕竟串口传输不是简简单单的一位一位的传输,中间有很多硬件处理在参与。当然这个速率影响应该是微小的,基本上和不用DMA一样。个人理解。
最近爱上了stm32
回复 支持 反对

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-5-27 13:15:16 | 显示全部楼层
在有OS的情况下,使用DMA可以带来CPU使用效率的提升
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-4-10
在线时间
2 小时
发表于 2021-10-21 23:43:10 | 显示全部楼层
qiuzhi339 发表于 2013-11-25 21:38
回复【15楼】正点原子:
---------------------------------
原子哥,这些我都懂,我也是科班出身,
其实我 ...

感觉一大堆人给你讲你知道的理论,而不去回答你的问题。
回复 支持 反对

使用道具 举报

4

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2017-1-11
在线时间
27 小时
发表于 2021-11-23 11:25:38 | 显示全部楼层
本帖最后由 yf910404 于 2021-11-23 11:26 编辑
正点原子 发表于 2013-11-25 20:43
回复【14楼】qiuzhi339:
---------------------------------
打个简单的比分给你.
你本来每天要洗衣服,扫地 ...

其实我不太懂,楼上这么多这么多年开发的兄弟还解释不出来DMA的作用,一直都在说参考手册上写的话,比如不需要CPU介入啊之类的,还讨论不出来楼主的DMA速率问题。
首先结果是DMA肯定会提高数据的传输速率啊,这个毋庸置疑。
怎么提高的呢?并不是在发送数据帧的过程中提速,这个时候因为波特率固定了,传输速度由波特率决定。
他是极大提高了数据发送和接收数据时的响应时间,而在高速的串口数据传输时,这个响应时间直接影响着传输速度。
比如你不使用DMA发送数据的时候,你就需要手动执行库函数写寄存器去发送数据,这个时候是要在main主循环一个扫描周期内,扫描到这个函数才会发送数据,那么这个响应时间就会加到持续传输数据的速度时间内,你的单个扫描周期内执行的代码越多,那么时间越长。
这个时候如果你启用了DMA传输,就跟扫描周期无关了,因为DMA在帮你发送和接受数据,你只需要需要处理数据的时候再去处理。那么启用DMA,多个数据传输之间的这段空隙时间是不是被忽略了?
那么在波特率达到几兆HZ的时候,速度是不是被极大的提高了?
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2022-2-24 09:34:35 | 显示全部楼层
979653421@qq.co 发表于 2016-1-19 16:42
目前我也遇到楼主的问题,dma开启传输后,还要等待传输完成才可以让cpu做别的事情,这样dma传输期间cpu也 ...

网上很多教程有错误,这些教程的结果不能证明DMA不需要CPU干涉,恰恰相反的效果,小心小心别入坑
回复 支持 反对

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2019-7-28
在线时间
59 小时
发表于 2024-6-12 21:47:42 | 显示全部楼层
通过ADC_DMA测试发现,做3通道3次ADC,实际上用上DAM比不用DMA耗时大3倍!!!
我做了很多测试,结果是单通道到3通道一次采样时用DMA和不同差别不大,
但3次以上采用:
DMA要慢很多很多!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DMA要慢很多很多!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DMA要慢很多很多!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
往大家从新评估DMA的价值。我用的硬件是STM32G030C8T6,内部时钟,64M。定时器TIMER3定时触发DMA,adc结束触发中断读数。
回复 支持 反对

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2019-7-28
在线时间
59 小时
发表于 2024-6-14 18:35:59 | 显示全部楼层
找到一个问题:多通道扫描方式后面一个“连续采集”一定要选上,这样比不选快很多!
否则怀疑人生。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 01:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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