Forum: Mikrocontroller und Digitale Elektronik emWin Display-Anbindung an STM32F4


von Jörg S. (joerg_s)


Lesenswert?

Hallo,

ich möchte ein Display mit ILITEK LCD-Controller an einem STM32F4 mit 
Segger emWin betreiben.

Das Display ist über das RGB-Interface angeschlossen und mittels CubeMX 
wurde das TFT-Interface hinzugefügt.

Nun Habe ich in emWin den Display-Treiber für den ILITEK ausgewählt und 
versuche ein "Hello World" auf dem Display auszugeben.

Beim GUI_Init lande ich in der Callback-Funktion LCD_X_Displaydriver.
Kann mir jemand einen Startpunkt geben, wie ich den LCD-Controller 
mittels RGB-Mode in Gang bekomme?

Ich stehe da grad etwas auf dem Schlauch.

Ich weiss auch, dass das sehr allgemein ist, aber ich will ja keinen 
Code, sondern nur einen Tip, welche SChritte ich tun muss, damit emWin 
mit dem RGB-Interfcae zusammen mit dem LCD-Controller läuft.

Danke im Voraus!

von W.S. (Gast)


Lesenswert?

Ja, sag mal, kannst du immer nur mit Bauklötzchen spielen?

Was beinhaltet denn dieses Seggersche Paket EmWin - weißt du das? Hast 
du dir die Doku zu EmWin gründlich durchgelesen? Ist dir klar, daß ein 
Paket aus Widgets, Windows und Renderer auf ein grafisches System 
aufsetzt, das DU DU DU liefern mußt? Hast du dir ein zu deiner 
Hardware passendes grafisches System geschrieben und ausprobiert?

W.S.

von Jörg S. (joerg_s)


Lesenswert?

Ja das ist mir klar und genau da liegt ja meine Frage. Das hat jetzt 
nichts mit Bauklötzchen zu tun. Ich habe mir auch schon in den Samples 
die Implementierung für das 16 Bit Interface angesehen und verstehe 
auch, was da passiert. Nur komme ich irgendwie mit dem RGB Interface und 
der Hardware-Initialisierung aus CubeMX nicht weiter.

Aber da ich schon häufiger mitgelesen habe, war mir klar, dass auch 
solche Antworten kommen müssen...

von e-bert (Gast)


Lesenswert?

Hi!

Dass Du die entsprechenden Zugriffe der emWin auf die Portpins umsetzen 
musst, dürfte klar sein. Auch die Reset- und ChipSelect-Leitung nicht 
vergessen.

Dann kommt allerdings irgendwann der Punkt, wo die emWin die 
Intialisierung des LCD-Controllers auf Dich abwälzt. Da musst Du dann im 
Datenblatt des Displays nachschauen. Da sollte eine 
Initialisierungs-Sequenz vorhanden sein. (Befehle / evtl Delays 
dazwischen)
Warum im Display-Datenblatt nachschauen und nicht im Datenblatt des 
Controllers? Weil es darauf ankommt, wie der Display-Hersteller das Ding 
verbaut hat. (Boost-Kondensatoren usw usf... Da gibt es viele 
Möglichkeiten - die richtige zufällig zu erwischen ist quasi 
aussichtslos.)

Grüsse!

von W.S. (Gast)


Lesenswert?

Jörg S. schrieb:
> Das hat jetzt
> nichts mit Bauklötzchen zu tun

Oh doch!

Was macht denn so ganz konkret die "Hardware-Initialisierung aus 
CubeMX"? Hast du das wirklich verstanden, was da abgeht oder zumindest 
abgehen sollte?

Soweit ich das sehe, ist zumindest einer der Ilitek-Controller ein 
gemixter Controller, der sowohl 18 Bit (6+6+6) RGB nebst DOTCLOCK, DE, 
HSYNC, VSYNC als auch Portbetrieb via /CS, /WR, /RD, D/C versteht.

Du mußt dich also wirklich zu allererst in die Doku zum TFT-Controller 
und zu deinem konkreten Display einlesen. Dann mußt du dich in die Doku 
zum betreffenden STM32 einlesen und entscheiden, auf welche Weise das 
Display überhaupt an diesem Controller betrieben werden soll. Wenn es 
im Portbetrieb sein soll (oder muß), dann wäre es völlig verkehrt, es am 
eingebauten TFT-Controller betreiben zu wollen. Andernfalls, wenn es im 
passiven Mode per 16 oder 18 Bit RGB betrieben werden sollte, dann mußt 
du den erforderlichen RAM vorhalten und den im STM32 eingebauten TFT 
Controller richtig aufsetzen.

Merkst du jetzt, daß es eben nicht wirklich ausreicht, in irgend einem 
CubeXYZ ein Häkchen zu setzen?

W.S.

von Jörg S. (joerg_s)


Lesenswert?

Kurze Frage..
ist es normal, dass ich nach dem LTDC-Init einmalig einen FIFO_Underrun 
Interrupt bekomme und danach nicht mehr?
Das soll ja passieren, wenn der Framebuffer zu klein ist. den hab ich 
jedoch mit 320*240*2 angelegt und dem InitStruct übergeben.

Die HSYNC,VSYNC, DE und PIXELCLOCK Signale sehen am Oskar gut aus.
ich bekomme aber trotzdem nix aufs Display.

den ILITEK Controller hab ich nach Datenblatt über das 3Wire Serial 
Interface auf RGB und Modus RGB565 konfiguriert. Ich weiss nur momentan 
nicht obs an der Init-Sequenz des ILITEK oder an dem LTDC liegt, dass 
ich nix sehe.

BTW, das Display ändert sich nach der INIT-Sequenz. Vorher sieht man das 
Backlight weiss durchscheinen, danach wird das Bild grau....

Es ist dabei egal, was ich in den Framebuffer schreibe.

von Jörg S. (joerg_s)


Lesenswert?

Hallo,

anbei mal meine Initialisierung:

Framebuffer:
1
U32 aMemory[(320*240*2)/4];

Init LTDC
1
  hltdc.Instance = LTDC;
2
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
3
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
4
  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
5
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
6
  hltdc.Init.HorizontalSync = 9;
7
  hltdc.Init.VerticalSync = 1;
8
  hltdc.Init.AccumulatedHBP = 29;
9
  hltdc.Init.AccumulatedVBP = 3;
10
  hltdc.Init.AccumulatedActiveW = 349;
11
  hltdc.Init.AccumulatedActiveH = 243;
12
  hltdc.Init.TotalWidth = 359;
13
  hltdc.Init.TotalHeigh = 257;
14
  hltdc.Init.Backcolor.Blue = 0;
15
  hltdc.Init.Backcolor.Green = 0;
16
  hltdc.Init.Backcolor.Red = 0;
17
  HAL_LTDC_Init(&hltdc);
18
19
  pLayerCfg.WindowX0 = 30;
20
  pLayerCfg.WindowX1 = 350;
21
  pLayerCfg.WindowY0 = 3;
22
  pLayerCfg.WindowY1 = 243;
23
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
24
  pLayerCfg.Alpha = 0x0;
25
  pLayerCfg.Alpha0 = 0x0;
26
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
27
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
28
  pLayerCfg.FBStartAdress = (uint32_t)aMemory;
29
  pLayerCfg.ImageWidth = 320;
30
  pLayerCfg.ImageHeight = 240;
31
  pLayerCfg.Backcolor.Blue = 0;
32
  pLayerCfg.Backcolor.Green = 0;
33
  pLayerCfg.Backcolor.Red = 0;
34
  HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0);

Init Sequenz ILI9342C wie ich sie aus dem Datenblatt verstanden hab
1
//************* Start Initial Sequence **********//
2
    send_ctrl_cmd(0x01);     //SoftwareReset
3
     HAL_Delay(10);
4
     
5
     send_ctrl_cmd(0xD9);     //Get External Register for SPI
6
     send_data_cmd(0x10);  //(D7:0, D6:0, D5:0, D4[ENSPI]:1, SPIEXTORD[D3:0, D2:0, D1:0, D0:0]) 
7
     
8
    send_ctrl_cmd(0x20);     //Display Inversion OFF
9
    
10
    send_ctrl_cmd(0x3A);     //COLMOD PixelFormat Set //RGB565
11
     send_data_cmd(0x55);  //(D7:0, D[6:4]:101, D3:0, D[2:0]:101) 
12
    
13
    send_ctrl_cmd(0x51);     //Write Display Brightness
14
     send_data_cmd(0xFF);  //(FF=maxBrightness) 
15
    
16
    send_ctrl_cmd(0x53);     //Write CTRL Display
17
     send_data_cmd(0x24);  //(D7:0, D6:0, D5:1, D4:0, D3:0, D2:1, D1:0, D0:0) 
18
     
19
    send_ctrl_cmd(0xB0);     //RGB Interface Signal Control
20
     send_data_cmd(0x40);  //(D7:0, RCM[D6:1, D5:0], D4:0, D3:0, D2:0, D1:0, D0:0) //RGB 16Bit 65K
21
     
22
    send_ctrl_cmd(0xB4);     //Display Inversion Control
23
     send_data_cmd(0x00);  //(D7:0, D6:0, D5:0, D4:0, D3:0, D2:0, DINV[D1:0, D0:0]) 
24
     
25
     
26
 
27
    send_ctrl_cmd(0xB5);     //Blanking Porch Control
28
     send_data_cmd(0x02);  //(D7:0, VFP[D6:0, D5:0, D4:0, D3:0, D2:0, D1:1, D0:0]) 
29
     send_data_cmd(0x02);  //(D7:0, VBP[D6:0, D5:0, D4:0, D3:0, D2:0, D1:1, D0:0]) 
30
     send_data_cmd(0x0A);  //(D7:0, HFP[D6:0, D5:0, D4:0, D3:1, D2:0, D1:1, D0:0]) 
31
     send_data_cmd(0x14);  //(D7:0, HBP[D6:0, D5:0, D4:1, D3:0, D2:1, D1:0, D0:0]) 
32
    
33
    send_ctrl_cmd(0xF6);    //Interface Control
34
     send_data_cmd(0x01); //WEMODE=1 
35
     send_data_cmd(0x00); //
36
     send_data_cmd(0x06); //ENDIAN=0(MSBfirst), DM:01:RGB-InterfaceMode,RM:RGB-Inteface-Mode,RIM:0:16BitRGB
37
  
38
///////////////////////////////////////////////
39
    send_ctrl_cmd(0x11);//Exit Sleep
40
    HAL_Delay(80);
41
    send_ctrl_cmd(0x11);//Exit Sleep
42
    HAL_Delay(80);
43
44
    send_ctrl_cmd(0x29);//Display On
45
    HAL_Delay(20);
46
47
    send_ctrl_cmd(0x2C);//Display On

von Jörg S. (joerg_s)


Lesenswert?

So.. Display läuft..

von S. R. (svenska)


Lesenswert?

Ist das schön, dass du der staunenden Masse die Lösung verrätst...

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.