Generieren und flashen Sie eine Binärdatei für STM32

Ich habe ein Bootloader-Image für meinen STM32 erstellt und es in einem bestimmten Bereich des Speichers gespeichert. Ich habe ein neues Keil-Projekt, das die Anwendungsschicht darstellt. Standardmäßig generiert Keil eine HEX-Datei. Was ich tun möchte, ist, das Bootloader-Image beizubehalten und die Anwendungsschicht in einem anderen Bereich im Speicher zu flashen. Die endgültige FW überprüft einen GPIO-Eingang. Wenn es sich auf einem hohen Level befindet, wird das Bootloader-Image gestartet und die Anwendungsschicht mit einem neuen Image aktualisiert, andernfalls (der GPIO-Eingang befindet sich auf einem niedrigen Level) Der normale Modus wird aktiviert und die Anwendung wird ausgeführt. Meine Frage ist:

  1. Soll ich die generierte Hex-Datei der Anwendungsschicht in eine BIN-Datei konvertieren, um sie in einen bestimmten Bereich des Speichers zu flashen?
  2. Wie kann ich die Startadresse der Anwendungsschicht und ihre Länge angeben?.
  3. Was soll ich mit der leeren Adresse tun, die für das Bootloader-Image reserviert ist, wenn ich ein Tool zum Konvertieren einer HEX-Datei in eine Binärdatei verwende?

Antworten (2)

  1. Das hängt von Ihrer Bootloader-Anwendung ab. Kann es HEX-Dateien lesen?
  2. Sie verwenden den Zieldialog in den Zieloptionen oder eine Streuladedatei .
  3. Sie fügen keine leeren Bereiche in das Bild ein. Keil enthält ein Tool zum Erstellen von Binärdateien.

Beachten Sie, dass Sie Ihre Binärdatei möglicherweise mit einer Prüfsumme signieren möchten. Der Armlinker kann dies nicht. Aber Sie können dies mit SRecord tun . (auch Regionen entfernen/konvertieren)

Ein Beispiel für die Verwendung von SRecord zum Hinzufügen einer Prüfsumme finden Sie im Abschnitt Starttests des ROM-Selbsttests im MDK-ARM- Anwendungshinweis.

Ich bin mit der Keil-Toolchain nicht vertraut, daher kann ich nur allgemeine Antworten geben, deren Einzelheiten Sie in Ihrem Toolchain-Handbuch recherchieren müssen.

  1. HEX-Dateien enthalten Informationen darüber, wo die Bytes platziert werden sollen. Dies kann in Ihrer Situation nützlich sein oder auch nicht. Die einfachen Bootloader, denen ich bisher begegnet bin, haben nur Binärdateien verarbeitet. Sie fingen an, Bytes an die Stelle zu schreiben, an der Sie es angegeben haben, sodass die Adressverwaltung außerhalb des Bootloaders lag.
  2. Dies geschieht normalerweise mit einer Linker-Datei. Die Linker-Datei enthält den Adressraum Ihrer Anwendung – der nicht der gesamte verfügbare Speicher eines Geräts sein muss. In einer IDE gibt es normalerweise einen Dialog, mit dem Sie diese Einstellungen ändern können. In einem Projekt, das auf der Befehlszeile erstellt wird, müssen Sie es entweder über Befehlszeilenparameter angeben, aber normalerweise ist es eine Datei (sie können ziemlich komplex werden).
  3. Berücksichtigen Sie nicht den (leeren) Platz, der von anderen Teilen verwendet wird. Beginnen Sie mit dem ersten Byte Ihrer Anwendung.
  4. Verwenden Sie einen Prüfsummenmechanismus, um sicherzustellen, dass Sie eine lauffähige Anwendung haben. Platzieren Sie zum Beispiel einen CRC32 am Ende Ihres Leerzeichens Ihrer Anwendung, füllen Sie das unbenutzte Leerzeichen mit 0xFF, nur um sicherzustellen, dass diese auch enthalten sind. (Anwendung - 0xFFs - 32 Bit CRC am Ende). Hoffentlich hat Ihre Toolchain ein Tool dafür (Linker tun dies wahrscheinlich nicht, für IAR ist es das ielftool, das dies tut).