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?