STM32 SSD1289 Geschwindigkeit

OP Persönliche Seite #4370640
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?
#4370658
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... ;-)

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.