AnsweredAssumed Answered

multi ADC and DMA ==> memory problem

Question asked by stm32user.stm32user on Mar 5, 2013
Latest reply on Mar 6, 2013 by stm32user.stm32user
Hello,

I need to measure 3 ADC channels in continuous, I use the STM32L151VB.
I use the DMA transfert, my firmware doesn't work property.

please see in attachment my source code

my problem is the  memory data  "adcBuffer"
the DMA update only the case"0"

can you help me?

//-----------------------------------------------------------
  #include "ADCuser.h"
  #include "stm32l1xx_adc.h"
  #include "stm32l1xx_dma.h"
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
static uint32_t adcBuffer[3] = {0};
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void ADC_init(void)
{
  ADC_InitTypeDef ADC_InitStructure;
  DMA_InitTypeDef DMA_InitStructure;
 
  RCC_HSICmd(ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
 
 
  /* DMA Channel1 Configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &ADC1->DR ;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) adcBuffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 3;
  DMA_InitStructure.DMA_PeripheralInc =  DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 
  DMA_Cmd(DMA1_Channel1, ENABLE);
    
  /* ADC1 regular channel 7 configuration ************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_10b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = 0;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 3;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_384Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_384Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_384Cycles);
 
  ADC_ContinuousModeCmd(ADC1, ENABLE);
  ADC_DMACmd(ADC1, ENABLE);
  ADC_Cmd(ADC1, ENABLE);
 
  while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
 
  /* Wait until the ADC1 is ready */
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET);

  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConv(ADC1);

}


thanks a lot

Outcomes