Forum: Mikrocontroller und Digitale Elektronik STM32F4 DMA Performance


von Andreas A. (Firma: Embedded Microtec) (andi) Flattr this


Lesenswert?

Hallo,

ich habe hier folgende Anwendung, die ich gerne realisieren möchte. Und 
zwar möchte ich gerne einen linearen CCD Sensor mit einem STM32F4 
Controller auslesen. Die Ansteuerung des CCD Sensors ist ansich kein 
Problem. Die analogen Daten werden rausgeclockt und per externen dual 
8-bit ADC digital gewandelt. Der ADC gibt mit der steigenden Clock 
Flanke den Wert des ersten Analogwertes aus und mit der fallenden Flanke 
den Wert des zweiten Wertes (gibt CCD Sensoren, die bei jedem Clock 2 
Analogsignale ausgeben).
Ich möchte nun das rausclocken per Timer realisieren und bei jeder 
Periode einen DMA Transfer starten, der die ADC Daten von einem GPIO 
Port einliest. Da das ganze sehr schnell passieren soll (ca. 20 MHz 
Clock) muss der DMA Transfer innerhalb von 25ns (halbe Periode, da in 
der zweiten Periode bereits andere Daten vom ADC anliegen) abgeschlossen 
sein. In der zweiten Periode sollte eigentlich auch noch ein DMA 
Transfer stattfinden. D.h. 2 x 8bit x 20MHz = 320MBit/s. Ist das 
überhaupt möglich mit einem STM32F4?

Die eigentliche Frage ist, ob man eine maximale Zugriffszeit für den DMA 
Transfer angeben kann? Für den STM32F103 gibt es eine App Note mit der 
Anzahl von Clockzyklen für den DMA Zugriff. Gibt es das für den Cortex 
M4 auch?

Danke schonmal,
Andreas

von Janvi (Gast)


Lesenswert?

zwischen M3 und M4 dürfte ausser der Taktfrequenz an diesem Punkt kein 
Unterschied sein. Das Problem ist der externe AD wo du ja einen 
(langsamen) 8 bit Port als Eingang brauchst. Soweit ich weis, beziehen 
sich die DMA Quellen oder Ziele immer auf (interne) Peripherieregister 
weil du ja gar keinen externen Datenbus hast (?)

von Andreas A. (Firma: Embedded Microtec) (andi) Flattr this


Lesenswert?

Genau, der externe AD Converter liefert mir die Daten als 8-bit Wort an 
einem Port und den müsste ich einlesen (einmal bei steigender und einmal 
bei fallender Flanke meines Clock Signals). Die Ports sind beim M4 laut 
Datenblatt aber am AHB Bus, der mit den vollen 168MHz geclockt wird, was 
denke ich beim M3 noch nicht so ist (hab ich aber nicht nachgesehen).

Die App Note über den DMA vom M3 AN2548 
(http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00160362.pdf?s_searchtype=keyword) 
sagt, dass die Service Time per DMA Kanal folgendermaßen aussieht:
wobei
t_A      ... 2 AHB clock cylces arbitration time
t_{Acc}  ... access time (1 AHB clock bus matrix arbitration + 2 APB 
clocks effective data transfer + 1 AHB clocks bus synchronization)
t_{SRAM} ... SRAM read/write time (1 AHB clock bus matrix + 1 AHB clock 
single read/write)

Ich würde das so verstehen, dass der DMA beim M3 zumindest 3 AHB clocks 
+ 2 APB clocks benötigt, bis die Daten vom Port eingelesen wurden. Wenn 
die GPIOs beim M4 am AHB Bus dran sind dann nehm ich mal an, dass 
mindestens 4 AHB clocks notwendig wären, was eine minimale Verzögerung 
von 4 AHB Clocks oder ca. 24ns@168MHz bedeuten würde. Das wäre für mich 
schon das absolute Maximum. Da dürfte dann bei der Arbitrierung des 
Busses keine Verzögerung mehr enstehen was man so aber glaub ich auch 
nicht unbedingt garantieren kann, oder??

Ist meine Überlegung richtig, oder seh ich das ganz falsch?

Danke,
Andreas

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.