Bildverzerrung, die ein VGA-Signal auf STM32 f4 mit DMA erzeugt

Ich versuche, einen Videogenerator mit dem STM32f4 (168 MHz, mit Discovery Board) + R-Leiter-DAC zum VGA-Signal zu bauen.

Die Idee ist nicht, auf einem Framebuffer zu basieren (dies würde die Auflösung und Farbtiefe einschränken, da das Board 128k RAM hat, das extern adressierbar ist, was 320x200 Doppelpuffer @ 8bpp ermöglicht), sondern einen Zeilenpuffer durch die CPU zusammenzusetzen, während der andere Zeilenpuffer ist von der DMA an den DAC gesendet werden.

Der H-Sync-Interrupt (bei etwa 30 KHz für VGA-Signale) würde:

  • Trigger-Sync-Signalerzeugung,
  • Zeilenpuffer zwischen angezeigtem und Hintergrundpuffer umschalten
  • Starten Sie den DMA auf dem "angezeigten" Zeilenpuffer
  • dann den "backbuffer" mit daten füllen/compositing machen

Diese Idee funktioniert im Moment ganz gut, außer dass ich VIEL horizontales Zittern sehe (bis zu 1/4 des Bildschirms), was dazu führt, dass vertikale Linien zeitlich stabil sind, aber horizontal stark variieren (dh überhaupt nicht vertikal sind und schlecht sind Bildverzerrung).

Ich vermute Konflikte auf dem Speicherbus, aber ich habe DMA und Interrupts die höchste Priorität gegeben. (Es müssen Speicherübertragungen stattfinden, da die Datenleitung bei jedem h-sync modifiziert wird).

(Statischer Framebuffer mit gleicher Auflösung -320x200 horizontal / vertikal wiederholt) funktioniert recht gut und hat dieses Scheren nicht, manchmal vielleicht um ein einzelnes Pixel)

Sobald ich kann, füge ich einen Screenshot hinzu.

Gibt es eine Möglichkeit, dies zu verbessern, oder werde ich durch die häufigen Speicherübertragungen zwischen CPU und RAM verdammt? Soll ich alle N Leitungen wechseln? (dh größere Puffer haben, die Anzahl der Schalter reduzieren, aber nicht die übertragene Menge?)

Soll ich die Puffer mehr trennen, damit nicht dieselbe "Speicherbank" / Zeile angefordert wird (falls so etwas existiert)? Mehrere Interrupts verwenden ? Sollte ich die CPU in den Ruhezustand versetzen, bevor der Timer unterbricht? Irgendeine Idee ?

Haben Sie Zugriff auf ein Oszilloskop, um H-Sync und V-Sync zu überprüfen?
leider nein! Danke für das Interesse, ich glaube ich habe es (siehe Antwort)

Antworten (1)

OK, ich beantworte meine eigene Frage, weil ich sie endlich verstanden habe: Die FIFO-Funktion des DMA war nicht aktiviert, sodass jede Unterbrechung oder Speicherübertragung den Zugriff auf den Speicherbus durch den DMA verzögerte.

Es ist jetzt viel besser, es zu aktivieren. Dies wurde hiermit erledigt:

// Enable FIFO (see p190 of ref manual)
DMA2_Stream1->FCR=DMA_SxFCR_DMDIS; // disable direct mode