你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何让STM32F4的DMA传输目的地址递增问题

[复制链接]
quzhanguang-337 提问时间:2013-12-12 16:52 /
 在用F407Discovery做外部高速ADC实验,把外部AD的转换结果,通过DMA传输到内存中,使用外部时钟来触发DMA。
把200次的转换结果储存到一个数组中。传输长度设置为为200,储存器地址递增。


问题是每触发一次DMA,DMA都会把同一个转换结果,传输到数组中,数组的里面都是同一个结果。也就是说DMA是触发一次,就完成了200次传输,结果如下图。
  QQ截图20131212135330.jpg


如果希望,触发一次DMA,传输一次结果。结果是内存地址不能递增,每次结果都储存在了数组中的第一个元素。
结果如下图
 
QQ截图20131212140009.jpg

请教大神们,怎么设置DMA才能触发一次传输一次转换结果,每次传输的目的地址递增,把200个不同时刻AD的转换结果储存到数组中





呢?
收藏 评论11 发布时间:2013-12-12 16:52

举报

11个回答
quzhanguang-337 回答时间:2013-12-12 17:14:16

RE:如何让STM32F4的DMA传输目的地址递增问题

顶起啊,别沉了
fengye5340 回答时间:2013-12-13 09:37:46

RE:如何让STM32F4的DMA传输目的地址递增问题

1--开启内存递增模式。
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable
2--关闭DMA循环模式,采用正常模式
   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
   你的要求中,用循环模式会出现上面的结果。
3--200次时钟触发采用一个计数器控制
这个前提是,你的 DMA_InitStructure.DMA_BufferSize =1.
目标内存:DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&b,
中,b是个数组指针
有缘于你 回答时间:2013-12-13 11:48:24

RE:如何让STM32F4的DMA传输目的地址递增问题

用DMA_Mode_Normal模式
quzhanguang-337 回答时间:2013-12-13 13:18:43

回复:如何让STM32F4的DMA传输目的地址递增问题

 楼上两位的方法试过,确认不可行
fengye5340 回答时间:2013-12-13 14:25:17

回复:如何让STM32F4的DMA传输目的地址递增问题

回复第 5 楼 于2013-12-13 13:18:43发表:
 楼上两位的方法试过,确认不可行
 

在每次DMA中断中,都需要重新配置DMA的,楼主把代码贴上来看看
jerryh 回答时间:2014-1-6 15:53:02

RE:如何让STM32F4的DMA传输目的地址递增问题

你的问题解决得怎样了?我最近也在弄,到时直接读取DMA的值,总是为0,能发我个你的程序参考下吗?1061827991@qq.com
徐_公 回答时间:2014-1-6 19:44:23

RE:如何让STM32F4的DMA传输目的地址递增问题

我最近做了一个ETH 转 USART,用的DMA,感觉其递增功能真的挺好用,但
你这个要是用memory地址递增只能是把peripheral的数据传buffersize次。
    我觉得楼主fengye5340-109024说的是可行的,你看看这样行不行:
1、在外部触发处理中设置一个静态的计数器(static uint_16 COUNTER),每次触发都自加一。
2、采用非递增模式,peripheral地址固定,而memory的地址为基址+COUNTER,buffersize设为1.
3、这样每次触发都初始一下DMA设置,不知这样是否会满足你的高速要求,但感觉影响不是很大(我的USART接受数据转存到缓存就是这么处理的,因为USART的数据寄存器就一个字节长,只能一个个转)
4、if(COUNTER>200){...},你可以根据你的需要写。
quzhanguang-337 回答时间:2015-4-10 21:36:45
徐_公 发表于 2014-1-6 19:44
我最近做了一个ETH 转 USART,用的DMA,感觉其递增功能真的挺好用,但
你这个要是用memory地址递增只能是把pe ...

这跟直接在外部中断了读写数据有什么区别
eurphan 回答时间:2015-4-11 18:36:09
不懂帮顶  
流言飞雨 回答时间:2016-6-19 16:57:34
memory0BaseAddr = (uint32_t)&b;
改为
memory0BaseAddr = (uint32_t)b;
或者
memory0BaseAddr = (uint32_t)&b[0];
原因:
猜测,&b是二维指针,DMA地址递增时,使用二维指针寻址,导致b[0]之外的数组元素被略过,而将数据传送到了数组b后的位置。
猜测,楼主期望的第n(从0计)个数据应该在b+数组b元素个数*n的地址位置
valentinaxue 回答时间:2019-10-11 22:04:09
借楼问个问题  
STM32F4在使用SPI DMA 进行收发的时候  存储器数据长度和外设数据长度都是16位 使能存储器指针递增
按照数据手册中所说  理应每次传输指针递增两个字节  也就是刚好一个半字
但实际中递增了4个字节
单独写一个存储器到存储器 16位数据传输  指针的递增就是正确的  怎样设置??
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版