Skip to main content
pavan2
Associate
January 29, 2009
Question

Unable to get ADC INTERRUPT

  • January 29, 2009
  • 16 replies
  • 2390 views
Posted on January 29, 2009 at 03:20

Unable to get ADC INTERRUPT

    This topic has been closed for replies.

    16 replies

    jgalea
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:00

    Hello, I have a similar problem. Im trying to convert the ADCs with DMA but Im having no DMA interrupt. Not sure if the ADC is working. I also posted in the forum:

    http://www.st.com/mcu/forums-cat-7896-23.html

    . I also sent a technical question to ST as I still did not have a reply from the forum. If a get a technical answer from ST, I will send it to you. Thanks Johann

    pavan2
    pavan2Author
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:00

    i am trying to get ADC reading in interrupt.i have kept adc in continuous conversion mode, with EOC interrupt enabled.

    i assumed that i should get interrupt after each EOC from where i can then collect the ADC reading.

    but i have been unable to get any interrupt from ADC.

    i checked the ADC by polling, where i get correct the reading.

    i am using RIDE 7 with GCC. and ST library functions.

    NVIC CONFIGURATION

    NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQChannel;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

    ADC CONFIGURATION

    GPIO_InitTypeDef GPIO_InitStructure;

    ADC_InitTypeDef ADC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    ADC_InitStructure.ADC_ScanConvMode = DISABLE;

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    ADC_InitStructure.ADC_NbrOfChannel = 1;

    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1,ADC_SampleTime_239Cycles5);

    ADC_Cmd(ADC1, ENABLE);

    ADC_ResetCalibration(ADC1);

    while(ADC_GetResetCalibrationStatus(ADC1)!= RESET);

    ADC_StartCalibration(ADC1);

    while(ADC_GetCalibrationStatus(ADC1) != RESET);

    interrupt handler

    void ADC1_2_IRQHandler(void)

    {

    if(ADC_GetITStatus(ADC1, ADC_IT_EOC) != RESET)

    {

    ADC_TEMP1 = ADC_GetConversionValue(ADC1)&0x0FFF;

    }

    }

    i trigger ADC using

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

    after this i assume i should get interrupt on each conversion.

    i guess i am missing something.

    but dont know what.

    thanks in advance.

    pavan k

    [ This message was edited by: pavan.karmakar on 28-01-2009 06:38 ]

    jgalea
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:00

    Hello, I have a similar problem. Im trying to convert the ADCs with DMA but Im having no DMA interrupt. Not sure if the ADC is working. I also posted in the forum:

    http://www.st.com/mcu/forums-cat-7896-23.html

    . I also sent a technical question to ST as I still did not have a reply from the forum. If a get a technical answer from ST, I will send it to you. Thanks Johann

    pavan2
    pavan2Author
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:00

    i am right now trying to get the ADC working using DMA, i will update on successful implementation.

    thank you

    pavan k

    jgalea
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:00

    Hello. I still have no answer from St technical support. In the meantime Im working to fix the line. I will notify you. thanks. To tell you the truth, I ran out of ideas, as followed examples. Im feeling in the corner :)

    jgalea
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:01

    Hello. Thanks for the code. Unluckily the DMA did not occur in mine. Please, was the ADC1_DR_Address set as ((u32)0x40012444C)?. Please how was ADCConvertedValue decalred? Thanks Johann

    jgalea
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 13:01

    Hello. Im going to try it now and notify you many thanks Johann

    sofiene
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:01

    Hi jgalea;

    I have the following code that works correctly (ADC-DMA):

    int main(void)

    {

    #ifdef DEBUG

    debug();

    #endif

    /* System clocks configuration ---------------------------------------------*/

    RCC_Configuration();

    /* NVIC configuration ------------------------------------------------------*/

    NVIC_Configuration();

    /* GPIO configuration ------------------------------------------------------*/

    GPIO_Configuration();

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

    DMA_DeInit(DMA1_Channel1);

    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;

    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCConvertedValue;

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    DMA_InitStructure.DMA_BufferSize = NumberOfSample;

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

    /* Enable DMA Transfer complete interrupt */

    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);

    /* 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 = 1;

    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 regular channel14 configuration */

    ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_1Cycles5);

    /* Enable ADC1 DMA */

    ADC_DMACmd(ADC1, ENABLE);

    /* Enable ADC1 */

    ADC_Cmd(ADC1, ENABLE);

    /* Enable ADC1 reset calibaration register */

    ADC_ResetCalibration(ADC1);

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

    while(ADC_GetResetCalibrationStatus(ADC1));

    /* Start ADC1 calibaration */

    ADC_StartCalibration(ADC1);

    /* Check the end of ADC1 calibration */

    while(ADC_GetCalibrationStatus(ADC1));

    /* Start ADC1 Software Conversion */

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

    while (1)

    {

    if (PrintFlag == 1)

    {

    printf(''%d\n'',ADC_Average);

    PrintFlag = 0;

    }

    }

    //////////////// DMA IRQ routine //////////////////////

    void DMA1_Channel1_IRQHandler(void)

    {

    for (n=0; n

    {

    ADC_Sum = ADC_Sum + ADCConvertedValue[n];

    }

    ADC_Average = ADC_Sum/NumberOfSample;

    ADC_Sum=0;

    PrintFlag = 1;

    DMA_ClearFlag(DMA1_FLAG_TC1);

    }

    }

    //////////////// NVIC config //////////////////////

    void NVIC_Configuration(void)

    {

    NVIC_InitTypeDef NVIC_InitStructure;

    #ifdef VECT_TAB_RAM

    /* Set the Vector Table base location at 0x20000000 */

    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

    #else /* VECT_TAB_FLASH */

    /* Set the Vector Table base location at 0x08000000 */

    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

    #endif

    /* Setting the priority grouping bits length */

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    /* Enable the DMA global Interrupt */

    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQChannel;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    }

    sofiene
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:01

    If you want to get one simple, replace 50 by 1.

    I used 50 value to compute the average of 50 simples.

    M3allem

    sofiene
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:01

    First I'm M3allem and not Johann :);

    Sorry I missed some declaration in my code:

    #define ADC1_DR_Address ((u32)0x4001244C)

    #define NumberOfSample 50

    u16 ADCConvertedValue[NumberOfSample];

    B.R.

    M3allem