硬汉嵌入式论坛

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

[DMA] DMA 双缓冲发送如何停止

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2018-10-7 17:32:51 | 显示全部楼层 |阅读模式
当有大量数据要发送到外设的时候,使用了双缓冲DMA发送,如:根据输入参数动态计算出100000个点的轨迹数值,通过串口发送到设备,
可是双缓冲没有找到方法设置发送数量,需要cpu干预才能停止.

请问高人有没有更好的方法
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2018-10-7 17:47:49 | 显示全部楼层
方法一:
设置了DMA每次循环传输的个数后(最大65535个,字,半字,字节均可),在DMA中断里面做循环次数计数,传输够了,停止即可。
这种停止方式,适合用于你要发送的字节数,正好能在数个DMA循环次数完成。一般你的串口速度不是很快的情况下,都可以在中断里面及时停止。

你说的100000个,两次50000就完成了,进入DMA中断立即寄存器方式关闭应该没问题的。

方法二:
采用DMA正常模式,不使用双缓冲了,每次进入DMA完成中断后,开启新的下一次传输配置,这种适合任意字节大小,就是需要你封装个API。

回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2018-10-7 23:44:32 | 显示全部楼层
其实是不定长度的,速度很高,6M左右,不停的实时计算并发送,发送缓冲不大的,1024byte左右,看来也是只能用方法一了,谢谢你的指点
回复

使用道具 举报

14

主题

99

回帖

141

积分

初级会员

积分
141
发表于 2020-8-11 11:17:18 | 显示全部楼层
eric2013 发表于 2018-10-7 17:47
方法一:
设置了DMA每次循环传输的个数后(最大65535个,字,半字,字节均可),在DMA中断里面做循环次数 ...

硬汉哥,我昨天想请教的也是这个问题,我想中止本次的DMA传输,因为有错误,然后想再次启用DMA传输,不是ADC或DAC的双缓存,应该时方法二里面的,中止后如何再次启动的问题?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2020-8-11 11:22:28 | 显示全部楼层
LR215 发表于 2020-8-11 11:17
硬汉哥,我昨天想请教的也是这个问题,我想中止本次的DMA传输,因为有错误,然后想再次启用DMA传输,不是 ...

这个帖子里面回复你的就是方案二,建议看一下

请教一下DMA的停止和重新启动?
http://www.armbbs.cn/forum.php?m ... 9313&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 07:20 , Processed in 0.158254 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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