Grüß euch
Ich bräuchte kurz Hilfe bei der Initialisierung des Triple ADC Modus des
STM32F4 inklusive DMA. Die drei ADC sollen im "regular simultaneous
mode" laufen und gleichzeitig zu einer bestimmten Zeit an drei Kanälen
messen. Das funktioniert nach der Initialisierung auch bereits, leider
jedoch nur ein einziges mal.
Führe ich die lib-Funktion "HAL_ADCEx_MultiModeStart_DMA" erneut aus, so
messen die ADCs zwar brav die Werte und füllen das zugehörige ADC_CDR
Register, doch die DMA schläft aus irgendeinem Grund und überträgt die
Werte nicht in meinen Buffer.
Seltsam ist auch, dass ich in unregelmäßigen Abständen einen overrun
interrupt seitens des ADC bekomme. Laut Datenblatt blockiert dieser
künftige DMA Übertragungen, sofern nicht neu initialisiert wird:
>To recover the ADC from OVR state when the DMA is used, follow the steps below:
>1. Reinitialize the DMA (adjust destination address and NDTR counter)
>2. Clear the ADC OVR bit in ADC_SR register
>3. Trigger the ADC to start the conversion.
Ich vermute mal, dass dies mit der nicht-funktionierenden DMA
Übertragung zusammenhängt und der Controller schlichtweg irgendwann das
OVR-Flag setzt, sofern der ADC zwar öfter gestartet wird, das
Ergebnisregister aber nie gelesen? Leider ist die Doku im reference
manual etwas dürftig und ich blick hier noch nicht wirklich durch...
Auf Grund der Länge hab ich den gesamten Initialisierungs-Code als
c-file angehängt. Im main file passiert bezüglich ADC/DMA nur noch
folgendes:
1 | uint16_t buffer[3] = {0};
|
2 |
|
3 | adc_init();
|
4 |
|
5 | while(1)
|
6 | {
|
7 | HAL_ADC_Start(&hadc2);
|
8 | HAL_ADC_Start(&hadc3);
|
9 | HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)buffer, 3);
|
10 | HAL_Delay(100);
|
11 | }
|
tia