打印

STM32的AD采样后通过DMA方式获取发生错位

[复制链接]
6323|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leewen|  楼主 | 2012-3-23 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的系统在运行时,有时会遇到ADC采样通过DMA方式获取发送错位
比如说现在定义了几个AD口,
ADC_Init(ADC1,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,2,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_9,3,ADC_SampleTime_55Cycles5);
...

在DMA配置里设置了ADC采样的传送数组
DMA_InitStructure.DMA_MemorBaseAddr = (u32)&ADC_ConvertedValue;

在AD采样的时候,程序本来要采样的是ADC_Channel_8通道的AD值是传送到ADC_ConvertedValue[1];
但结果却在ADC_ConvertedValue[2]中,其他的AD采样通过DMA传到该数组的值都依次往后推。

请问哪位大侠有遇到此种现象
沙发
freefish| | 2012-3-23 14:26 | 只看该作者
这个问题老早就有了。不止一个人遇到过,基本无法根除。是DMA的原因造成的,通道少于5时建议改成注入方式。多于4时,转换完四个,改通道,再转换四个

使用特权

评论回复
板凳
leewen|  楼主 | 2012-3-23 19:06 | 只看该作者
我的系统用的AD通道至少有8个,用的是规则方式,扫描模式的,基本没出现过错位的,最近发现在关闭ADC时钟,关闭ADON,然后重新打开时钟,初始化ADC和DMA后,有些平台会出现错位现象。

使用特权

评论回复
地板
airwill| | 2012-3-23 20:12 | 只看该作者
我也遇到过, 没有办法, 曾经发帖说过这个问题, 怀疑是硬件缺陷.
然而反映给 ST, 人家要确切的发生错误的源代码, 可惜这个缺陷不总是出现的.
我试着获得出现问题的代码, 没有成功.
呵呵, 象楼上的那样, 绕者走吧.

使用特权

评论回复
5
leewen|  楼主 | 2012-3-23 20:21 | 只看该作者
查了一下,归纳了一些人的方法:
1,对ADC初始化时,先复位一下ADC1设备ADC_DeInit(ADC1);
2.在ADC初始化后,开始软件转换ADC_SoftwareStartConvCmd()后才执行DMA_Cmd(DMA_Channel1,ENABLE);
3.在系统进入休眠模式,停止ADC时,执行ADC1_CR2&=0XFFFFFEFC
暂时这样只有这些,不知道还不会出现问题。

使用特权

评论回复
6
freefish| | 2012-3-23 22:09 | 只看该作者
强干扰下几率很高!加个4000V脉冲群,一会儿就出现一次。

ADC_DeInit(ADC1);
ADC_DeInit(ADC2);

我的ADC初始化里开始就是这两句。用软件转换通道,不用DMA,就可以绕过去

使用特权

评论回复
7
leewen|  楼主 | 2012-3-24 10:14 | 只看该作者
也在考虑着不用DMA了,只是每次对某个AC通道转换时,都要重新设置一下这个通道,还没试验。

使用特权

评论回复
8
vrary| | 2012-4-10 10:49 | 只看该作者
学习

使用特权

评论回复
9
ji7411| | 2012-4-10 11:03 | 只看该作者
这个问题老早就有了。不止一个人遇到过,基本无法根除。是DMA的原因造成的,通道少于5时建议改成注入方式。多于4时,转换完四个,改通道,再转换四个


原来是这样。

使用特权

评论回复
10
chuckweng| | 2012-5-19 14:50 | 只看该作者
DMA 模式是循环接受的 还是 普通模式?如果是循环接受是很容易错位。

使用特权

评论回复
11
cool_coder| | 2013-11-25 15:59 | 只看该作者
我也碰到了,而且很有规律:连接仿真器运行时不错位,脱离仿真器就错位。
有人搞明白了吗?

使用特权

评论回复
12
ZRJ8951| | 2014-8-26 10:25 | 只看该作者
STM32的AD采样后通过DMA方式获取发生错位
=======================================
标记!

使用特权

评论回复
13
菜鸟同学| | 2015-10-7 12:08 | 只看该作者
leewen 发表于 2012-3-23 20:21
查了一下,归纳了一些人的方法:
1,对ADC初始化时,先复位一下ADC1设备ADC_DeInit(ADC1);
2.在ADC初始化后 ...

这个有道理1

使用特权

评论回复
14
smile99happytu| | 2017-3-6 17:22 | 只看该作者
我是外部触发 启动转换的 现在也是会出现通道错位 暂时还没有解决。。。。

使用特权

评论回复
15
smile99happytu| | 2017-3-6 17:35 | 只看该作者
freefish 发表于 2012-3-23 14:26
这个问题老早就有了。不止一个人遇到过,基本无法根除。是DMA的原因造成的,通道少于5时建议改成注入方式。 ...

转换完通道 怎样改通道再转换啊? 要怎么配置?

使用特权

评论回复
16
sky.sun.zz| | 2017-3-6 20:01 | 只看该作者
你必须先初始化DMA,然后再初始化ADC.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

102

帖子

2

粉丝