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?