|
回复双通道问题
下面是我开多通道的代码给你参考下:
void DMA_ADC_Config() { /* DMA channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA_Channel1);//复位DMA通道x DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DR_Address;//定义 DMA通道外设基地址=ADC1_DR_Address 源 //AD采集到的数据存放的寄存器 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RegularConvertedValueTab;//定义DMA通道存储器地址,内存中的数据 目的 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址 DMA_InitStructure.DMA_BufferSize = 4;//定义DMA缓冲区大小4 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(DMA_Channel1, &DMA_InitStructure);//初始化DMA通道x DMA_Cmd(DMA_Channel1, ENABLE);//使能DMA通道x }
void ADC1_Channel_config() { /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//AD转换模式 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;//转换通道为通道4 ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel14 configuration */ //ADC1选择信道14|15,音序器等级1,采样时间55.5个周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_55Cycles5); } (这段代码是以前做万用表的时候用的,多次修改,有些注释可能没改过来) 然后在上面定义下数据数组 vu16 ADC_RegularConvertedValueTab[4]; 结果4个通道的数据就按次序在这个数组里面了, 具体顺序应该是这样的,先是采集通道14,DMA自动把数据放到数组第一个位置然后DMA地址会加一 所以DMA_InitStructure.DMA_MemoryInc 一定要定义成 DMA_MemoryInc_Enable;也就是递增 然后通道15,依次类推到4次结束后触发一次DMA中断,然后又是通道14 |
|