我在使用多通道采样DMA传输的时候怎么只有一个通道的数据之正确的
这是为什么呢?大虾指点一下
程序:
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
/* ADCCLK = PCLK2/2 */
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
#else
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
#endif
/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1); //复位DMA通道1
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue; //定义DMA通道存储器地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //指定外设为源地址
DMA_InitStructure.DMA_BufferSize = 3000; //定义DMA缓冲区大小1
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //当前外设寄存器地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 当前存储器地址
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA通道操作模式位环形缓冲模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止DMA通道存储器到存储器传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化DMA通道1
/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
/* ADC1 configuration ------------------------------------------------------*/
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 =3; //通道数量
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5); //通道管脚及采样率
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 2, ADC_SampleTime_239Cycles5); //通道管脚及采样率
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_239Cycles5); //通道管脚及采样率
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibration register */
ADC_ResetCalibration(ADC1); ////复位校准寄存器
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1)); //检测校准复位寄存器是否复位完成
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1); //启动校准
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1)); //检测校准寄存器是否完成
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //允许软件触发转换
while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
/* Clear Channel 1 DMA_FLAG_TC flag */
DMA_ClearFlag(DMA1_FLAG_TC1);
主函数采集数据处理:
for(i = 0 ;i < 1000 ;i++)
{
Channel_1 += ADCConvertedValue[3 * i + 0] ;
Channel_2 += ADCConvertedValue[3 * i + 1] ;
Channel_3 += ADCConvertedValue[3 * i + 2] ;
}
Channel_1=Channel_1/1000;
Channel_2=Channel_2/1000;
Channel_3=Channel_3/1000;
只有ADC_Channel_14猜到的数据是正确的,我用的是LCD显示的
希望那位帮解决一下,本人必将感激不敬 |