关于ADC——DMA采集数据错位

2019-07-21 07:28发布

在论坛上看到好多人都表示ADC——DMA采集数据回来后数据错位了。

刚才发现,我的代码如果在DMA使能了时钟后面加一个小延时的话,就会发生这样的情况。
然后我把那个小延时去掉后发现数据就正常了,正在纠结的人可以看下自己DMA初始化函数前面是不是有个小延时了。
为什么会这样呢?


PS:我要在DMA初始化函数前加个小延时是因为刚才看到原子哥说库函数某个版本的函数有个小bug,加了小延时可以消除。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
flyinggirlxhx
1楼-- · 2019-07-22 05:21
 精彩回答 2  元偷偷看……
flyinggirlxhx
2楼-- · 2019-07-22 07:41
http://blog.sina.com.cn/s/blog_542bad910101h5jy.html
这个帖子里重点讲解了为什么会数据错位,并且怎么处理。亲测有效!

要注意在初始化时将DMA_Cmd(DMA1_Channel1, ENABLE);放置到ADC_SoftwareStartConvCmd(ADC1, ENABLE);前面。

原因是:如果在初始化AD的时候DMA被触发了一次,但是此时并没有采样,但是DMA目的地址已经发生了自加,
当你采样第一路的时候,数据却填充到了第二路。

校准AD的时候会触发DMA导致通道错位,因此校准AD基准前不要启用DMA
sweetstandard
3楼-- · 2019-07-22 11:07
本帖最后由 sweetstandard 于 2016-9-10 09:35 编辑

我也遇到了这样的问题,解决方法是:DMA工作在循环模式。具体如下:
======================================
寄存器方式:

void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx)
{




//DMA_CHx->CCR|=0<<5;  //非循环模式,这种模式下就错位。
   DMA_CHx->CCR|=1<<5;  //循环模式




}
=================================
库函数方式:

void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx)
{




//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //正常缓存模式,这种模式下就错位。
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式。        




}
================================

林春霞
4楼-- · 2019-07-22 13:12
谢谢大家,mark一下
嘴角的上弦月
5楼-- · 2019-07-22 15:49
sweetstandard 发表于 2016-9-10 09:28
我也遇到了这样的问题,解决方法是:DMA工作在循环模式。具体如下:
=================================== ...

你这种修改方式不实用啊,应该还不是问题的本质吧。那要是在只能用正常模式下(不用循环模式),岂不是就一直错位下去啊?
Kinglkf2R
6楼-- · 2019-07-22 16:20
 精彩回答 2  元偷偷看……

一周热门 更多>