Forum: Mikrocontroller und Digitale Elektronik STM32 SSD1289 Geschwindigkeit


von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Hi,

ich bin gerade mit einem SSD1289 Display an einem STM32F103VCT6 
beschäftigt.

Das Display ist per FSMC angebunden und hier habe ich eine Routine um 
Bilder, die im Flash liegen direkt auf dem Display auszugeben:
1
int lcd_print_image(tImage *image, uint16_t x_off, uint16_t y_off) {
2
  int x, y;
3
        uint32_t cnt;
4
5
  for(y = 0; y < image->height; y++) {
6
    lcd_write_reg(0x4e, x_off);  // tell display next x position
7
    lcd_write_reg(0x4f, y+y_off);  // next y position
8
    LCD_REG = 0x22;      // next access is data access on GRAM
9
    
10
    for(x = 0; x < image->width; x++) {
11
      LCD_RAM = image->data[cnt];
12
                        cnt++;
13
    }
14
  }
15
  return 0;
16
}

Der Datentyp tImage sieht so aus:
1
typedef struct {
2
  const uint16_t *data;
3
  uint16_t width;
4
  uint16_t height;
5
} tImage;

Das Ausgeben eines kompletten 320x240 16bit Bildes dauert ca. 14.3mS. 
Ermittelt habe ich dies mittels einer Endlosschleife und toggeln eines 
Pins.

Wenn ich die AddressSetupTime, AddressHoldTime und DataSetupTime soweit 
runtersetze, wie möglich wird es nicht schneller.

Das Display unterstützt AutoIncrement der Adresse, das Nutze ich in 
diesem Beispiel nur in die X-Richtung, da die Funktion eigentlich nicht 
für Vollbilder gedacht ist. Damit teste ich sie nur um die maximale 
Laufzeit rauszufinden.
Auch eine Schleife, die 320x240 mal 0x0000 ins RAM schreibt und das 
AutoIncrement nutzt ist nicht schneller:
1
lcd_write_reg(0x4e, 0);  // next x position
2
lcd_write_reg(0x4f, 0);  // next y position
3
LCD_REG = 0x22;  
4
for(i = 0; i < 76800; i++) LCD_RAM = 0x0000;

Bekomme ich das irgendwie auf ~5mS runter? Was gibt es da noch für 
Ansätze, das schneller zu bekommen?
DMA wäre vielleicht ein Ansatz. Kann ich mit dem STM32-DMA den Flash 
durchgehen und immer an die selbe Ziel-Adresse (LCD_RAM) schreiben?
Für Vollbilder wäre das toll.
Kleinere Bilder werden in der Schleife oben zerlegt und nach jeder Zeile 
wird der Cursor im Display neu gesetzt. An der Stelle könnte man dann 
die einzelnen Zeilen dem DMA-Controller geben.


Nun noch eine andere Frage.
Wenn ich das Bild so schnell wie möglich hintereinander aufbauen lasse, 
dann flimmert das Display.
Auch wenn ich es mit einem Timer-Interrupt z.B. 10 mal pro Sekunde neu 
Aufbauen lasse.
Es ist jedes mal das selbe Bild.
An was liegt das und wie kann ich dem abhelfen?

von Jim M. (turboj)


Lesenswert?

Nils S. schrieb:
> DMA wäre vielleicht ein Ansatz. Kann ich mit dem STM32-DMA den Flash
> durchgehen und immer an die selbe Ziel-Adresse (LCD_RAM) schreiben?

Das geht sicher. Memory-to-Memory DMA, aber man muss halt das 
Auto-Inkrement für die Zieladdresse abschalten. Keine Ahnung ob das mit 
HAL geht oder ob man die Register direkt ansprechen muss, habe hier kein 
STM32.

Leider dürfte das em Ende genau so schnell wie Deine Schleife sein,
da das Memory Bus Timing der Flaschenhals ist.

Nils S. schrieb:
> Das Ausgeben eines kompletten 320x240 16bit Bildes dauert ca. 14.3mS.

60 FPS sind 16 ms pro Bild. Reicht doch... ;-)

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Jim M. schrieb:
> 60 FPS sind 16 ms pro Bild. Reicht doch... ;-)

Ich möchte so wenig Zeit wie möglich mit der LCD-Ausgabe verbringen. Mir 
geht es eben auch nicht um ganze Vollbilder.
Im Programmablauf wird bei Updates der Daten auch das Display upgedatet. 
Das soll so schnell wie möglich laufen.

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.