STM32 DMA2A A4->RGB565

Gast #4325518
Hallo,

ich versuche beim Stm32f4-discoveryboard mit dem Grafikbeschleuniger ein 
Zeichen, das im Format A4 vorliegt auf's Display zu bringen. Leider wird 
nur ein Quadrat angezeigt (sh. erstes Bild).

in Main wird MX_DMA2D_Init() aufgerufen:
1
void MX_DMA2D_Init(void)
2
{
3
    hdma2d.Instance = DMA2D;
4
    hdma2d.Init.Mode = DMA2D_M2M_PFC;
5
    hdma2d.Init.ColorMode = DMA2D_RGB565;
6
    hdma2d.Init.OutputOffset = 0;
7

8
    hdma2d.LayerCfg[1].InputOffset = 0;
9
    hdma2d.LayerCfg[1].InputColorMode = CM_A4;
10
//    hdma2d.LayerCfg[1].InputColorMode = CM_L4;
11

12
    hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
13
    hdma2d.LayerCfg[1].InputAlpha = 0x80ff80ff;
14

15
          HAL_DMA2D_Init(&hdma2d);
16
          HAL_DMA2D_ConfigLayer(&hdma2d, 1);
17
}

Zum Anzeigen des Zeichens wird dann der DMA2D gestartet:
1
void dma_show_digit (uint8_t digit) {
2

3
  uint32_t source;
4

5
  source = (uint32_t) &bigfont_dma[0];
6

7
  HAL_DMA2D_Start_IT(&hdma2d, source, (uint32_t) g_cursor, 64, 78);
8

9
}

Wenn ich als Eingangs-Farbmode L4 einstelle, wird das Zeichen (mit einer 
zufälligen?) Farbtabelle angezeigt. Das zeigt mir, das zumindest die 
Adresseinstellungen richtig sind. Das aktuelle HAL-Paket (V1.9.0) habe 
ich schon installiert. Bringt keine Änderung.

Kann mir jemand sagen, was ich beim Farbmode A4 falsch mache?

Vielen Dank,
Markus
Angehängte Dateien:
Gast
Markus schrieb:
>Kann mir jemand sagen, was ich beim Farbmode A4 falsch mache?
Das Handbuch sagt:
For the specific alpha mode A4 and A8, no color information is stored 
nor indexed. The color
to be used for the image generation is fixed and is defined in the 
DMA2D_FGCOLR for
foreground pixels and in the DMA2D_BGCOLR register for background 
pixels.

Bei dir sind die Farben nicht gesetzt.

 m.f.G.
Dieter
Gast
Die fgcolor wird durch hal gesetzt.
Der entsprechende Wert wird aus LayerCfg[1].InputAlpha geholt (ist also 
auf 0x80ff80ff gesetzt).
Das steht so in der HAL Doku und lässt sich auch nachvollziehen: ich 
kann die Farbe des "Rechtecks" über InputAlpha beeinflussen.

Trotzdem Danke für den Hinweis.

Markus
Gast
Die Einstellung der Hintergrundfarbe könnte noch falsch sein. Werd ich 
mir morgen im Büro mal ansehen, aber ich meine, die war auf 0x00 (hab 
sie ja auch nie verstellt).
Gast
Markus schrieb:
>Die fgcolor wird durch hal gesetzt.
Stimmt ,das steht auch so in den Quellen.
Dann käme noch die Blender Baugruppe in Betracht.
Da steht im Handbuch:
The blending is performed according to the following equation:
            aFG*aBG
aMult=------------
               255

aOUT=aFG+aBG-aMult

             cFG*aFG+cBG*aBG-cBG*aMult
cOUT=------------------------------------------
                                aOUT

wenn nun im Modus DMA2D_M2M_PFC  aBG Null gesetzt ist käme

c(olor)OUT=c(olor) FG  raus

probier mal DMA2D_M2M_BLEND als Modus.

m.f.G.
Dieter
Gast
Guten Morgen,

es scheint wohl wirklich ein Problem mit der Hintergrundfarbe zu geben. 
Ich habe folgendes ausprobiert:

1. Das einfache Ändern der Hintergrundfarbe (im Register BGCOLR) auf 
einen Wert>0 bringt keine Änderung. Der Alpha-Teil (aBG) darf lt. 
Handbuch nicht geändert werden (und kann auch nicht geändert werden).

2. Wenn ich als Modus DMA2D_M2M_BLEND einstelle kommt das Ergebnis lt. 
Bild1 raus. Ich denke, es wird das Zeichen mit dem (nicht 
konfiguriertem) Speicherbereich der zweiten Source verblendet:
1
void MX_DMA2D_Init(void)
2
{
3
    hdma2d.Instance = DMA2D;
4
    hdma2d.Init.Mode = DMA2D_M2M_BLEND;//DMA2D_M2M_PFC;
5
    hdma2d.Init.ColorMode = DMA2D_RGB565;
6
    hdma2d.Init.OutputOffset = 0;
7

8
    hdma2d.LayerCfg[1].InputOffset = 0;
9
    hdma2d.LayerCfg[1].InputColorMode = CM_A4;//CM_L4;
10
    hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
11
    hdma2d.LayerCfg[1].InputAlpha = 0xff0000;
12

13
    hdma2d.LayerCfg[0].InputOffset = 0;
14
    hdma2d.LayerCfg[0].InputColorMode = CM_A4;
15
    hdma2d.LayerCfg[0].AlphaMode = DMA2D_NO_MODIF_ALPHA;
16
    hdma2d.LayerCfg[0].InputAlpha = 0x000000;
17

18
    HAL_DMA2D_Init(&hdma2d);
19
    HAL_DMA2D_ConfigLayer(&hdma2d, 1);
20
    HAL_DMA2D_ConfigLayer(&hdma2d, 0);
21
}

3. Wenn ich den DMA2D mit der richtigen Funktion für's überblenden 
starte, kommt Bild2 raus.
1
//HAL_DMA2D_Start_IT(&hdma2d, source, (uint32_t) g_cursor, 64, 78);
2
HAL_DMA2D_BlendingStart_IT(&hdma2d, source,  source, (uint32_t) g_cursor, 64, 78);


Wäre der Hintergrund nicht weiss, dann würd ich sagen das Ergebnis 
passt.

Wo liegt der Fehler?

Markus
Angehängte Dateien:
Gast
Markus schrieb:
>Wo liegt der Fehler?
Schau dir mal die DMA2D register im Debugger an. Background und 
Zieladdresse müssen gleich sein.

m.f.G.
Dieter
Gast
Dieter Graef schrieb:
> Background und
> Zieladdresse müssen gleich sein.

Ja, so klappt es.

Ich Blende damit also das Zeichen mit dem jetzt schon im Framebuffer 
vorhandenen Daten.
Neben der Backgroundaddresse muss dann auch der Colormode 
(LayerCfg[0].InputColorMode=CM_RGB565) und auch das Offsetregister 
(BGOR=OOR) wie im Framebuffer gesetzt werden.

Ist ein ziemlicher Workaround, klappt aber.

Vielen Dank für die Unterstützung,

Markus

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.