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.
Antworten:
Ja, Sie können mit dem STM32 Remote-Firmware-Updates durchführen.
Jetzt haben Sie zwei Möglichkeiten:
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.
quelle