Forum: Mikrocontroller und Digitale Elektronik STM32F103 ADC+DMA kein EOC


von Ingo S. (ingo-s)


Lesenswert?

Hi,
steige gerade auf den STM32 um und Teste den ADC im Scan Modus mit einem 
modifiziertem Beispiel Code.
Die ADC Wandlung funktioniert einwandfrei, die 9 Werte werden im Array 
abgelegt, aber nach der Wandlung ist das EOC bit im Statusregister nicht 
gesetzt bzw. ich kann nicht in einer Schleife auf das Ende des Scanns 
deswegen warten.

//---
// In Main nach anderen Inits:

    // DMA clock
    RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE ) ;
    DMA_InitStructure.DMA_BufferSize = 9;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCBuffer;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
    DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_Cmd ( DMA1_Channel1 , ENABLE ) ;
//
    RCC_ADCCLKConfig ( RCC_PCLK2_Div6 ) ;
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_ADC1 ,
    ENABLE ) ;

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_NbrOfChannel = 9;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, 
ADC_SampleTime_28Cycles5);
    ....
    ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 9, 
ADC_SampleTime_28Cycles5);
    ADC_Cmd ( ADC1 , ENABLE ) ;
    ADC_DMACmd ( ADC1 , ENABLE ) ;
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    ADC_SoftwareStartConvCmd ( ADC1 , ENABLE ) ;

//---------------------------------------------------------------
// die Main Testschleife:

  while(1)
    {
    link_Usample.new_data = ADCBuffer[0]<<1;
    link_Temperatur.new_data  = ADCBuffer[1]<<1;
    link_TemperaOpt.new_data  = ADCBuffer[2]<<1;

    GPIO_WriteBit(TEST_PORT,TEST_PIN,Bit_SET);
    ADC_SoftwareStartConvCmd ( ADC1 , ENABLE ) ;
    //while ((ADC1->SR & ADC_FLAG_EOC) == 0 );
    GPIO_WriteBit(TEST_PORT,TEST_PIN,Bit_RESET);

    int i;
    GPIO_WriteBit(LED_PORT,LED_PIN,Bit_SET);
    for (i=0;i<100000;i++);
    GPIO_WriteBit(LED_PORT,LED_PIN,Bit_RESET);
    for (i=0;i<100000;i++);

    }
}

//---

Wenn ich einen Breakpoint nach der ersten Delay Schleife setze und das 
ADC SR prüfe, ist EOC immer noch nicht gesetzt.
Im Manual steht für das Control Register eins aber:

Bit 8 SCAN: Scan mode
This bit is set and cleared by software to enable/disable Scan mode. In 
Scan mode, the
inputs selected through the ADC_SQRx or ADC_JSQRx registers are 
converted.
0: Scan mode disabled
1: Scan mode enabled
Note: An EOC or JEOC interrupt is generated only on the end of 
conversion of the last
channel if the corresponding EOCIE or JEOCIE bit is set

(Den EOC interrupt habe ich auch probiert, da das EOC Bit nicht gesetzt 
wird, kam der natürlich auch nicht.)
So das ich von einem Fehler meinerseits ausgehe, nur welcher?

Gruß Ingo

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.