Hallo
Aufgrund der Tatsache, dass an dem Ort, an dem ich arbeite, SPI-Speicher programmiert werden müssen, deren Stapelverarbeitungsdatei gleich ist, habe ich mich entschieden, ein Gerät zu bauen, das den Inhalt eines Mikrocontrollers auf einen anderen kopiert. Anscheinend nichts, aber mit der Zeit möchte ich Mikrocontroller professionell entwerfen und programmieren, daher scheint es als erstes Projekt eine interessante Übung zu sein, zumal es häufig kommerziell genutzt wird.
Natürlich kann man den/die Programmierer für die Massenproduktion verwenden, aber hier haben wir eine Platine, die man nicht an einen PC anschließen und irgendetwas ausführen muss. Wir schliessen zwei Chips an, drücken den Knopf und das war's. Die Schreibgeschwindigkeit ist die gleiche wie beispielsweise im Fall des RT809-Programmierers.
Es ist auch mein erstes Projekt, das ich dermassen abgeschlossen habe, um es veröffentlichen zu können, obwohl es noch nicht zu 100 % fertig ist
Als Prozessor habe ich STM32G431KBT6 verwendet. Das gesamte Projekt wird in STM32CubeIDE mit CMSIS erstellt, ohne HAL zu verwenden. An dieser Stelle möchte ich mich bei dem Kollegen bedanken, der die auf der Elektroda zu findende Anleitung zur Programmierung des STM32 "auf Register" erstellt hat. Ich habe die Anleitung vor einiger Zeit gelesen, dank ihr habe ich viel gelernt und der Wechsel zu jedem Mikrocontroller aus der STM32-Familie ist kein Problem.
Die Schaltung selbst ist sehr interessant. Meine größte Überraschung in der G4-Serie war der Kerntakt, 170 MHz, ohne die Verwendung eines Quarzoszillators im Chip im LQFP32-Gehäuse, der (in der Krise) 4 Euro kostet. Der Prozessor selbst hat 3 SPI-Schnittstellen, dank denen LCD, die Chips target und source auf separaten Schnittstellen sein können. Mit diesem und DMA fülle ich beim Schreiben der Chips auch den Puffer (1 Sektor - 4 kB) aus der Quelle, sodass nach Abschluss des Schreibvorgangs der Puffer gefüllt ist und das Schreiben des nächsten Sektors sofort beginnen kann. Es sollte den Schreibprozess beschleunigen, und das ist es auch. Es stellte sich jedoch bald heraus, dass die Zeit zum Schreiben des Chips target lang genug ist, um den nächsten Sektor aus der Quelle zu lesen, um den Puffer vorzubereiten, selbst wenn sich die Chips auf einer Schnittstelle befanden. Es würde sogar noch etwas Zeit bleiben, um zum Beispiel mit der Diode zu blinken
Beim Programmieren des Prototypen habe ich sogar Speicher im QuadSPI-Modus verwendet, was sich aber als völlig sinnlos herausstellte, da die Zeitunterschiede, bedingt durch die Programmierzeit, vernachlässigbar sind. Der SPI-Takt für den Flash-Chip liegt bei 20 MHz, für das Display bei 40 MHz.
Das verwendete LCD ist ILI9341. Ich habe die Anzeigebibliothek vor langer Zeit gefunden und modifiziert. Meine Änderungen umfassen die Unterstützung für DMA ohne HAL. Ich habe auch Unterstützung fürs Anzeigen von Grafiken (mit Image2Bitmap.exe generierte Tabellen) und Unterstützung für aus Windows über das Programm GLCDFontCreator2 importierte Schriftarten und mehrere Funktionen wie Fortschrittsbalken hinzugefügt. Wie gesagt, ich habe es vor langer Zeit gemacht und der Code kann hässlich und nicht sehr verständlich sein, aber nach dem Prinzip "wenn etwas funktioniert, fass es nicht an", glaube ich nicht, dass ich wirklich in der Stimmung bin für eventuelle Korrekturen.
Den Chip target kann mit einem speziellen Programm, das ich in Visual Studio geschrieben habe, vom PC aus programmiert werden. Daten werden in Paketen von 4100 Byte gesendet. 4096 Bytes sind ein Sektor, 4 Bytes sind eine Prüfsumme, die bei jeder Übertragung überprüft wird. Die gesendete Datei muss die gleiche Größe haben wie der Chip in den Socket source eingesetzt, dies wird vom Programm überprüft, da Informationen über die Kapazität des Chips source bei der Initialisierung der Übertragung gesendet werden. Ist die Prüfsumme nicht korrekt, wird der Sektor erneut gesendet, ist die Prüfsumme ok, wird der Sektor programmiert. Ganz am Ende werden der Dateiname und die Prüfsumme des Ganzen gesendet. Stimmt die Prüfsumme des Ganzen überein, werden CRC32 und der Dateiname im Flash-Speicher des Mikrocontrollers gespeichert. Bei jedem Start wird der Chip source gelesen und der CRC überprüft, wodurch man überprüfen kann, ob der SPI-Speicher beschädigt oder ersetzt wurde. Um eine neue Prüfsumme in den Mikrocontroller zu schreiben, muss der Chip mit einem PC-Programm neu programmiert werden. Die Berechnung der Prüfsummen auf der Seite des Programmierers erfolgt durch den Hardware-CRC-Block.
Die Kommunikation mit dem Programmiergerät erfolgt über einen virtuellen COM-Port auf Basis des MCP2221-Chips. Dies ist ein ziemlich alter Chip in einem DIP14-Gehäuse, aber zum Zeitpunkt der Bestellung von Komponenten war nur ein solcher Chip zu einem vernünftigen Preis erhältlich. Eine große Einschränkung ist hier die Übertragungsgeschwindigkeit, die maximale Baudrate beträgt 115200, was bedeutet, dass das Programmieren von 8 MB oder größeren Chips eine Weile dauert. Beim Erstellen des Prototyps habe ich einen Adapter auf Basis des PL2303-Chips verwendet, bei dem die Baudrate 921600 beträgt, was das Schreiben einer neuen Datei erheblich beschleunigte. Gelegentlich kam es bei einer solchen Geschwindigkeit zu Übertragungsfehlern, aber das Überprüfen der Prüfsumme in jedem Sektor ist kein Problem. Im Allgemeinen ist die langsame Übertragung kein großes Problem, es wird 4 Programmierer geben, jeder wird einen Flash mit einer anderen Datei haben, so dass die Programmierung nur einmal stattfindet. Wenn USB häufiger verwendet werden muss, kann dank der Tatsache, dass sich das MCP in einem DIP-Gehäuse befindet, eine schnellere Brücke verwendet werden, die auf dem Adapter montiert ist.
Die "offline" Programmierung selbst basiert, wie ich bereits erwähnt habe, auf zwei Puffern von 1 Sektor von 4096 kB. Zum Zeitpunkt des Schreibens, wenn Daten aus Puffer 1 abgerufen werden, wird der nächste Sektor aus dem Chip source über DMA in Puffer 2 gelesen. Nachdem jeder Sektor geschrieben wurde (jeweils 256 B jede Seite), werden Daten aus Puffer 2 in den Chip geschrieben, und Puffer 1 wird mit neuen Daten neu gefüllt. Ganz am Ende ist die Prüfsumme des Chips target vergleichbar mit der Prüfsumme, die im Flash-Speicher des Mikrocontrollers gespeichert ist. Es ist möglich, eine größere Größe des Chips als target zu verwenden, das CRC selbst wird nur auf die Größe des Chips source überprüft.
Die Platine selbst ist sehr einfach, 2-lagig mit viel Freiraum. Die Sockel selbst könnten etwas weiter vom Display entfernt sein, je nachdem, welchen Adapter wir verwenden, kann es sein, dass er nahe am Display ist. Es gibt auch Sockel für I2C-Speicher auf dem Programmierer, es wird derzeit nicht verwendet, im Laufe der Zeit, wenn sich herausstellt, dass es benötigt wird, werde ich ihre Unterstützung hinzufügen. Der Schaltplan wurde in Altium Designer erstellt, ich lerne dieses Programm noch
Schaltplan:
Der Quellcode für den Mikrocontroller ist auf github verfügbar: https://github.com/perpuchaty/SPI-Programmer
Quellcode für Windows-Anwendung: https://github.com/perpuchaty/SPI-Programmer-WIN
Aufgrund der Tatsache, dass an dem Ort, an dem ich arbeite, SPI-Speicher programmiert werden müssen, deren Stapelverarbeitungsdatei gleich ist, habe ich mich entschieden, ein Gerät zu bauen, das den Inhalt eines Mikrocontrollers auf einen anderen kopiert. Anscheinend nichts, aber mit der Zeit möchte ich Mikrocontroller professionell entwerfen und programmieren, daher scheint es als erstes Projekt eine interessante Übung zu sein, zumal es häufig kommerziell genutzt wird.
Natürlich kann man den/die Programmierer für die Massenproduktion verwenden, aber hier haben wir eine Platine, die man nicht an einen PC anschließen und irgendetwas ausführen muss. Wir schliessen zwei Chips an, drücken den Knopf und das war's. Die Schreibgeschwindigkeit ist die gleiche wie beispielsweise im Fall des RT809-Programmierers.
Es ist auch mein erstes Projekt, das ich dermassen abgeschlossen habe, um es veröffentlichen zu können, obwohl es noch nicht zu 100 % fertig ist

Als Prozessor habe ich STM32G431KBT6 verwendet. Das gesamte Projekt wird in STM32CubeIDE mit CMSIS erstellt, ohne HAL zu verwenden. An dieser Stelle möchte ich mich bei dem Kollegen bedanken, der die auf der Elektroda zu findende Anleitung zur Programmierung des STM32 "auf Register" erstellt hat. Ich habe die Anleitung vor einiger Zeit gelesen, dank ihr habe ich viel gelernt und der Wechsel zu jedem Mikrocontroller aus der STM32-Familie ist kein Problem.
Die Schaltung selbst ist sehr interessant. Meine größte Überraschung in der G4-Serie war der Kerntakt, 170 MHz, ohne die Verwendung eines Quarzoszillators im Chip im LQFP32-Gehäuse, der (in der Krise) 4 Euro kostet. Der Prozessor selbst hat 3 SPI-Schnittstellen, dank denen LCD, die Chips target und source auf separaten Schnittstellen sein können. Mit diesem und DMA fülle ich beim Schreiben der Chips auch den Puffer (1 Sektor - 4 kB) aus der Quelle, sodass nach Abschluss des Schreibvorgangs der Puffer gefüllt ist und das Schreiben des nächsten Sektors sofort beginnen kann. Es sollte den Schreibprozess beschleunigen, und das ist es auch. Es stellte sich jedoch bald heraus, dass die Zeit zum Schreiben des Chips target lang genug ist, um den nächsten Sektor aus der Quelle zu lesen, um den Puffer vorzubereiten, selbst wenn sich die Chips auf einer Schnittstelle befanden. Es würde sogar noch etwas Zeit bleiben, um zum Beispiel mit der Diode zu blinken

Das verwendete LCD ist ILI9341. Ich habe die Anzeigebibliothek vor langer Zeit gefunden und modifiziert. Meine Änderungen umfassen die Unterstützung für DMA ohne HAL. Ich habe auch Unterstützung fürs Anzeigen von Grafiken (mit Image2Bitmap.exe generierte Tabellen) und Unterstützung für aus Windows über das Programm GLCDFontCreator2 importierte Schriftarten und mehrere Funktionen wie Fortschrittsbalken hinzugefügt. Wie gesagt, ich habe es vor langer Zeit gemacht und der Code kann hässlich und nicht sehr verständlich sein, aber nach dem Prinzip "wenn etwas funktioniert, fass es nicht an", glaube ich nicht, dass ich wirklich in der Stimmung bin für eventuelle Korrekturen.
Den Chip target kann mit einem speziellen Programm, das ich in Visual Studio geschrieben habe, vom PC aus programmiert werden. Daten werden in Paketen von 4100 Byte gesendet. 4096 Bytes sind ein Sektor, 4 Bytes sind eine Prüfsumme, die bei jeder Übertragung überprüft wird. Die gesendete Datei muss die gleiche Größe haben wie der Chip in den Socket source eingesetzt, dies wird vom Programm überprüft, da Informationen über die Kapazität des Chips source bei der Initialisierung der Übertragung gesendet werden. Ist die Prüfsumme nicht korrekt, wird der Sektor erneut gesendet, ist die Prüfsumme ok, wird der Sektor programmiert. Ganz am Ende werden der Dateiname und die Prüfsumme des Ganzen gesendet. Stimmt die Prüfsumme des Ganzen überein, werden CRC32 und der Dateiname im Flash-Speicher des Mikrocontrollers gespeichert. Bei jedem Start wird der Chip source gelesen und der CRC überprüft, wodurch man überprüfen kann, ob der SPI-Speicher beschädigt oder ersetzt wurde. Um eine neue Prüfsumme in den Mikrocontroller zu schreiben, muss der Chip mit einem PC-Programm neu programmiert werden. Die Berechnung der Prüfsummen auf der Seite des Programmierers erfolgt durch den Hardware-CRC-Block.
Die Kommunikation mit dem Programmiergerät erfolgt über einen virtuellen COM-Port auf Basis des MCP2221-Chips. Dies ist ein ziemlich alter Chip in einem DIP14-Gehäuse, aber zum Zeitpunkt der Bestellung von Komponenten war nur ein solcher Chip zu einem vernünftigen Preis erhältlich. Eine große Einschränkung ist hier die Übertragungsgeschwindigkeit, die maximale Baudrate beträgt 115200, was bedeutet, dass das Programmieren von 8 MB oder größeren Chips eine Weile dauert. Beim Erstellen des Prototyps habe ich einen Adapter auf Basis des PL2303-Chips verwendet, bei dem die Baudrate 921600 beträgt, was das Schreiben einer neuen Datei erheblich beschleunigte. Gelegentlich kam es bei einer solchen Geschwindigkeit zu Übertragungsfehlern, aber das Überprüfen der Prüfsumme in jedem Sektor ist kein Problem. Im Allgemeinen ist die langsame Übertragung kein großes Problem, es wird 4 Programmierer geben, jeder wird einen Flash mit einer anderen Datei haben, so dass die Programmierung nur einmal stattfindet. Wenn USB häufiger verwendet werden muss, kann dank der Tatsache, dass sich das MCP in einem DIP-Gehäuse befindet, eine schnellere Brücke verwendet werden, die auf dem Adapter montiert ist.
Die "offline" Programmierung selbst basiert, wie ich bereits erwähnt habe, auf zwei Puffern von 1 Sektor von 4096 kB. Zum Zeitpunkt des Schreibens, wenn Daten aus Puffer 1 abgerufen werden, wird der nächste Sektor aus dem Chip source über DMA in Puffer 2 gelesen. Nachdem jeder Sektor geschrieben wurde (jeweils 256 B jede Seite), werden Daten aus Puffer 2 in den Chip geschrieben, und Puffer 1 wird mit neuen Daten neu gefüllt. Ganz am Ende ist die Prüfsumme des Chips target vergleichbar mit der Prüfsumme, die im Flash-Speicher des Mikrocontrollers gespeichert ist. Es ist möglich, eine größere Größe des Chips als target zu verwenden, das CRC selbst wird nur auf die Größe des Chips source überprüft.
Die Platine selbst ist sehr einfach, 2-lagig mit viel Freiraum. Die Sockel selbst könnten etwas weiter vom Display entfernt sein, je nachdem, welchen Adapter wir verwenden, kann es sein, dass er nahe am Display ist. Es gibt auch Sockel für I2C-Speicher auf dem Programmierer, es wird derzeit nicht verwendet, im Laufe der Zeit, wenn sich herausstellt, dass es benötigt wird, werde ich ihre Unterstützung hinzufügen. Der Schaltplan wurde in Altium Designer erstellt, ich lerne dieses Programm noch





Schaltplan:


Der Quellcode für den Mikrocontroller ist auf github verfügbar: https://github.com/perpuchaty/SPI-Programmer
Quellcode für Windows-Anwendung: https://github.com/perpuchaty/SPI-Programmer-WIN
Cool? DIY-Rangliste