cancel
Showing results for 
Search instead for 
Did you mean: 

ADC and DMA

msanchez
Associate II
Posted on November 12, 2015 at 18:21

Hi everybody!!

I'm doing a program in which I would like to read two ADC channel but I couldn't. I use to do this the ADC and the DMA. I don't known what is wrong in my code. 

/* Includes ------------------------------------------------------------------*/

#include ''main.h''

/* Private define ------------------------------------------------------------*/

#define ADC1_DR_Address    ((uint32_t)0x4001244C)

/* Public variables ----------------------------------------------------------*/

GPIO_InitTypeDef GPIO_InitStruct;

ADC_InitTypeDef ADC_InitStructure;

DMA_InitTypeDef DMA_InitStructure;

__IO uint16_t ADC1ConvertedValue [2] = {0};

/* Public functions ----------------------------------------------------------*/

void RCC_Configuration()

{

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

}

void GPIO_Configuration()

{

  /* Condigure ADC Channel 10*/

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;                                        // We are going to use PC1

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;                                    // Analog input mode

  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                                // Set GPIO speed

  GPIO_Init(GPIOC, &GPIO_InitStruct);

  

  /* Condigure ADC Channel 12*/

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;                                        // We are going to use PC2

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;                                    // Analog input mode

  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                                // Set GPIO speed

  GPIO_Init(GPIOC, &GPIO_InitStruct);

}

void DMA_Configuration()

{

    /* DMA1 channel1 configuration ----------------------------------------------*/

  DMA_DeInit(DMA1_Channel1);

  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 2;                                                                                    

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  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);  

  /* Enable DMA1 channel1 */

  DMA_Cmd(DMA1_Channel1, ENABLE);

}

void ADC_Configuration()

{

    /* ADC1 configuration ------------------------------------------------------*/

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  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 = 2;

  ADC_Init(ADC1, &ADC_InitStructure);

  

  /* ADC1 regular channels configuration */ 

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_28Cycles5);

  

  /* Enable ADC1 DMA */

  ADC_DMACmd(ADC1, ENABLE);

  

  /* Enable ADC1 */

  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibration register */   

  ADC_ResetCalibration(ADC1);

  /* Check the end of ADC1 reset calibration register */

  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibration */

  ADC_StartCalibration(ADC1);

  /* Check the end of ADC1 calibration */

  while(ADC_GetCalibrationStatus(ADC1));

/* Enable ADC1 */

  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibration register */   

  ADC_ResetCalibration(ADC1);

  /* Check the end of ADC1 reset calibration register */

  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibration */

  ADC_StartCalibration(ADC1);

  /* Check the end of ADC1 calibration */

  while(ADC_GetCalibrationStatus(ADC1));

}

/**

  * @brief  Main program

  * @param  None

  * @retval None

  */

void main(void)

{

  int i = 0;

  float tensionADC1 = 0;

  float tensionADC2 = 0;

  float tension1 = 0;

  float tension2 = 0;

  

  RCC_Configuration();

  GPIO_Configuration();

  DMA_Configuration();

  ADC_Configuration();

  

  tensionADC1 = 0;

  tensionADC2 = 0;

  tension1 = 0;

  tension2 = 0;

  

   for (i=0; i<1000; i++)                                                       // ADC measurement loop

   {

     ADC_SoftwareStartConvCmd(ADC1, ENABLE);

     //while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

     tensionADC1 += ((ADC1ConvertedValue[0])*(3.3/4096));

     tensionADC2 += ((ADC1ConvertedValue[1])*(3.3/4096));

   }

   

   tension1 = tensionADC1/1000;

   tension2 = tensionADC2/1000;

   

   printf(''%f'', tension1);

   printf(''%f'', tension2);

   

   while(1);

}

/************************** (C) COPYRIGHT 2015 GIE ************END OF FILE*****/
2 REPLIES 2
Posted on November 12, 2015 at 19:48

There seems to be some unnecessary replication of code, the rank number of the second channel is wrong, and I have no idea what processor you are using. STM32 describes hundreds of parts, over several families. You need to be specific about the chip and board in question. The DISCO boards use a 3.0V reference, not a 3.3V one.

Are you sure I haven't already posted a working example? It's a lot easier to just use something that works and modify it, than have me constantly play ''fix-this broken code I've created''.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
msanchez
Associate II
Posted on November 24, 2015 at 09:40

Thank you, Clive1. I have solved the problem