Forum: Mikrocontroller und Digitale Elektronik STM32 DMA2A A4->RGB565


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

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

von Dieter Graef (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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).

von Dieter Graef (Gast)


Lesenswert?

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

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

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

von Dieter Graef (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

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.