高级会员

- 积分
- 591
- 金钱
- 591
- 注册时间
- 2013-11-13
- 在线时间
- 61 小时
|
5金钱
现在有个问题就是:
我现在使用了5路AD,如:
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,3,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_4,4,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,5,ADC_SampleTime_239Cycles5);
然后,我定义了static u16 ADC_ConvertedValue[5];用来存储数据如:
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;//外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADC_ConvertedValue;//内存基地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//外设通过DMA向内存存入数据
DMA_InitStructure.DMA_BufferSize=5;//一次DMA传输数据大小(DMA通道缓存)
然后执行函数:
u8 ADC_DMA_Get_Data(void)
{
DMA_Cmd(DMA1_Channel1,ENABLE);
if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET) //判断通道1传输完成
{
DMA_ClearFlag(DMA1_FLAG_TC1);//清除通道4传输完成标志
Adc.adcz1=ADC_ConvertedValue[0];
Adc.adcz2=ADC_ConvertedValue[1];
Adc.adcz3=ADC_ConvertedValue[2];
Adc.adcz4=ADC_ConvertedValue[3];
Adc.adcj5=ADC_ConvertedValue[4];
}
return 0;
}
可是结果,并不是按顺序,即:ADC_ConvertedValue[0]里存储的并不是ADC_Channel_1的值,ADC_ConvertedValue[1]存储的也不是ADC_Channel_2的值等!
而且每次复位还会变化?求助原子哥
|
最佳答案
查看完整内容[请看2#楼]
看了下楼猪的程序,楼猪程序在ADC和DMA的配置顺序上存在不合理的地方,在使用ADC多通道转换的时候尤其要注意配置顺序和不能重复配置,否则很容易引起通道搬运错位。楼猪程序的配置顺序是:
1、先配置ADC
2、ADC_Cmd(ADC1,ENABLE);//使能ADC1
3、ADC校准
4、配置DMA
5、ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件启动ADC
6、ADC_DMACmd(ADC1,ENABLE);//开始ADC_DMA传输
7、DMA_Cmd(DMA1_Channel1,ENABLE);
你自己看看顺 ...
|