Zurück

Entwicklung FlorianF PRE V2

"Digitaler Mikrocontroller gestützter Audio Verstärker mit analogem DAC und disktretem Ausgangsverstärker"

Gehäuseentwurf in Autocad Fusion360 gerendert mit Blender 4.0.1

Projektschwerpunkte in der Übersicht

Git Versionskontrolle über alle Projektschwerpunkte

kleiner Rendereffekt, einfach über Bauteile hovern...
Die Frontplatine wurde mit KiCad 7.0 erstellt und die Bilder wurden mit Blender 4.0.2 gerendert
bild bild

Nachfolger von Version 1 mit neuer Frontplatine.

Nachdem der verwendete ATMega382P aus Version 1 für die grafischen Ansprüche nicht mehr ausreicht und ich mich gerade zu dieser Zeit im Studium mit einem STM32 Nucleo Board beschäftigt habe, fiel die Wahl auf einen STM32 Mikrocontroller.
Zusammen mit einem Freund habe ich zuerst ein eigenes kleines STM32 Entwicklungsboard mit einem STM32L562 (Cortex M33 Befehlssatz) und 192kB RAM sowie einem externen SRAM entwickelt. Sämtliche Periferie wie Displays, FMC Display ect können über die Wannenstecker bzw Stiftleisten angeschlossen werden.

Bild L562 Board

Eigenentwicklung STM32L562 Entwicklungsboard

Bei Verwendung eines ILI9341 Displays mit 320x240 Pixel Buffers wurde schnell klar, dass der im L562 vorhandene RAM nur für einen 16bit Buffer ausreicht. Bei 320x240x2 braucht man 153.600 Bytes an Speicher für die Pixel. Um dennoch ein "Buffering" zu erzielen, habe ich auf das niedrigstwertige Bit im Pixel verzichtet und dieses als "Diff" Bit verwendet. Somit erreiche ich eine Pufferung bzw nur die geänderten Pixel im Buffer müssen zum Display gesendet werden. Dadurch waren dann auch höhere Aktualisierungsraten (fürs Auge) möglich, jedoch mit Verlust von Farbinformation.

Bei weiteren Versuchen mit dem NT5517 Display am FMC Parallel Port des L562 mit 800x480Pixeln war garnicht an das Puffern der Pixel zu denken. Den Treiber und alle Versuche auf den beiden Displays zu zeichen, waren beim großen Display damit nur Direkt möglich. Im Nachhinein hätte man versuchen können, alles nur teilweise zu Buffern, aber dann hätte man auch das zeichnen von Linien, Rechtecken ect. nicht direkt in einem Buffer machen können.

Auswahl des Displays

LCD Character Display mit HD4416 Chip
(FlorianF PRE v1)

ILI9341 SPI 2,8" Display mit 320x240Pixeln im 16bit RGB565 Format

NT5517 16/24bit Parallel Port 4" Display im 16bit RGB565 Format

Damit solche Restriktionen bei der weiteren Entwicklung der Software nicht mehr ins Gewicht fallen, habe ich dann bei der Entwicklung der Frontplatine des FlorianF PRE v2 darauf geachtet, dass ich genug Ressourcen habe.

Nach langer Suche, auch in der Zeit der Corona Pandemie welches mit Lieferengpässen für Mikrocontroller nicht leicht war, fiel die Wahl dann auf einen STM32F427 mit der Möglichkeit externe RAM und Flash ICs an den FMC/FSMC Parallel Port zu hängen. Die verwendete Hardware auf der Frontplatine habe ich dann auch den STM32F427 mit 32MB RAM und 128MB Flash für Bilder, Daten und Glyphs eingeplant. Für die Speicherung von Datensätzen habe ich zusätzlich noch einen I2C EEPROM eingeplant. Der Externe SD-RAM (DDR1, 144MhZ) kann über den FMC nach Harwarekonfiguration direkt über Pointer genutzt werden. Somit waren Framebuffer, große Variablen und Arrays kein Problem mehr.

Eigenentwicklung FlorianF PRE v2 Frontplatine

Jedoch gab es einen Punkt... ich brauchte eine eigene Speicherverwaltung bzw einen benutzerdefinierten heap für eigene dynamische Arrays mit eigener Malloc Funktion, damit ich malloc auf dem internen Ram und ein separates auf dem externen Arbeitsspeicher habe.

Implementierung und Funktionsweise von Malloc und Free

Die selbstentwicklung von myMalloc und myFree ermöglicht es in vorgegebenen Arrays mit dem Linked List Prinzip Blöcke im Array zu reservieren und freizugeben. Wird ein Block angefragt wird geschaut welcher nächst mögliche Block frei ist uns somit reserviert. Die myMalloc Funktion gibt dann einen Word Aligned 32bit void* zurück. Anfangs konnte es passieren, dass der Pointer nicht 4-aligned war (also 4Byte für 32bit). Dies führte über die MPU direkt zum HardFault des STM32 Controllers.

Simulation der eigenen Malloc Funktion

Die Funktion malloc (kurz für "memory allocation") reserviert Speicherplatz im Heap hier direkt in einem Array welches auf dem externen SDRAM liegt, der für dynamische Allokation verwendet wird. Wenn Sie beispielsweise einen neuen Datenbereich benötigen, um Informationen zu speichern, kann myMalloc verwendet werden, um diesen Speicherplatz anzufordern.
Im Gegensatz dazu ist die Funktion free dafür verantwortlich, den zuvor allokierten Speicherplatz freizugeben, sobald er nicht mehr benötigt wird. Dadurch wird verhindert, dass ungenutzter Speicher belegt bleibt. Somit wird dieser Speicher für andere Anwendungen verfügbar gemacht.
Die Eigenimplementierung von malloc und free erfolgt durch Verwendung von Linked Lists, um den verfügbaren Speicher zu verfolgen und zu organisieren. Eine Handhabung für die Speicherfragmentierung nach einigen free Aufrufen wurde durch Block Merging realisiert.

Um das ganze noch sicher gegen zeitgleiche Schreib/Leseversuche in Interrupts auf dem RAM zu machen, wurde im ersten Schritt die aktuelle PRIMASK gespeichert, alle Interrupts deaktiviert, die angeforderten Pointer bzw Blöcke reserviert und die Primask danach wieder gesetzt. Damit sind dann alle Interrupts automatisch wieder aktiviert.

Rotary Encoder Implementierung

Eigenes Kommunikationsprotokoll für Kommandointerpreter und Datenempfang

Eigenes NAND Flash Inode basiertes Dateisystem

Aktuell in Arbeit:
Entwicklung eines Inode Dateisystems für Ordner und Dateien in einem C Array.

STM32 Calculator / Tools

STM32F4 FMC LCD Timing Calculator

STM32F4 FMC NAND Timing Calculator

Teilsimulation Eingangswahlplatine mit OP am Eingang zur Impedanz und Verstärkung

Zurück