Mikrocontroller über Bluetooth neu programmieren?

7

Ich möchte ein eingebettetes Design mit einer ARM Cortex M3 MCU und Bluetooth erstellen. Ich möchte in der Lage sein, seine Firmware regelmäßig über Bluetooth zu aktualisieren.

Ist das mit dem folgenden Chip möglich? Von ST:

http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031

Ich bin es gewohnt, Bluetooth über UART mit der MCU zu verbinden. Muss der Bootloader geändert werden, wenn ich "over the air" programmieren möchte? Wie lädt man einen eigenen Bootloader auf das Gerät? Wie sieht Bootloader-Code aus?

Ich bin auch offen für andere Vorschläge, die auf meinem Ziel basieren.

JDS
quelle
Wenn Ihr Bootloader Programme von uart akzeptiert, sollte dies einwandfrei funktionieren. Möglicherweise müssen Sie es optimieren, um Ihr BT-Modul zu initialisieren, aber das war es auch schon.
Vladimir Cravero
Ein entscheidendes Problem bei Bootloadern ist, wie der Zielchip in den Bootload-Modus versetzt wird. (Beachten Sie, dass Sie sich nicht auf das Anwendungsprogramm verlassen können!) Wie machen Sie das?
Wouter van Ooijen
2
@WoutervanOoijen Warum können Sie sich nicht darauf verlassen, dass die Anwendung Sie in einen "Bootloader" -Modus versetzt? Wie würden Sie sonst ein Remote-Firmware-Update durchführen?
Dext0rb
Zumindest für AVR-Controller wird der Bootloader-Code zuerst ausgeführt, falls vorhanden. Dann gibt es eine Sprunganweisung zur Hauptprogrammadresse in Flash.
Sherlellbc
1
Die Anwendung kann nicht kooperativ sein, beispielsweise aufgrund eines Programmierfehlers (Stromausfall) oder eines Fehlers. Für das Remote-Bootloading besteht die einzige zuverlässige Möglichkeit, das Ziel in den Bootload-Modus zu zwingen, darin, über eine separate (nicht aktualisierbare) Intelligenz zu verfügen, die dies ermöglicht (z. B. einen kleinen Mikrocontroller oder etwas, das in das Kommunikationsmodul integriert ist).
Wouter van Ooijen

Antworten:

7

Ja, Sie können mit dem STM32 Remote-Firmware-Updates durchführen.

Jetzt haben Sie zwei Möglichkeiten:

  • mit dem werkseitig programmierten Bootloader des STM32
  • Schreiben Sie Ihren eigenen Bootloader

Für die Verwendung des werkseitig programmierten Bootloaders muss der Chip mit niedrig gezogenem Pin BOOT1 und hochgezogenem BOOT0 gebootet werden, und das Bluetooth-Modul muss an ein bestimmtes USART-Peripheriegerät angeschlossen werden (es gibt je nach STM32-Modell andere Schnittstellen, aber ich gehe davon aus, dass USART macht hier am meisten Sinn). Außerdem müssen Sie eine App - Schnittstelle mit dem Bootloader schreiben, im Anschluss an die Befehlsprotokoll Bootloader , die dokumentiert ist hier . Um zu vermeiden, dass Code für die Schnittstelle zum Bootloader geschrieben wird, können Sie die STM32 Flash Loader-Demonstratoranwendung verwenden . Dies erfordert natürlich, dass das andere Ende der Bluetooth-Verbindung an einen PC angeschlossen ist, sodass dies nicht in jedem Szenario sinnvoll ist.

Die andere Möglichkeit besteht darin, einen eigenen Bootloader zu schreiben, der Ihnen mehr Kontrolle gibt. Sie können den Bootloader beispielsweise mit einer Nur-Software-Sequenz auslösen, sodass Sie bestimmte Pins nicht wie vom werkseitig programmierten Bootloader gefordert festlegen müssen. Das Schreiben eines solchen Bootloaders ist natürlich viel aufwändiger als das Verwenden eines Bootloaders, der bereits mit der MCU geschrieben, getestet und ausgeliefert wurde.

Einige kurze Kommentare zum Schreiben Ihres eigenen Bootloaders. Ein Bootloader ist ein Teil des Firmware-Codes wie jeder andere. Es wird während des Produktions- (oder Debugging-) Prozesses zusammen mit dem Hauptcode in die MCU geladen.

Obwohl der Bootloader zum Neuprogrammieren der Firmware der MCU verwendet wird, verdient er einige besondere Überlegungen, obwohl er wie jeder andere Code ist. Zunächst möchten Sie der Einfachheit halber Ihren Bootloader zu einem vollständig von Ihrem Hauptcode getrennten Code machen. Bearbeiten Sie die Linker-Skripte des Bootloaders und des Hauptcodes so, dass jeweils ein völlig anderes Segment des Flash-Speichers verwendet wird. Auf diese Weise können Sie den Hauptcode aktualisieren, ohne den Bootloader zu berühren. Wenn der Bootloader Teil des Hauptcodes ist und der Aktualisierungsprozess auf ein Problem stößt, ist Ihr Gerät blockiert. Bootloader-Code muss sehr seinZuverlässig, da ein Fehler in einem Bootloader den Unterschied zwischen dem Benutzer, der das Gerät nach einem verpfuschten Update selbst warten kann, und dem Zwang, es zu einem Servicecenter zu bringen, darstellen kann. Persönlich würde ich den Bootloader so klein und einfach wie möglich machen und sogar so weit gehen, Interrupts zu vermeiden, da sie den Code in gewisser Weise weniger vorhersehbar machen. Normalerweise bin ich nur für Interrupts, aber dies ist der einzige Fall, in dem ich dagegen bin, sie zu verwenden.

Kurz gesagt, ein Bootloader wird beim Booten des Geräts geladen und übergibt normalerweise nur die Kontrolle an den Hauptcode. Wenn Sie jedoch ein Firmware-Update durchführen, führt der Bootloader stattdessen nach dem Booten seinen eigenen Code aus. Dieser Code muss eine Art Kommunikation (in Ihrem Fall) oder einen Speichertreiber enthalten, damit er die Binärdatei für den aktualisierten Code über Bluetooth, Ethernet, eine SD-Karte, ein Flash-Laufwerk oder was auch immer empfangen / lesen kann. Anschließend wird der alte Code gelöscht und der Flash-Speicher mit dem neuen Code neu programmiert.

Einer der Tricks, die beim Neuprogrammieren des Flash-Speichers ausgeführt werden müssen, besteht darin, einen Teil des Bootloader-Codes in den RAM zu verschieben (zu kopieren), da Sie während der Programmierung keinen Code aus Flash ausführen können (auch wenn sich die gelesene Adresse von der unterscheidet die zu programmierende Adresse). Außerdem muss sich der aktualisierte Binärcode, der in Flash geschrieben werden soll, ebenfalls im RAM befinden. Normalerweise ist nicht genügend RAM vorhanden, um den vollständigen Code für das Update zu speichern. Daher ist es nicht ungewöhnlich, einen Teilcodeblock zu empfangen / lesen, zu schreiben, einen anderen Teilcodeblock zu empfangen / zu lesen, ihn zu schreiben usw.

Das Programmieren des Flash-Speichers ist keine einfache Sache, Daten an die gewünschten Adressen zu schreiben. Für jedes Mitglied der STM32-Serie gibt es ein Flash-Programmierhandbuch ( hier ist beispielsweise das Handbuch für die STM32F10x-Serie). Kurz gesagt, aufgrund von Details auf niedriger Ebene zur Implementierung des Flash-Speichers müssen Sie vor dem Neuprogrammieren eines bestimmten Blocks einen Löschbefehl ausgeben. Außerdem können Sie während der Programmierung keine Lesevorgänge aus Flash durchführen. Vergessen Sie daher Interrupts, DMA usw., es sei denn, es besteht keine Chance, dass sie versuchen, während des Schreibens aus Flash zu lesen.

Schweine
quelle
Vielen Dank! Genau das, wonach ich suche - ich hatte gehört, dass STM32 dies ermöglicht. Zwei Fragen: Wie lädt man einen eigenen Bootloader auf das Gerät? Wie sieht Bootloader-Code aus?
JDS
1
Ich habe Antworten auf die Fragen in Ihrem Kommentar zu meinem obigen Beitrag hinzugefügt. Bitte verschieben Sie diese Fragen in den Hauptteil der obigen Hauptfrage, indem Sie sie bearbeiten, damit Benutzer, die später auf diese Frage stoßen, nicht das Gefühl haben, dass die Antwort von der Frage getrennt ist.
Swineone