| 
 
| 本帖最后由 motor666 于 2012-4-22 09:01 编辑 
 我使用4个ADC通道做练习,ADC_Channel_8、9、14和15,转换和中断都正常,就是数据的排列顺序总是向后错位一个,即:顺序中的第二个通道被放在数据的第一位,第三个通道被放在数据的第二位,第四个通道被放在数据的第三位,而第一个通道的数据被放在了第四位。
 再解释的具体点:定义变量ADCConvertedValue[4]存放四个通道的采样数据,采样顺序1、2、3、4分别对应ADC_Channel_8、9、14和15,理论上应该ADCConvertedValue[0]=ADC_Channel_8的数据,
 ADCConvertedValue[1]=ADC_Channel_9的数据,
 ADCConvertedValue[2]=ADC_Channel_14的数据,
 ADCConvertedValue[3]=ADC_Channel_15的数据,
 可是实际情况是
 ADCConvertedValue[0]=ADC_Channel_9的数据,
 ADCConvertedValue[1]=ADC_Channel_14的数据,
 ADCConvertedValue[2]=ADC_Channel_15的数据,
 ADCConvertedValue[3]=ADC_Channel_8的数据,
 版主能不能给指导一下,已经好几天没有进展了,ADC和DMA的配置程序贴出来,其它程序我想不应该有问题,就不贴了。
 
 void ADC_Configuration(void)
 {
 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    // 转换模式,为独立转换
 ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //
 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    // 连续转换
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不用外部触发
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
 ADC_InitStructure.ADC_NbrOfChannel = 4;          //  指定有多少个通道会被转换,1~16
 ADC_Init(ADC1, &ADC_InitStructure);
 
 
 ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); //PB0
 ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5); //PB1
 
 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 3, ADC_SampleTime_55Cycles5); //PC4
 //                     转换通道14   采样顺序    周期
 ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 4, ADC_SampleTime_55Cycles5); //PC5
 //                                           第二个采样
 
 ADC_DMACmd(ADC1, ENABLE);
 ADC_Cmd(ADC1, ENABLE);
 ADC_ResetCalibration(ADC1); //重置校验寄存器
 while(ADC_GetResetCalibrationStatus(ADC1));  //等待重置校验成功
 ADC_StartCalibration(ADC1);       //开始ADC校验
 while(ADC_GetCalibrationStatus(ADC1)); //等待ADC校验好
 
 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发开始转换
 }
 
 void DMA_Configuration(void)
 {
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE); // 使能DMA时钟
 
 DMA_DeInit(DMA1_Channel1);                      // 复位值
 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 指定到ADC1上
 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; // 目的地地址
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // 方向 片内外设作源头
 DMA_InitStructure.DMA_BufferSize = 4;         // 填充4个数,
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 外设地址不增加
 
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMA_InitStructure.DMA_PeripheralDataSize =  DMA_PeripheralDataSize_HalfWord;  DMA_InitStructure.DMA_MemoryDataSize =   DMA_MemoryDataSize_HalfWord;
 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 //DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);  // 使能传输完成中断
 DMA_Cmd(DMA1_Channel1, ENABLE);
 DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);
 }
 | 
 |