OpenEdv-开源电子网

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

STM32用串口中断接收一帧数据,还是用DMA接收一帧数据,哪个效率高?

[复制链接]

21

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-2-19
在线时间
46 小时
发表于 2016-9-19 22:37:16 | 显示全部楼层 |阅读模式
5金钱
STM32用串口中断接收一帧数据,还是用DMA接收一帧数据,哪个效率高?
串口接收的波特率为38400bps,9600bps;

实际操作中,我采用了两种方法比对:
第一种:利用UART接收中断,当接收到一个字节时,进入中断,将接收到的数据存入缓存中,当接收到结束符时,则认定一帧数据的接收完毕!
第二种:利用UART的DMA功能接收串口数据,开一个定时器中断1.5ms,查询当DMA接收到数据时,接收数据个数是否有变化,若没有变化则认定一帧接收完毕!


上诉的两种方法测试下来,感觉DMA的效率要一点,当接收数据帧512个字节时,是不是串口在很短的时间内中断512次,而DMA 1.5ms的查询中断似乎更利于减轻CPU的负担,STM32时钟72M,大家觉得那种方法效率较高???


PS:
DMA定时1.5ms的查询的依据是,当9600bps时,(1+8+1+1)/9600=1.145ms;所以我选择1.5ms,不知是否正确???我个人认为一帧数据里,一个字节和一个字节的间隔应该在0.5个字节时间内,所以我选择1.5ms;不知这个逻辑是否存在问题?

后来我思考后,觉得DMA中可以采用结束符判断,结束一帧数据的接收,还未做,不知可行否?


最佳答案

查看完整内容[请看2#楼]

如果一帧数据量大或波特率很高,就用DMA。38400的话,就是一个字节要280微秒,已经很慢了,可以用中断接收,对效率影响不大。另外两个字节的间隔应该跟发送方协商好,这个间隔跟波特率没任何关系。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
发表于 2016-9-19 22:37:17 | 显示全部楼层
如果一帧数据量大或波特率很高,就用DMA。38400的话,就是一个字节要280微秒,已经很慢了,可以用中断接收,对效率影响不大。另外两个字节的间隔应该跟发送方协商好,这个间隔跟波特率没任何关系。
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-9-19 23:01:49 | 显示全部楼层
按楼主位的计算,串口中断是1.145ms一次,定时器中断是1.5ms一次,也差不了多少。
既然认为帧内字节间隔0.5以内、帧间1字节以上,那就用DMA加串口Idle中断吧。
淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-9-20 09:29:50 | 显示全部楼层
9600这个波特率的话,直接中断都是可以的,太慢了,占不了多少的
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-9-20 09:32:49 | 显示全部楼层
赞同2楼,用DMA+串口空闲中断
回复

使用道具 举报

21

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-2-19
在线时间
46 小时
 楼主| 发表于 2016-9-20 09:53:58 | 显示全部楼层
憨厚诚实大叔 发表于 2016-9-20 09:29
9600这个波特率的话,直接中断都是可以的,太慢了,占不了多少的

如果115200bps,会不会有问题???
回复

使用道具 举报

21

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-2-19
在线时间
46 小时
 楼主| 发表于 2016-9-20 09:55:30 | 显示全部楼层
K.O.Carnivist 发表于 2016-9-19 23:01
按楼主位的计算,串口中断是1.145ms一次,定时器中断是1.5ms一次,也差不了多少。
既然认为帧内字节间隔0. ...

就是怕有的设备,帧内的字节间隔超过1个字节以上,这样的Idle就用不了吧??
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-9-20 10:25:39 | 显示全部楼层
wuyuping528 发表于 2016-9-20 09:53
如果115200bps,会不会有问题???

这个的话,最好用DMA,DMA有半传输中断和,完成中断。产生这2个中断就处理,或者DMA配合空闲串口中断使用
回复

使用道具 举报

21

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-2-19
在线时间
46 小时
 楼主| 发表于 2016-9-24 16:05:16 | 显示全部楼层
你的回复很有启发!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 19:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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