打印

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

[复制链接]
7380|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传到该数组的值都依次往后推。

请问哪位大侠有遇到此种现象
沙发
leewen|  楼主 | 2012-3-23 19:06 | 显示全部楼层
我的系统用的AD通道至少有8个,用的是规则方式,扫描模式的,基本没出现过错位的,最近发现在关闭ADC时钟,关闭ADON,然后重新打开时钟,初始化ADC和DMA后,有些平台会出现错位现象。

使用特权

评论回复
板凳
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
暂时这样只有这些,不知道还不会出现问题。

使用特权

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

使用特权

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

本版积分规则

45

主题

102

帖子

2

粉丝