• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

STM32F4-ADC_DMA采集多路数据问题

donatello 2017-10-30 浏览量:1574

如题,在网上查阅资料,普遍认为ADC多路采集跟DMA是一对好搭档,因此我也认为直接套用是没什么问题的,可是弄了很久都没成功,只有单路DMA可以成功。这是什么原因呢?

#define ADC1_DMA_ON 1

void ADC1_Init(int channelnum)
{    
  __HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
ADC1_Handler.Instance=ADC1;
  ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;
//二分频
  ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B;
//十二位模式
  ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;
//使用软件触发
  ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;
//右对齐模式
ADC1_Handler.Init.ScanConvMode=DISABLE;
//非扫描模式
ADC1_Handler.Init.ContinuousConvMode=ENABLE;
//禁止连续转换模式
ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;
//禁止连续不采样模式
if(channelnum>1)
ADC1_Handler.Init.NbrOfConversion=channelnum;
//转换规则序列
else if(channelnum==1)
ADC1_Handler.Init.NbrOfConversion=1;
//只转换规则序列1


  ADC1_Handler.Init.DMAContinuousRequests=ENABLE;
//开启DMA请求
  ADC1_Handler.Init.EOCSelection=ADC_EOC_SINGLE_CONV;

  GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;
  GPIO_Initure.Mode=GPIO_MODE_ANALOG;
  GPIO_Initure.Pull=GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA,&GPIO_Initure);

#if ADC1_DMA_ON
__HAL_RCC_DMA2_CLK_ENABLE();
  ADC1_DMA_Handler.Instance = DMA2_Stream4;
  ADC1_DMA_Handler.Init.Channel = DMA_CHANNEL_0;
  ADC1_DMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
  ADC1_DMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;
  ADC1_DMA_Handler.Init.MemInc = DMA_MINC_DISABLE;
ADC1_DMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  //外设数据存储格式为字(两个字节)
ADC1_DMA_Handler.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
//内存数据存储格式为字(两个字节)
ADC1_Handler.Init.ContinuousConvMode=ENABLE;
//启动连续转换模式
ADC1_DMA_Handler.Init.Mode = DMA_CIRCULAR;
  ADC1_DMA_Handler.Init.Priority = DMA_PRIORITY_LOW;
  ADC1_DMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  HAL_ADC_Init(&ADC1_Handler);
HAL_DMA_Init(&ADC1_DMA_Handler);
  __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1_DMA_Handler);

#endif
}

int ADC1_GetValue(int channel,int chanque)   
{   
int val;
ADC1_ChanConf.Channel=channel;
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_3CYCLES;
ADC1_ChanConf.Rank=chanque;
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;
//采样时间
ADC1_ChanConf.Offset=0;                 
HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);
ADC1status=HAL_ADC_Start(&ADC1_Handler);  

if(ADC1status!=1)
{
#if ADC1_DMA_ON
HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&dma_val,1);
val=dma_val;
return val;
#else
val=(int)HAL_ADC_GetValue(&ADC1_Handler);
return val;
#endif
}
else return -1;
}

2.JPG

-1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:0

相关问题

问题达人换一批

STM32F4-ADC_DMA采集多路数据问题