Forum: Mikrocontroller und Digitale Elektronik STM32F429 LTDC SDRAM - Synchronisation und Timing


von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Hallo mal wieder ihr Lieben!

Ich habe ein Verständnisproblem, mit der Herangehensweise an die 
Einstellungen für die Synchronisation und des Timings des LTDCs in 
Verbindung mit dem SDRAM und DMA2D.

Folgendes:
- Alle Farbinformationen ARGB8888-"Breit",
- Das SDRAM kommt allein mit DMA2D ohne DeadTime auf 170MB/s (Reg to 
Mem)
- 7" TFT 800x480x4 @60Hz über LTDC am SDRAM angebunden

Ok, soweit ich das verstehe, blockiert DMA2D den AHB Zugriff anderer 
Peripherie -> LCD "schliert" herum. Also setze ich die DeadTime auf etwa 
150 Cycles. Bei 60Hz am LTDC gibt es immer noch Schlieren, also auf 30Hz 
gesetzt. Jetzt funktioniert der Bildaufbau augenscheinlich hervorragend.

Mal genau diesen Fall angenommen, LTDC an RAM, DMA2D von Reg nach Mem, 
wie gehe ich hier vor um eine stabile Bildwiederholrate ohne Schlieren 
zu erreichen? Meine Methode war ja "ausprobieren". Wie und wo baue ich 
die DMA2D Funktion ein? Soll diese mit VSync gezündet werden?

Vielen Dank schonmal!


Grüße
Reggie

von dasrotemopped (Gast)


Lesenswert?

800x480x24bit*60Hz benötigen 65 MB/s, Durchschnitt von Pixelclock und 
Austastlücken. Der LTDC hat Layer 0 und Layer 1, die gleichzeitig 
dargestellt werden können, verdoppeln also die benötigte Bandbreite. 
Sind beide Layer aktiv, eins abschalten, spart Speicherbandbreite.
die Bandbreite von REG2MEM ist egal, intSRAM zu extSDRAM ist wichtig.
SDRAM hat eine hohe Latenz, aber einen schnellen Burst beim Lesen großer 
Blöcke. Burst bei SDRAM aktiv ?
Bildinhalte zeilenweise in REG und intSRAM bei RGB888 berechnen und per 
DMA in das SDRAM übertragen. Besser noch mit DMA2D, Farbreduzierung 
erwägen, spart wieder Bandbreite RGB565 statt RGB888 als Framebuffer. 
Frontbuffer und Backbuffer im SDRAM anlegen, Switch bei VSYNC.

Gruß,

dasrotemopped.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

dasrotemopped schrieb:
> 800x480x24bit*60Hz benötigen 65 MB/s, Durchschnitt von Pixelclock und
> Austastlücken.
Ja, kA warum ich ARGB8888 benutzt habe, Alphachannel wird an den LCD 
(24bit LCD) ja eh nicht übertragen? Habe es jetzt auf 24bit laufen und 
60Hz. Bringe es so auf 26FPS mit DMA2D -> Kompletten neuen Hintergrund, 
und ein 100x100 Rechteck einsetzen.

dasrotemopped schrieb:
> Der LTDC hat Layer 0 und Layer 1, die gleichzeitig
> dargestellt werden können, verdoppeln also die benötigte Bandbreite.
Danke für den Tipp. Bisher habe ich nur einen Layer mit double buffering 
verwendet aber mit dem Gedanken gespielt das double buffering mit dem 
zweiten Layer zu realisieren. Absolut schwachsinniger Gedanke.

dasrotemopped schrieb:
> die Bandbreite von REG2MEM ist egal, intSRAM zu extSDRAM ist wichtig.
Ich möchte hauptsächlich AA-Text (wie du ja sicherlich schon weißt :) ) 
darstellen. Das höchste der Gefühle wird ein Logo nach dem Boot sein. 
Das darf ruhig ne weile Laden, mir ist nur wichtig, dass ich kein 
Tearing habe. Wie ich meinem DMA \ DMA2D \ CPU genau sage, dass sie nur 
während des LCD-Porchs / -Blankings in den Framebuffer schreiben sollen, 
konnte ich noch nicht herausfinden. Hast du da einen Tipp wo die Suche 
beginnen kann?

dasrotemopped schrieb:
> SDRAM hat eine hohe Latenz, aber einen schnellen Burst beim Lesen großer
> Blöcke. Burst bei SDRAM aktiv ?
FMC->SDCR2 |= FMC_Read_Burst_Enable :>
Allerdings blicke ich durch die SDRam timings kein bisschen durch. Das 
habe ich fast ausschließlich von einem Example abgetippt, da mir das zu 
dem Zeitpunkt ein bisschen viel auf einmal war. Mit DMA2D komme ich auf 
170MB/s beim Schreiben von uint32_t.

dasrotemopped schrieb:
> Bildinhalte zeilenweise in REG und intSRAM bei RGB888 berechnen und per
> DMA in das SDRAM übertragen.
Hä?! :)

dasrotemopped schrieb:
> Frontbuffer und Backbuffer im SDRAM anlegen, Switch bei VSYNC.
LTDC->SRCR = LTDC_VBReload - Damit switche ich den Buffer. Denke du 
meinst das damit?


Danke für die Hilfe mopped!

von m.n. (Gast)


Lesenswert?

Reginald L. schrieb:
> Ich möchte hauptsächlich AA-Text (wie du ja sicherlich schon weißt :) )
> darstellen.

Dann nimm doch einfach 8 Bit/Pixel und mische Dir über die CLUT ein paar 
bunte Farben zusammen: kein Problem mehr mit der Geschwindigkeit und 
wenige, aber dafür kontrastreiche Farben, die gut zu lesen sind.
Dabei hat man noch die Möglichkeit, jedem einzelnen Pixel das Blinken 
beizubringen, ohne den kompletten Text neu zu schreiben. Einfach 
zwischen zwei CLUTs zyklisch umschalten. Für mich ein absolutes Muss.

Andererseits hast Du jetzt erfahren, wo die Grenzen der Geschichte sind.

Reginald L. schrieb:
> Mit DMA2D komme ich auf
> 170MB/s beim Schreiben von uint32_t.

Dann klappt auch der Burst-Modus; anderfalls wäre die Übertragung 
deutlich langsamer. Die richtigen Experten (W.S.) schwören auf eine 32 
Bit Busanbindung bzw. sehen sie als absolutes Minimum ;-)

von dasrotemopped (Gast)


Lesenswert?

>Hä?! :)
wenn man grafiklastige Anwendungen hat kann man die DSP Funktionen (SIMD 
4x8 bit pro Farbe+Transparenz) des M4 benutzen und die 
bandbreitenschonende Farbraumkonvertierung erledigt die DMA2D 
Hardwareeinheit. Der STM32F429 ist ein kleines Multimediatalent. Wenns 
allerdings nicht in die Richtung geht ist der Tipp von m.n. richtig. 
Palettenfarben und CLUT sind dann der richtige Weg.

Gruß,

dasrotemopped.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

m.n. schrieb:
> Dann nimm doch einfach 8 Bit/Pixel
Muahaha, Willkommen im 21. Jahrhundert ;)

m.n. schrieb:
> Andererseits hast Du jetzt erfahren, wo die Grenzen der Geschichte sind.
> ...
> Die richtigen Experten (W.S.) schwören auf eine 32
> Bit Busanbindung bzw. sehen sie als absolutes Minimum ;-)
Jap, absolut! Ich habe schon ne Weile überlegt ob sich die Anschaffung 
eines Raspberry oder Ähnlichem für meine Anwendung lohnt, aber bis ich 
da durchgestiegen bin...

dasrotemopped schrieb:
> Wenns
> allerdings nicht in die Richtung geht ist der Tipp von m.n. richtig.
> Palettenfarben und CLUT sind dann der richtige Weg.
Nää, ich möchte schon bei 24bit Farben bleiben.

Nachdem ich auf RGB888 umgeschalten habe passt es ja jetzt auch von den 
Frames her. Von Tearing ist auch nichts zu sehen. Nur mit dem Blanking 
IRQ klappts nicht so wie ich möchte.

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.