STM32F103 ADC+DMA kein EOC

OP #3031003
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.