Forum: Mikrocontroller und Digitale Elektronik [STM32F4] ADC Triggert DMA->GPIO nicht


von stfanboy (Gast)


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?

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.