Skip to main content
alexlu.29
Associate
November 5, 2009
Question

Multi channel ADC

  • November 5, 2009
  • 4 replies
  • 867 views
Posted on November 05, 2009 at 16:19

Multi channel ADC

    This topic has been closed for replies.

    4 replies

    alexlu.29
    alexlu.29Author
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:29

    Hi,

    I use STM32F103T4 for voltage monitoring. I need all 10 channels. I modified an ADC example from the lib, please see the code below:

    /* Private macro -------------------------------------------------------------*/

    #define ADC1_DR_Address ((vu32) 0x4001244C)

    /* Private variables ---------------------------------------------------------*/

    ADC_InitTypeDef ADC_InitStructure;

    DMA_InitTypeDef DMA_InitStructure;

    GPIO_InitTypeDef GPIO_InitStructure;

    vu16 ADC_ConvertedValue[10];

    /* DMA Channel1 Configuration ----------------------------------------------*/

    DMA_DeInit(DMA1_Channel1);

    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;

    DMA_InitStructure.DMA_MemoryBaseAddr = (vu32) &ADC_ConvertedValue;

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    DMA_InitStructure.DMA_BufferSize = 10;

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;

    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 DMA Channel1 */

    DMA_Cmd(DMA1_Channel1, ENABLE);

    /* ADCx Configuration (ADC1CLK = 14 MHz) -----------------------------------*/

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

    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADCx Regular Channel_0-9 Configuration */

    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_7Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_13Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_28Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_41Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_71Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_239Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9, ADC_SampleTime_1Cycles5);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10, ADC_SampleTime_7Cycles5);

    // ADC1 configuration (vref)

    ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 12, ADC_SampleTime_239Cycles5);

    /* Enable ADCx's DMA interface */

    ADC_DMACmd(ADC1, ENABLE);

    /* Enable ADCx */

    ADC_Cmd(ADC1, ENABLE);

    ADC_TempSensorVrefintCmd(ENABLE);

    /* Start ADC1 Software Conversion */

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

    while(1)

    {

    }

    My problem is only the first element of ADC_ConvertedValue[10] is updated. Could any of you point me what is missing/wrong with my code? Thanks in advance!

    Best Regards,

    Alex

    janvi
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:29

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;

    seems wrong becouse destination address needs increment

    Further, I cannot see any reason, why the STM Examples always redefine

    their own headers inside main.c

    Instead of

    #define ADC1_DR_Address ((vu32) 0x4001244C)

    try:

    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;

    [ This message was edited by: Janvi on 05-11-2009 10:49 ]

    aeolia_amha
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:29

    When I use uint32_t, there is an error saying that it is undefined

    alexlu.29
    alexlu.29Author
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:29

    Hi,

    Thanks for your help! It works fine.

    Best Regards,

    Alex