[STM32F4] ADC Triggert DMA->GPIO nicht

Gast #3369611
Lesenswert?
• ▲
▼
Hallo,

ich versuche gerade einen ADC auf dem STM32F4 Discovery zu debuggen.
Der ADC wird von einem Timer gestartet und nachdem die Konvertierung 
fertig ist werden die Daten von einem DMA abgeholt und im RAM abgelegt. 
Das scheint so weit zu funktionieren, in meinem RAM laden 8Bit Werte vom 
ADC der auf 8Bit eingestellt ist. Nur die Synchronisierung mit anderen 
Timer/GPIO Signalen scheint aber noch nicht zu funktionieren also wollte 
ich statt das ADC_DR-Register auszulesen einen GPIO (PC5) toggeln 
lassen(was auch schon funktioniert hat), allerdings bewegt sich an PC5 
nichts.

Hier mal der Code mit ADC1_DR --> RAM
1
    // Timer8 init
2
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);    //Clock enable
3
    st_Timer8Config.TIM_ClockDivision = TIM_CKD_DIV1;       //Timer1 as Master --> 500ns
4
    st_Timer8Config.TIM_Prescaler = 0u;                     //-> 500ns
5
    st_Timer8Config.TIM_Period =  1u;                       //-> 1us
6
    st_Timer8Config.TIM_CounterMode = TIM_CounterMode_Up;
7
    TIM_TimeBaseInit(TIM8, &st_Timer8Config);
8
    TIM_ARRPreloadConfig(TIM8, ENABLE);   
9
    //Timer8 is Slave of Timer1:
10
    TIM_SelectInputTrigger(TIM8, TIM_TS_ITR0);
11
    TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_External1);
12
    //ADC1 init
13
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);   //input pin = PC1
14
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
15
    st_GpioAdc.GPIO_Pin = GPIO_Pin_1;
16
    st_GpioAdc.GPIO_Mode = GPIO_Mode_AN;
17
    st_GpioAdc.GPIO_PuPd = GPIO_PuPd_NOPULL ;
18
    GPIO_Init(GPIOC, &st_GpioAdc);  
19
    st_AdcInit1.ADC_Mode = ADC_Mode_Independent;
20
    st_AdcInit1.ADC_Prescaler = ADC_Prescaler_Div2;
21
    st_AdcInit1.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
22
    st_AdcInit1.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;    //nur fue continuos mode interessant?
23
    ADC_CommonInit(&st_AdcInit1);
24
    st_AdcInit2.ADC_Resolution = ADC_Resolution_8b;
25
    st_AdcInit2.ADC_ScanConvMode = DISABLE; // 1 Channel
26
    st_AdcInit2.ADC_ContinuousConvMode = ENABLE; // Conversions Triggered
27
    st_AdcInit2.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
28
    st_AdcInit2.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_TRGO;    //Timer 8 starts conversion
29
    st_AdcInit2.ADC_DataAlign = ADC_DataAlign_Right;
30
    st_AdcInit2.ADC_NbrOfConversion = 1;
31
    ADC_Init(ADC1, &st_AdcInit2);
32
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_15Cycles); // PC1
33
    //ADC_Cmd(ADC1, ENABLE);
34
    //DMA Init       
35
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
36
    st_DMA_ADCtoRAM.DMA_Channel = DMA_Channel_0;
37
    
38
    st_DMA_ADCtoRAM.DMA_PeripheralBaseAddr = (uint32_t)ADC1_BASE + 0x4C;  //0x4C = Dataregister Offset
39
    st_DMA_ADCtoRAM.DMA_Memory0BaseAddr = (uint32_t)au32_ADCresult_Buffer1;
40
    st_DMA_ADCtoRAM.DMA_DIR = DMA_DIR_PeripheralToMemory;
41
    st_DMA_ADCtoRAM.DMA_BufferSize = 24;
42
    
43
    /*
44
    st_DMA_ADCtoRAM.DMA_PeripheralBaseAddr = (uint32_t)GPIOC_BASE + 0x18; // 0x18 = BSRR-Register Offset    
45
    st_DMA_ADCtoRAM.DMA_Memory0BaseAddr =    (uint32_t)au32_TestOut;
46
    st_DMA_ADCtoRAM.DMA_DIR = DMA_DIR_MemoryToPeripheral;
47
    st_DMA_ADCtoRAM.DMA_BufferSize = 2;
48
    */
49
    st_DMA_ADCtoRAM.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
50
    st_DMA_ADCtoRAM.DMA_MemoryInc = DMA_MemoryInc_Enable;
51
    st_DMA_ADCtoRAM.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
52
    st_DMA_ADCtoRAM.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
53
    st_DMA_ADCtoRAM.DMA_Mode = DMA_Mode_Circular;
54
    st_DMA_ADCtoRAM.DMA_Priority = DMA_Priority_Low;
55
    st_DMA_ADCtoRAM.DMA_FIFOMode = DMA_FIFOMode_Disable;
56
    st_DMA_ADCtoRAM.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
57
    st_DMA_ADCtoRAM.DMA_MemoryBurst = DMA_MemoryBurst_Single;
58
    st_DMA_ADCtoRAM.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
59
    DMA_Init(DMA2_Stream0, &st_DMA_ADCtoRAM);
60
    
61
    DMA_Cmd(DMA2_Stream0, ENABLE);    
62
    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
63
    ADC_DMACmd(ADC1, ENABLE);
64
    ADC_Cmd(ADC1, ENABLE);
65
    ADC_SoftwareStartConv(ADC1);
66
    TIM_Cmd(TIM8, ENABLE);

Und hier der Code abgeändert auf GPIO toggeln:
1
    au32_TestOut[0] = TESTHIGH;
2
    au32_TestOut[1] = TESTLOW;
3
    // Timer8 init
4
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);    //Clock enable
5
    st_Timer8Config.TIM_ClockDivision = TIM_CKD_DIV1;       //Timer1 as Master --> 500ns
6
    st_Timer8Config.TIM_Prescaler = 0u;                     //-> 500ns
7
    st_Timer8Config.TIM_Period =  1u;                       //-> 1us
8
    st_Timer8Config.TIM_CounterMode = TIM_CounterMode_Up;
9
    TIM_TimeBaseInit(TIM8, &st_Timer8Config);
10
    TIM_ARRPreloadConfig(TIM8, ENABLE);   
11
    //Timer8 is Slave of Timer1:
12
    TIM_SelectInputTrigger(TIM8, TIM_TS_ITR0);
13
    TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_External1);
14
    //ADC1 init
15
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);   //input pin = PC1
16
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
17
    st_GpioAdc.GPIO_Pin = GPIO_Pin_1;
18
    st_GpioAdc.GPIO_Mode = GPIO_Mode_AN;
19
    st_GpioAdc.GPIO_PuPd = GPIO_PuPd_NOPULL ;
20
    GPIO_Init(GPIOC, &st_GpioAdc);  
21
    st_AdcInit1.ADC_Mode = ADC_Mode_Independent;
22
    st_AdcInit1.ADC_Prescaler = ADC_Prescaler_Div2;
23
    st_AdcInit1.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
24
    st_AdcInit1.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;    //nur fue continuos mode interessant?
25
    ADC_CommonInit(&st_AdcInit1);
26
    st_AdcInit2.ADC_Resolution = ADC_Resolution_8b;
27
    st_AdcInit2.ADC_ScanConvMode = DISABLE; // 1 Channel
28
    st_AdcInit2.ADC_ContinuousConvMode = ENABLE; // Conversions Triggered
29
    st_AdcInit2.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
30
    st_AdcInit2.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_TRGO;    //Timer 8 starts conversion
31
    st_AdcInit2.ADC_DataAlign = ADC_DataAlign_Right;
32
    st_AdcInit2.ADC_NbrOfConversion = 1;
33
    ADC_Init(ADC1, &st_AdcInit2);
34
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_15Cycles); // PC1
35
    //ADC_Cmd(ADC1, ENABLE);
36
    //DMA Init       
37
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
38
    st_DMA_ADCtoRAM.DMA_Channel = DMA_Channel_0;
39
    /*
40
    st_DMA_ADCtoRAM.DMA_PeripheralBaseAddr = (uint32_t)ADC1_BASE + 0x4C;  //0x4C = Dataregister Offset
41
    st_DMA_ADCtoRAM.DMA_Memory0BaseAddr = (uint32_t)au32_ADCresult_Buffer1;
42
    st_DMA_ADCtoRAM.DMA_DIR = DMA_DIR_PeripheralToMemory;
43
    st_DMA_ADCtoRAM.DMA_BufferSize = 24;
44
    */
45
    
46
    st_DMA_ADCtoRAM.DMA_PeripheralBaseAddr = (uint32_t)GPIOC_BASE + 0x18; // 0x18 = BSRR-Register Offset
47
    st_DMA_ADCtoRAM.DMA_Memory0BaseAddr =    (uint32_t)au32_TestOut;
48
    st_DMA_ADCtoRAM.DMA_DIR = DMA_DIR_MemoryToPeripheral;
49
    st_DMA_ADCtoRAM.DMA_BufferSize = 2;
50
    
51
    st_DMA_ADCtoRAM.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
52
    st_DMA_ADCtoRAM.DMA_MemoryInc = DMA_MemoryInc_Enable;
53
    st_DMA_ADCtoRAM.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
54
    st_DMA_ADCtoRAM.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
55
    st_DMA_ADCtoRAM.DMA_Mode = DMA_Mode_Circular;
56
    st_DMA_ADCtoRAM.DMA_Priority = DMA_Priority_Low;
57
    st_DMA_ADCtoRAM.DMA_FIFOMode = DMA_FIFOMode_Disable;
58
    st_DMA_ADCtoRAM.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
59
    st_DMA_ADCtoRAM.DMA_MemoryBurst = DMA_MemoryBurst_Single;
60
    st_DMA_ADCtoRAM.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
61
    DMA_Init(DMA2_Stream0, &st_DMA_ADCtoRAM);
62
    
63
    DMA_Cmd(DMA2_Stream0, ENABLE);    
64
    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
65
    ADC_DMACmd(ADC1, ENABLE);
66
    ADC_Cmd(ADC1, ENABLE);
67
    ADC_SoftwareStartConv(ADC1);
68
    TIM_Cmd(TIM8, ENABLE);

Hat jemand eine Idee was schief geht?

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.