So programmieren Sie mehrere STM32Fs auf derselben Platine

Ich arbeite in einer Managementrolle und habe nur sehr begrenzte Elektronikkenntnisse (genug, um einfache Arduino-Projekte usw. zu machen).

Wir arbeiten derzeit an einem Produkt, das aus 3 STM32F303 und 2 STM32F103 besteht und der Hauptprozessor ein AM5718 ist.

Ich habe mich nur gefragt, wie Sie die Firmware und den Bootloader für jeden Prozessor, einschließlich des AM5718, hochladen und aktualisieren würden.

Die 5 STM32 sind über UART mit dem AM5718 verbunden und befinden sich alle auf derselben Platine.

Ich würde gerne eine gute Vorstellung davon bekommen, wie dies geschehen würde, nachdem die Leiterplatte produziert wurde und das Produkt im Einsatz ist.

Ich würde natürlich den Elektroniker fragen, der an dem Projekt arbeitet, aber wir sind für Weihnachten fertig.

Du darfst nicht in den USA sein, denn der Chef hier würde dich einfach zu Hause anrufen.... :/
Haha, du hast Recht, ich bin in Großbritannien! Es ist kein so großes Problem, dass es rechtfertigt, jemanden zu Hause anzurufen. Hauptsächlich, um meine Neugier zu befriedigen, und es ist auch gut, Ratschläge von Drittanbietern zu erhalten!
Hi. Wenn es eine Antwort gibt, die Ihnen bei der Lösung Ihres Problems geholfen hat, klicken Sie bei dieser Antwort bitte auf Akzeptieren. Vielen Dank.

Antworten (3)

Wenn das Hardwaredesign korrekt durchgeführt wird und UART für die Programmierung verwendet wird, würden die Schritte ungefähr wie folgt aussehen:

  1. Die Haupt-CPU setzt eine ausgewählte MCU zurück.
  2. Die CPU bringt dann die erforderlichen BOOT-Pins in einen geeigneten Zustand und gibt das Zurücksetzen frei.
  3. Der MCU-Bootloader startet und wartet darauf, dass Daten auf der entsprechenden UART-Leitung eingehen.
  4. Die CPU sendet die Binärdaten über den UART und setzt die MCU zurück, wenn sie fertig ist.
  5. Die MCU läuft mit einer neuen Firmware.

Hier ist ein Bild, das die Bootloader-Auswahl für STM32F10xxx-Teile zeigt:

Geben Sie hier die Bildbeschreibung ein

Die gleichen Schritte würden für jede MCU wiederholt werden.

Der Hauptprozessor kann auf zahlreiche Arten aktualisiert werden, aber normalerweise geht es so:

  1. Die Firmware wird in einen lokalen Speicher (FLASH, RAM, SD-Karte usw.) heruntergeladen.
  2. Die CPU wird neu gestartet und der Bootloader erkennt den Upgrade-Code.
  3. Der CPU-Bootloader liest die Daten, prüft die Binärdatei auf Gültigkeit und programmiert die entsprechenden FLASH-Sektoren.
  4. Die CPU bootet sich neu und lädt die neue Firmware.

Aktualisieren.

Basierend auf Ihrer aktuellen Hardware müssten Sie den Bootloader ausführen, indem Sie zur entsprechenden Speicheradresse springen (siehe Seite 20 von AN2606 ). Ich weiß nicht viel darüber, aber Ihr Hardware-Designer sollte in der Lage sein, es herauszufinden. Die Kontrolle über die Reset-Leitung nicht zu haben, ist jedoch ein kleines Versehen.

Würde das also mehr Pins als die 2 USART-Pins erfordern oder würden die MCUs über andere Pins mit der Haupt-CPU verbunden werden.
Ich würde vermuten, dass Sie mindestens zwei weitere GPIOs benötigen. Eine zum Zurücksetzen der MCU und eine andere zum Auswählen des BOOT-Modus.
Welche Pins wären der Reset- und Boot-Modus auf den MCUs und mit welchen Pins würden sie auf der CPU verbunden? Ich habe versucht, selbst nachzusehen, kann es aber nicht nachvollziehen. Derzeit sind die NRST-Pins über einen Widerstand mit Strom und die Boot-Pins mit Gnd verbunden.
@ProductDesigner Angesichts der aktuellen Verbindung durch Widerstand und direkte Verbindungen zur Masse benötigen Sie eine Neugestaltung der Schaltung / Leiterplatte, um stattdessen die logisch gesteuerten Signale aufzunehmen, jetzt, da Sie wissen, wie es funktioniert
NRST wird zum Zurücksetzen verwendet und BOOT0 und BOOT1 werden zum Auswählen des Bootmodus verwendet. Auf der CPU-Seite können sie sich mit jedem GPIO verbinden. Basierend auf Ihrer Hardwarebeschreibung müssen Sie möglicherweise eine andere Methode verwenden, um den Bootloader auszuführen. Ich werde meine Antwort aktualisieren.
Wäre es also vorteilhaft, sowohl die Boot-Pins als auch die Resets zu kontrollieren? Oder nur die Resets und den Boot-Pin so lassen wie er ist und den Bootloader steuern? Was wäre das ideale Setup?
Nun, es liegt wirklich an Ihnen und Ihren Ingenieuren, das zu entscheiden. Wenn Sie den Bootloader über den Code aktivieren können, dann kann es sinnvoll sein, einige Signale und Routing-Aufwand zu sparen. Andererseits ist die Hardwaresteuerung zuverlässiger. Stellen Sie sich vor, die MCU ist abgestürzt. Wie würden Sie sie zurücksetzen und ihr sagen, dass sie den Bootloader ausführen soll?
Ok danke für all eure Ratschläge. Wie würden die Pins aus Hardware-Sicht verbunden, nur eine einfache Verbindung oder gäbe es Pull-Up / Down-Widerstände?
STM32s haben einen permanenten internen Pull-up auf der Reset-Leitung, also ist das abgedeckt. BOOT0 sollte für den normalen Betrieb einen Pulldown-Widerstand haben.

Ich vermute, dass Sie die AM5718-Firmware über JTAG laden müssen, aber ich bin mit dieser CPU-Familie nicht allzu vertraut.

Der STM32 (wie viele andere ARM-CPUs heutzutage) hat einen von ST eingebauten ROM-Bootloader. Bei einigen STM32-Serien wird dies erreicht, indem der BOOT0-Pin während des Zurücksetzens hoch gehalten wird. Um Ihr normales Programm zu booten, müssen Sie den Pin niedrig halten. Das steht aber praktischerweise nicht immer im Datenblatt, sondern oft in der Bedienungsanleitung.

Der ST-Bootloader unterstützt oft mehrere Protokolle, und UART ist ein sehr verbreitetes. Nicht alle UARTs oder Pin-Positionen auf dem STM32-Chip werden jedoch unterstützt - daher müssen Sie die Pins der seriellen Schnittstelle auswählen. Dieses Dokument ist sehr hilfreich, wenn Sie die richtige Familie finden können.

Das Verfahren, das Armandas beschreibt, ist richtig. Wenn Sie einige freie Pins auf Ihrer AM5718-CPU haben, können Sie die Aktivierung des Bootloaders von ST per Software automatisieren. Dies kostet einige GPIO-Pins auf der CPU - theoretisch 1 zusätzliche Reset-Leitung für jede hinzugefügte CPU. Möglicherweise müssen Sie auch berücksichtigen, wie Ihr Board in diesem Setup hochfährt, während der AM5718 nicht vollständig läuft.

Eine kleine Einschränkung: Bei einigen STM32-Teilen wird der ROM-Bootloader deaktiviert, sobald Sie den Leseschutz aktivieren. Per JTAG (nach dem Löschen) kann man immer noch auf den Chip zugreifen, aber nicht über den Bootloader. Wenn Sie die automatische Aktivierung nicht in Hardware passend erscheinen lassen können, müssen Sie sie möglicherweise manuell über Jumper und ein Papierverfahren durchführen. Dies ist jedoch nur in der Fabrik praktikabel - es ist keine sehr vor Ort wartbare Lösung.

Beide Gründe können Sie zu einem internen Bootloader führen, der über einen seriellen Befehl aktiviert werden kann. Es bietet auch den Vorteil, dass Sie Ihre Firmware-Images durch Verschlüsselung „schützen“, da Sie die Entschlüsselung im Bootloader selbst vornehmen.

Ok, im Moment denke ich, dass es am besten ist, die STM32s über ihre eigenen UARTS mit der Haupt-CPU zu verbinden und ihre Boot- und Reset-Pins mit den CPU-GPIOs zu verbinden. Ich interessiere mich noch nicht für Software, ich möchte nur, dass das Hardwaredesign zukunftssicher ist.

Wenn alle Teile JTAG-konform sind und sich alle in derselben Leistungsdomäne befinden (oder sich anderweitig in einem Zustand befinden, der die Kettenintegrität garantiert), können Sie eine Scan-Kette erstellen und diese verwenden, um nacheinander jeden Teil zu treffen.

Es hört sich jedoch so an, als ob das Projekt abgeschlossen ist und Sie im Management sind :), daher denke ich, dass die UART-Option die beste Route ist. Um es klar zu sagen, jeder STM hat seinen eigenen UART für den großen Prozessor, oder teilen sie sich (was etwas seltsam ist ...)? Wenn letzteres, wie die anderen Poster sagten, benötigen Sie einen GPIO pro, um auszuwählen, wer aktiv ist.

Die erste Stufe der Hardwareentwicklung ist fertig für das Prototyping. Ich habe gerade die Schaltpläne durchgesehen und war besorgt, dass die STMs nur über den UART mit der Haupt-CPU verbunden sind, ihre Reset- und Boot-Pins sind wie oben mit Strom / Masse verbunden. Jeder STM ist über seinen eigenen UART mit der Haupt-CPU verbunden. Ich denke also, dass es im Moment am besten ist, jedes STM über separate UARTs (wie sie derzeit sind) mit der CPU zu verbinden und dann ihre Boot- und Reset-Pins mit den GPIOs der Haupt-CPU zu verbinden.
Ja, das scheint vernünftig. Das einzige, was ich sicherstellen würde, ist, dass sich Ihre Reset-Kette unabhängig vom Softwarestatus durch die CPU ausbreitet. dh wenn VDD unter den akzeptablen Schwellenwert fällt, übernimmt ein interner Supervisor und löst einen Reset aus, oder sollten Sie die GPIO-Steuerung für jeden STM-Reset über einen Reset-Supervisor-IC ausführen.
Ok, Sie haben mich jetzt verloren. Denken Sie daran, dass ich keine massiven Kenntnisse über die Arbeit an Elektronik dieser Größenordnung habe. Sprechen Sie also davon, einen separaten IC für die Handhabung der Resets zu haben? Ich interessiere mich im Moment wirklich nur für die richtige Hardware.
Ein separater Reset-Supervisor wird im Allgemeinen verwendet, wenn Sie möchten, dass ein zustandsloses Hardwareelement unter bestimmten Bedingungen einen Reset aktiviert. Beispielsweise kann ein 3,3-V-Reset-Supervisor ein 5-Pin-Teil sein – VDD, GND, RST, RST# und MR#. Es wird zurückgesetzt, wenn die Spannung 3,08 V erreicht (oder was auch immer eingestellt ist, einige sind einstellbar), sodass alle Prozessoren / usw. sicher zurückgesetzt werden, bevor ihre Stromversorgung zu weit abfällt. Der MR#-Pin ist etwas, das Sie anschließen können, um einen Druckknopf zu sagen; Es erzeugt einen Impuls, wenn Sie es bestätigen und dann loslassen, oder wenn Sie es gedrückt lassen, bleibt alles zurückgesetzt.
Denken Sie, dass ein Reset-Supervisor in dieser Anwendung erforderlich ist? Wäre es ein IC pro Prozessor oder nur einer für das gesamte System? Was wäre ein gutes IC?
Ohne mehr über die Anwendung zu wissen, bin ich mir nicht sicher, ob sie zu 100 % notwendig ist, aber im Allgemeinen, wenn Sie es sich leisten können, halte ich es für eine gute Idee, sich vor potenzieller Datenbeschädigung oder anderen Problemen schützen zu müssen. Es stellt sicher, dass sich Ihr System in einem Ruhezustand befindet, wenn die Spannung zu niedrig abfällt. Wir können uns per E-Mail weiter unterhalten, wenn Sie weitere Details zu Ihrem Produkt in einer weniger öffentlichen Umgebung teilen möchten.