AnsweredAssumed Answered

Problem Reading 10 Ports with ADC1

Question asked by kirk.douglas on Feb 16, 2014
Latest reply on Feb 17, 2014 by Clive One
Hello Based on some examples on the forum, here (Thank you).

I am using the STM32F407 based discovery board.

I have the following code that works fine, but PA2, PA3, and PC4 do not give me the correct readings.

As a test all Ain are connected to 1/2 VDD so the 12 bit response should be 0x0800 but for some reason they are being driven by something else.

Right now I get

07FB    0804    06DB    0616    0802    0801    0800    0801    06DF    07FD
PA0     PA1     PA2       PA3     PB0     PB1     PC1     PC2     PC4     PC5

So my values for PA2, PA3, and PC4 are wrong and I can scope signals on PA2.

    
volatile uint16_t ADCValues[10];
  
  
#define PORTA_ADCPORT   GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
#define PORTB_ADCPORT   GPIO_Pin_0 | GPIO_Pin_1
#define PORTC_ADCPORT   GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_5
  
/**************************************************************************************/
   
void RCC_Configuration(void)
{
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
}
   
/**************************************************************************************/
   
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIOA_InitStructure;
  GPIO_InitTypeDef GPIOB_InitStructure;
  GPIO_InitTypeDef GPIOC_InitStructure;
   
  GPIO_StructInit(&GPIOA_InitStructure);
  
  GPIOA_InitStructure.GPIO_Pin = PORTA_ADCPORT;
  GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIOA_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIOA_InitStructure);
    
  GPIOB_InitStructure.GPIO_Pin = PORTB_ADCPORT;
  GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIOB_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOB, &GPIOB_InitStructure);
  
  GPIOC_InitStructure.GPIO_Pin = PORTC_ADCPORT;
  GPIOC_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIOC_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIOC_InitStructure);
}
   
  
  
void ADC1_Configuration(void)
{
  ADC_InitTypeDef       ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  DMA_InitTypeDef       DMA_InitStructure;
    
  /* Enable peripheral clocks *************************************************/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    
  /* DMA2_Stream0 channel0 configuration **************************************/
  DMA_DeInit(DMA2_Stream0);
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCValues[0];
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 10;
  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_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  /* DMA2_Stream0 enable */
  DMA_Cmd(DMA2_Stream0, ENABLE);
    
  /* ADC Common Init **********************************************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);
    
  /* ADC1 Init ****************************************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 10;
  ADC_Init(ADC1, &ADC_InitStructure);
  
  /* ADC1 regular channel configuration ******************************/
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0,  1, ADC_SampleTime_480Cycles); // PA0
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1,  2, ADC_SampleTime_480Cycles); // PA1
  ADC_RegularChannelConfig(ADC1, ADC_Channel_2,  3, ADC_SampleTime_480Cycles); // PA2
  ADC_RegularChannelConfig(ADC1, ADC_Channel_3,  4, ADC_SampleTime_480Cycles); // PA3
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8,  5, ADC_SampleTime_480Cycles); // PB0
  ADC_RegularChannelConfig(ADC1, ADC_Channel_9,  6, ADC_SampleTime_480Cycles); // PB1
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 7, ADC_SampleTime_480Cycles); // PC1
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 8, ADC_SampleTime_480Cycles); // PC2
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 9, ADC_SampleTime_480Cycles); // PC4
  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 10, ADC_SampleTime_480Cycles); // PC5
    
   /* Enable DMA request after last transfer (Single-ADC mode) */
  ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
    
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
    
    /* Enable ADC1 **************************************************************/
  ADC_Cmd(ADC1, ENABLE);
    
    /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConv(ADC1);
}
    
void ReadADC(void)
{
  puts("ADC Testing\r\n");
    
    while (!(rxready()))
   {
    if (ADCValues[9] != 0xFFFF)
    {
      for (int loop = 0; loop < 10; loop++)
      {
        printf("%04X ", ADCValues[loop]);
      }
      printf("\r\n");
      ADCValues[9] = 0xFFFF;
    }
  }
    
}


Outcomes