|
发表于 2014-9-17 21:17:41
|
显示全部楼层
请问STM32F303VCT6的ADC连续采样多路该怎么配置了?我搞了一天都搞不懂。希望你们帮助我。配置为:
void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1|RCC_ADC34PLLCLK_Div1);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12|RCC_AHBPeriph_ADC34, ENABLE);
ADC_GPIO_Config();
ADC_DMA_Config();
ADC_StructInit(&ADC_InitStructure);
ADC_VoltageRegulatorCmd(ADC1, ENABLE);
ADC_VoltageRegulatorCmd(ADC2, ENABLE);
ADC_VoltageRegulatorCmd(ADC3, ENABLE);
ADC_VoltageRegulatorCmd(ADC4, ENABLE);
Delay(10);
ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC1);
ADC_SelectCalibrationMode(ADC2, ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC2);
ADC_SelectCalibrationMode(ADC3, ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC3);
ADC_SelectCalibrationMode(ADC4, ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC4);
while(ADC_GetCalibrationStatus(ADC1) != RESET );
calibration_value_1 = ADC_GetCalibrationValue(ADC1);
while(ADC_GetCalibrationStatus(ADC2) != RESET );
calibration_value_2 = ADC_GetCalibrationValue(ADC2);
while(ADC_GetCalibrationStatus(ADC3) != RESET ){}
calibration_value_3 = ADC_GetCalibrationValue(ADC3);
while(ADC_GetCalibrationStatus(ADC4) != RESET ){}
calibration_value_4 = ADC_GetCalibrationValue(ADC4);
/* ADC Dual mode configuration */
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Interleave;
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 2;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
/* 配置ADC1在连续模式下分辨率为12bits*/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//配置ADC的转化分辨率
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;//配置选择连续采样或单次采样
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;//ADC内部边沿触发
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC是左对齐还是右对齐
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;
ADC_InitStructure.ADC_NbrOfRegChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Init(ADC2, &ADC_InitStructure);
ADC_Init(ADC3, &ADC_InitStructure);
ADC_Init(ADC4, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 6, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 7, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 8, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 9, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 10, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 11, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 12, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 13, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 14, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 15, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 16, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 17, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 18, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 19, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 20, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 21, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 22, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 23, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_14, 24, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 25, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC3, ADC_Channel_16, 26, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_1, 27, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_2, 28, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_3, 29, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_4, 30, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_5, 31, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_12, 32, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_13, 33, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_6, 34, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_7, 35, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_8, 36, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_9, 37, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_10, 38, ADC_SampleTime_19Cycles5);
ADC_RegularChannelConfig(ADC4, ADC_Channel_11, 39, ADC_SampleTime_19Cycles5);
ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);//配置DMA循环模式
ADC_DMAConfig(ADC2, ADC_DMAMode_Circular);//配置DMA循环模式
ADC_DMAConfig(ADC3, ADC_DMAMode_Circular);//配置DMA循环模式
ADC_DMAConfig(ADC4, ADC_DMAMode_Circular);//配置DMA循环模式
ADC_DMACmd(ADC1, ENABLE); /* Enable ADC_DMA */
ADC_DMACmd(ADC2, ENABLE); /* Enable ADC_DMA */
ADC_DMACmd(ADC3, ENABLE); /* Enable ADC_DMA */
ADC_DMACmd(ADC4, ENABLE); /* Enable ADC_DMA */
ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC2, ENABLE);
ADC_Cmd(ADC3, ENABLE);
ADC_Cmd(ADC4, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));
while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_RDY));
while(!ADC_GetFlagStatus(ADC4, ADC_FLAG_RDY));
// DMA_Cmd(DMA1_Channel1, ENABLE);//DMA频道使能
// DMA_Cmd(DMA1_Channel1, ENABLE);//DMA频道使能
// DMA_Cmd(DMA1_Channel1, ENABLE);//DMA频道使能
ADC_StartConversion(ADC1);
ADC_StartConversion(ADC2);
ADC_StartConversion(ADC3);
ADC_StartConversion(ADC4);
}
void ADC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA1 Channel1 Config */
DMA_DeInit(DMA1_Channel1);//选择通道
DMA_InitStruct.DMA_PeripheralBaseAddr = ADC_CDR_ADDRESS;//设置外设地址
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;//设置内存映射地址
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//外设作为数据传输的来源
DMA_InitStruct.DMA_BufferSize = 39;//缓冲为39
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//关外设地址映射
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//关内存地址计数
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//字节 外设数据宽度为32位
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;//循环模式
DMA_InitStruct.DMA_Priority = DMA_Priority_High;//高优先级
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;//关内存到内存
DMA_Init(DMA1_Channel1, &DMA_InitStruct);
} |
|