搜索
bottom↓
回复: 16

DMA的使用心得

[复制链接]

出0入0汤圆

发表于 2014-2-25 16:14:22 | 显示全部楼层 |阅读模式
        单片机的DMA使用心得
本人也是最近才深入了解一下DMA,前期使用单片机的时候基本上没有用到。一是不需要用到,二是心理上觉得DMA比较困难,所以不使用。在学习的过程中有一些心得体会,与大家分享一下。
首先介绍一下啥子是DMA,说的通俗易懂一点就是一个搬运工。既然是搬运工,就有几个需要注意的问题。
1.        从哪里搬运到哪里   一般是特殊寄存器到RAM(我们自己定义的数组里面),或者相反。
2.        一次搬运多少  一般是一个字节或者两个字节。
3.        搬多少的东西。
4.        什么时候开始搬  即DMA的中断源,简单的就是说别人有东西来了,你才能搬。在单片机里面可以表现为,串口接收到数据了,就开始搬到RAM,或者AD采样结束了,就开始搬运。当然这里需要提前配置好对应模块的寄存器。
5.        搬运结束了,DMA产生中断。就是搬运工把东西都搬完了,来找CPU结账来了,这时候CPU就要告诉他,要么你重新继续搬运,要么停止工作,等待新指令。
DMA基本上就这些
   这里以AD采样,然后利用DMA把数据传输到指定的数组里面为例作个简单的说明

1.        初始化DMA,说明从搬运从AD采样结果的寄存器开始,搬到我们自己定义的数组里面,每次搬一个字节的数据,每次搬完了目标地址+1,搬512次,在AD采样结束后才开始搬运。
2.        初始化AD,这里不做介绍,和配置普通AD一样,采用软件触发方式,连续采样。
3.        配置完了就在主函数里面开始了,先初始化DMA,在初始化AD,打开DMA,然后打开AD采样。这时候AD就开不断在采集数据。每次采样完成后,就会有一次AD中断,AD中断每次产生,DMA就会把数据搬到我们制定的数组里面。
4.        当DMA搬了我们那么多的,这里是512个数据的时候,就会产生中断,我们在中断里面就要告诉DMA,搬的目标地址又变回去,搬的数目又变成512,然后又打开DMA,让他再次为我们工作。

流程大概就是这个样子,个人心得!源代码就不附了,我用的瑞萨单片机,没啥参考意义!不对的地方请指出,希望多交流学习!
                                    --------看海冲浪
                                   Whq5234970@outlook.com
                                          

出0入0汤圆

发表于 2014-2-25 16:24:56 | 显示全部楼层
消灭0回复

出0入0汤圆

发表于 2014-4-10 13:14:11 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-4-10 21:06:59 | 显示全部楼层
比喻很形象

出0入0汤圆

发表于 2014-4-25 08:52:57 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-4-25 09:55:51 | 显示全部楼层
善于总结,不错。也很形象

出0入0汤圆

发表于 2014-4-28 20:40:09 | 显示全部楼层
以前还真的没有怎么用过DMA

出0入0汤圆

发表于 2014-12-16 13:21:39 | 显示全部楼层
我对楼主AD采样过程的第3条有点疑义,如果用DMA的话,就应该不用触发AD采样中断了,AD采样一次DMA自动传送一次,采样512次后,产生一次DMA中断,处理采样数据,如果每采样一次就产生一次AD中断,那用DMA就没有意义了。

出0入0汤圆

发表于 2016-7-6 10:03:47 | 显示全部楼层
非常形象的比喻。

出0入4汤圆

发表于 2016-10-1 13:46:50 | 显示全部楼层
用DMA 做图像搬运,啥都明白了

出0入0汤圆

发表于 2016-10-8 12:06:44 | 显示全部楼层
说的很形象,目前正在学DMA。。。

出0入0汤圆

发表于 2016-10-8 15:06:16 | 显示全部楼层
我理解是,CPU在运算时总线是空闲的, DMA利用总线空闲进行数据搬送。STM32可以设置成 AD循环采样多个AD口,DMA顺序搬送到数组上,程序就可以直接在数组得到数据。

出0入0汤圆

发表于 2017-2-8 12:09:43 | 显示全部楼层
进来学习了,但感觉4.什么时候开始搬  即DMA的中断源(这里应该不是DMA的中断源,应该是外设的中断源吧)

出0入0汤圆

发表于 2018-9-8 14:30:10 | 显示全部楼层
目前还没用到DMA,也是最近听说这个模块的,先学习了解下。

出0入0汤圆

发表于 2018-10-10 18:19:36 | 显示全部楼层
问下,DMA搬运的时候,cpu这时候是运行状态还是暂停状态?DMA和CPU是否不能同时运行?

出30入54汤圆

发表于 2018-10-10 20:25:22 | 显示全部楼层
benhaha 发表于 2018-10-10 18:19
问下,DMA搬运的时候,cpu这时候是运行状态还是暂停状态?DMA和CPU是否不能同时运行? ...

DMA会占用数据总线,如果此时CPU在同一个bank的内存有数据请求,那么就会等待,反之则继续运行。这个过程并不完全是绝对的,会因为不同的SOC架构的不同而不同

出0入0汤圆

发表于 2019-8-17 21:57:08 来自手机 | 显示全部楼层
总结得很好,感谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 14:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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