title: STM32F4 DMA doesn't control ADC channels
body: <p>I'm trying to set up my STM32F407-Discovery board to read multiple ADC channels from ADC1 using the DMA controller. I can easily read the analog value one at a time without using DMA, but as soon as I enable DMA for the ADC, <code>ADC1-&gt;DR</code> is always 0, and <code>adc_vals</code> is filled with zeros. Furthermore, it hangs on <code>while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));</code>.</p>
  
  <p>EDIT: it would appear <code>DMA_GetCmdStatus</code> is returning DISABLED.  Any ideas?</p>
  
  <p>Is there a way to start the ADC or something that I'm missing?</p>
  
  <pre class="lang-c prettyprint-override"><code>//setup adc1: in1,2,3,8,9,15
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //adc1 on the apb2 peripheral bus
  ADC_InitTypeDef adc;
  ADC_DeInit(); //set adc to default state
  adc.ADC_DataAlign = ADC_DataAlign_Right;
  adc.ADC_Resolution = ADC_Resolution_12b;//12 bit = 4096
  adc.ADC_ContinuousConvMode = ENABLE;
  adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  adc.ADC_NbrOfConversion = NUM_ADC;
  adc.ADC_ScanConvMode = ENABLE;
  ADC_Init(ADC1,&amp;adc);
  
  
  ADC_DMACmd(ADC1, ENABLE); //enable adc for dma.  When this line is removed, I see data on ADC1-&gt;DR
  
  
  ADC_Cmd(ADC1,ENABLE);
  
  ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_144Cycles);//1:1710, 0
  //ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_144Cycles);//2:1710, 0
  //ADC_RegularChannelConfig(ADC1,ADC_Channel_3,3,ADC_SampleTime_144Cycles);//3:1710, 0
  ADC_RegularChannelConfig(ADC1,ADC_Channel_8,4,ADC_SampleTime_144Cycles);//8:3520
  ADC_RegularChannelConfig(ADC1,ADC_Channel_9,5,ADC_SampleTime_144Cycles);//9:1000
  //ADC_RegularChannelConfig(ADC1,ADC_Channel_15,6,ADC_SampleTime_144Cycles);//15:3920
  
  
  //DMA for multiple adc channels:
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); //dma1 clock enable
  DMA_InitTypeDef dma;
  
  DMA_DeInit(DMA2_Stream0); //reset DMA2 stream 0 to default values
  dma.DMA_Channel = DMA_Channel_0;
  dma.DMA_PeripheralBaseAddr = (uint32_t)&amp;(ADC1-&gt;DR);
  dma.DMA_Memory0BaseAddr = (uint32_t)&amp;adc_vals[0];
  dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
  dma.DMA_BufferSize = NUM_ADC;
  dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
  dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  dma.DMA_Mode = DMA_Mode_Circular;
  dma.DMA_Priority = DMA_Priority_High;
  dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
  dma.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &amp;dma);
  
  DMA_ITConfig(DMA2_Stream0, DMA_IT_TC | DMA_IT_HT, ENABLE); //Enable DMA Stream Half / Transfer Complete interrupt
  
  DMA_Cmd(DMA2_Stream0, ENABLE); //DMA2_Stream0 enable
  
  //dma transfer complete interrupt:
  NVIC_InitTypeDef nvic;
  //Enable DMA1 channel IRQ Channel
  nvic.NVIC_IRQChannel = DMA2_Stream0_IRQn;
  nvic.NVIC_IRQChannelPreemptionPriority = 0;
  nvic.NVIC_IRQChannelSubPriority = 0;
  nvic.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&amp;nvic);
  
  ADC_SoftwareStartConv(ADC1);//Start the adc conversion
  </code></pre>