本帖最后由 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);
} |