STM32 DMA2A A4->RGB565

Gast #4325518
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
Angehängte Dateien:
Gast #4325764
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
Gast #4325985
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
Gast #4326221
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
Gast #4326483
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
Angehängte Dateien:
Gast #4326737
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.