Forum: Projekte & Code STM32F4 - Spiele


von Ralph S. (jjflash)



Lesenswert?

Nachdem ich so meine Hard- und Software sortiere, möchte ich hier meine 
"Spielekonsole" (zumindest soll es mal eine werden) veröffentlichen. Für 
andere Controller habe 5 der insgesamt 7 Spiele schon veröffentlicht, 
mein Ziel war und ist es immer noch, alle Spiele auf einem Controller zu 
vereinigen, und hier soll es ein STM32F4 sein (weil es den mit viel 
Flash-Speicher gibt). Auslagern auf eine SD-Card und Spiel aus dem RAM 
laufen lassen wäre zwar auch eine Option, braucht es aber zumindest noch 
nicht. die 7 Spiele benötigen derzeit 152 kByte.

Über den Code nicht wundern (speziell beim Three A Color): Das Spiel 
hatte ich zum ersten mal 1992 für MCGA 320x200 / 256 Farben geschrieben 
und viele (wirklich viele) Leute haben das dann anstelle von Tetris oder 
Klax gespielt (und grunsätzlich ist das eine Kombination aus beiden). 
Der Code war damals noch unter Turbo-Pascal und jetzt habe ich, nachdem 
ich den alten Code wieder gefunden habe, 1 zu 1 nach C portiert und die 
Grafik auf das kleine Display angepasst.

Also nicht schimpfen, ich weiß dass das "besser / schöner" geht, aber: 
Never touch a running system ... und damals hatte ich lange "gefummelt", 
bis das vom Timing her gut spielbar war.

Grundsätzlich habe ich die Software auf einem Nucleo F446, F401 ... 
einem schwarzen Board mit F407, einer Blackpill mit F401 und auf meiner 
eigenen Platine mit STM32F402 (ja, den gibt es wirklich, ist scheinbar 
für den chinesischen Markt only gemacht) laufen lassen und es gab keinen 
Unterschied.

Ich werde mir wohl eine neue PCB routen, weil ich festgestellt habe, 
dass 4 Tasten (speziell beim MineSweeper) zu wenig sind: Eine Auswahl 
(als Ersatz für eine Return-Taste dient ein Doppelklick nach oben... was 
manchmal zu einer Fehlbedienung führen kann ... und bei MineSpweeper ist 
ein Doppelklick links das Aufdecken eines Feldes und ein Doppelklick 
rechts das Markieren eines Feldes... auch manchmal ungewollte "Aktion").

Das Programm selbst ist ein (von mir so genanntes) Make-File Projekt, 
das heißt es unterlag keiner IDE, und ist unter Linux entstanden. Zum 
Übersetzen benötigt es ein systemweit erreichbarer arm-none-eabi-gcc 
Compiler und zum hochladen des Codes ein systemweit erreichbare 
STM32_CubeProgrammer, bei dem auch die Kommandozeile verfügbar sein 
soll.

Ansonsten gibt es relativ wenig zu sagen, es reicht ein Controller in 
der Standardbeschaltung und ein TFT-Display mit 160x128 Pixel. Das 
Display selbst ist über ein Header konfigurierbar, so dass Displays mit 
unterschiedlichen Controllern funktionieren sollten. Getestet sind 
ST7735 (default) sowie S6D02A1 und ILI9163.

von Gunnar F. (gufi36)


Lesenswert?

Ralph S. schrieb:
> Grundsätzlich habe ich die Software auf einem Nucleo F446

extrem cool! Der Zufall will dass ich gerade einen Nucleo F446RE vor mir 
habe und probieren will, ein SPI Display daran zu betreiben. Da will ich 
gerne mal Deine Software sichten und probieren! Danke!

von Wastl (hartundweichware)


Lesenswert?

Ralph S. schrieb:
> Über den Code nicht wundern

Warum hast du nicht die heute üblichen LL-Libraries verwendet?
Das macht es extrem "lästig" das Ganze in eine heute machbare
Version zu bringen.

von Harry L. (mysth)


Lesenswert?

Wastl schrieb:
> Ralph S. schrieb:
>> Über den Code nicht wundern
>
> Warum hast du nicht die heute üblichen LL-Libraries verwendet?
> Das macht es extrem "lästig" das Ganze in eine heute machbare
> Version zu bringen.

Ich hab mir das auch mal angeschaut.
Es sollte kein unlösbares Problem sein, das auf HAL umzustellen.
LL ist dazu gar nicht nötig.

von Ralph S. (jjflash)


Lesenswert?

Wastl schrieb:
> Warum hast du nicht die heute üblichen LL-Libraries verwendet?
> Das macht es extrem "lästig" das Ganze in eine heute machbare
> Version zu bringen.

weil die ganzen Sourcen über die Jahre hinweg entstanden / gewachsen 
(und selbst geschrieben) sind und von daher mir dann natürlich auch 
liegen. Ursprünglich waren die auch von der Namensgebung her an das 
BGI-Interface von Borland angelegt (Turbo-Pascal und Borland-C waren 
meine ersten ernsthaften Programmierunternehmnungen). Von daher: Never 
touch  a running System.

Harry L. schrieb:
> Es sollte kein unlösbares Problem sein, das auf HAL umzustellen.
> LL ist dazu gar nicht nötig.

Na ja, das ganze basiert hier ja auf libopencm3 (welches im Archiv ja 
enthalten ist). Zudem glaube ich, dass da nicht wirklich ein Mensch 
(außer mir) daran etwas "rumfummeln" mag. Die Grafiksourcen habe ich 
hier in einem anderen Thread zu CH32V003 beschrieben: es sind dieselben.

von Ralph S. (jjflash)


Lesenswert?

Gunnar F. schrieb:
> extrem cool! Der Zufall will dass ich gerade einen Nucleo F446RE vor mir
> habe und probieren will, ein SPI Display daran zu betreiben. Da will ich
> gerne mal Deine Software sichten und probieren! Danke!

Danke für das Lob hier solltest / kannst du im Makefile deinen 
Controller angeben, wobei das jedoch in dieser Software nicht wirklich 
eine Rolle spielt, weil der größere Flash- und RAM-Speicher des F446 
sowieso nicht genutzt wird.

Ein Display kannst du im Verzeichnis include in der Header-Datei 
tftdisplay.h konfigurieren (für bspw. die Farbreihenfolge rgb oder bgr) 
und auch grundsätzlich den Controllertyp des Displays.

Weil ich (leider) im Laufe der Zeit unterschiedliche Platinen und 
Aufbauten gemacht habe, habe ich auch viele unterschiedliche 
Anschlussbelegungen zu dem Display. Aus diesem Grund habe ich die 
Pindeklarationen der Anschlüsse zum Display in der Datei tft_pindefs.h 
(ebenfalls im Verzeichnis include) ausgelagert. Hier kannst du entweder 
eine weitere Pinbelegung angeben, oder eine für dich passendere 
Belegungen aus den vorgegebenen verwenden. Bis heute habe ich es nicht 
geschafft, ein PCB für ein Nucleo-Board für ein Display mit Tasten zu 
erstellen (liegt wohl daran, dass ich mittlerweile den Controller auf 
meine eigenen PCB platziere).

Wenn du das ausprobierst wäre ich über eine Rückmeldung dankbar, ob das 
so auch geklappt hat.

Im Moment sitze ich immer wieder einmal an Sokoban und an Snake... wobei 
mir beim einen die Displaygröße zu schaffen macht -Sokoban- und zum 
anderen, dass eine langgewordene Schlange noch flüssig dargestellt wird. 
Hier machen mir meine relativ langsamen Sourcen Probleme... schauen wir 
mal)

von Ralph S. (jjflash)


Lesenswert?

... vergessen habe zu schreiben: Wenn es nur darum geht, ein Display am 
F446 zu betreiben, kann ich dir auch gerne hier ein kleines Display-Demo 
einstellen, dann mußt du dich nicht durch den ganzen Wust durchkämpfen.

von Gunnar F. (gufi36)


Lesenswert?

Ralph S. schrieb:
> ... vergessen habe zu schreiben: Wenn es nur darum geht, ein Display am
> F446 zu betreiben, kann ich dir auch gerne hier ein kleines Display-Demo
> einstellen, dann mußt du dich nicht durch den ganzen Wust durchkämpfen.

Moin Ralph, herzlichen Dank! Mag sein dass ich beim Displaykauf nicht 
gut aufgepasst habe:
https://joy-it.net/de/products/RB-TFT3.2V2
Das nahm ich weil es günstig ist und mir das Paket aus Touch, Buttons 
(und Preis) gut paßte. Bei der Recherche gestern fiel mir dann auf, dass 
da offenbar ein Joy-It-spezifischer Controller drin ist, der das SPI auf 
die parallele Schnittstelle des LCD-Controllers umsetzt. Das könnte 
erklären, warum ich kaum eine Library für STM32 finden konnte. 
Vielleicht hat ja auch hier jemand damit Erfahrung und weiß, wie die 
Anbindung funktioniert.
Es soll ja am Raspberry funktionieren und das werde ich dann auch mal 
probieren. Vielleicht kann ich aus den Sourcen des Linux-Treibers dann 
die entsprechenden Informationen gewinnen.
Mein erstes Display-Experiment war das SSD1306-OLED und das ist ja auch 
günstig und hübsch, aber halt arg klein. Mit der Bibliothek hatte ich 
keine Probleme.

von Ralph S. (jjflash)


Lesenswert?

Gunnar F. schrieb:
> Moin Ralph, herzlichen Dank! Mag sein dass ich beim Displaykauf nicht
> gut aufgepasst habe:
> https://joy-it.net/de/products/RB-TFT3.2V2
> Das nahm ich weil es günstig ist und mir das Paket aus Touch, Buttons
> (und Preis) gut paßte.

Ach herjeh, das tut mir leid. Ich habe für dieses Display die 
Pinbelegung nicht heraus gefunden. In meinen Grafik-Sourcen ist auch 
rudimentär die Ansteuerung für parallele Displays enthalten (diese aber 
noch ohne DMA Unterstützung), aber nur unter Verwendung von Bitbanging.

Bei den typischen Vertretern, die man auf ein Nucleo aufstecken kann, 
ist die Anordnung der Datenleitung leider so daneben (scheinbar für 
Arduino-UNO gemacht), dass die GPIO's hier auf mehrere Ports verteilt 
werden.

Das macht das ganze dann leider etwas langsam und das Display fällt hier 
dann auf das Niveau eines SPI-Displays in der Geschwindigkeit zurück.

Nach meiner Recherche gibt es dieses Display auch mit ST7735r Controller 
und parallelem Anschluss, aber leider habe ich die Pinbelegung dieses 
Displays nicht herausgefunden.

Wenn diese bekannt wären, könnte ich die Grafiksourchen um ein parallels 
ST7735 Display erweitern, allerdings könnte ich das dann nicht testen.

Gunnar F. schrieb:
> Mein erstes Display-Experiment war das SSD1306-OLED und das ist ja auch
> günstig und hübsch, aber halt arg klein. Mit der Bibliothek hatte ich
> keine Probleme.

Die Displays habe ich natürlich auch, aber für die Spiele ungeeignet, da 
sie nur 128x64 Pixel in sw haben.

von Gunnar F. (gufi36)


Lesenswert?

Ralph S. schrieb:
> Ich habe für dieses Display die
> Pinbelegung nicht heraus gefunden.

Die habe ich schonmal:
https://www.lcdwiki.com/3.2inch_RPi_Display

von Ralph S. (jjflash)


Lesenswert?

Gunnar F. schrieb:
> Die habe ich schonmal:
> https://www.lcdwiki.com/3.2inch_RPi_Display

Das ist EIN Display für den RaspBerry PI, aber nicht dein Display 
(welches du oben als von Joy-It) verlinkt hast.

Das, was im Link von lcdwiki steht, ist kein parallels Interface, 
sondern ein SPI-Interface mit ILI9341 Controller.

Da ich ein ILI9341 Display nur als paralleles habe, habe ich das meinen 
Sourcen auch nicht als SPI-Interface mit eingefügt. Vielleicht sollte 
ich meine Beschreibung für die Displays noch einmal überarbeiten, damit 
jeder nach gutdünken das erweitern kann.

Für dein Display habe ich 2 unterschiedliche Angaben zu Controllertypen 
des Displays gefunden.

Schreibe doch Joy-It an und frage:

1.) welcher Controller-Typ verbaut ist
2.) Pinbelegung

ansonsten kann man dir nicht weiter helfen

von Ralph S. (jjflash)


Lesenswert?

Harry L. schrieb:
> Es sollte kein unlösbares Problem sein, das auf HAL umzustellen.

Das dürfte es wirklich nicht sein, ich habe mir, mal wieder beim 
Aufräumen und erweitern (andere Projekte), meine Sachen noch einmal 
angeschaut).

Die wenigen Dinge die mit dem HAL gemacht werden müssen sind:

In Datei sysf4xx_init.c
 - in Funktion sys_init den Coreclock auf 84 MHz einstellen (oder mehr, 
je nachdem welcher F4 das ist), dort den Takt für die Ports A, B und C 
einschalten
- in Funktion systick_setup die Systemtickerzeit auf 1 ms stellen

In Datei tftdisplay.c
die Funktionen für das SPI umstellen, die da sind:
- spi_init
- spi_in
- spi_lcdout

In Datei tft_pindefs.h
- die Makros zum Initialisieren einzelner GPIO's als Output sowie das 
Setzen und Löschen eines GPIO-Pins


... und das war es schon, alle anderen Funktionen sind von der Hardware 
unabhängig!

Allerdings: Ich mag den HAL halt einfach nicht.

von Wastl (hartundweichware)


Lesenswert?

Ralph S. schrieb:
> Allerdings: Ich mag den HAL halt einfach nicht.

Ich auch. Deswegen sag ich ja:

Wastl schrieb:
> Warum hast du nicht die heute üblichen LL-Libraries verwendet?

Die würden auch besser zu den von dir verwendeten "alten"
Libraries passen.

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.