Vor-Ort-Aktualisierung der Firmware im DFU-Modus eines Mikrocontrollers

Von Jacob Beningo

Zur Verfügung gestellt von Nordamerikanische Fachredakteure von DigiKey

Für beinahe jedes Embedded-System muss es möglich sein, die Firmware vor Ort zu aktualisieren, um neue Funktionen hinzuzufügen oder Fehler zu beheben. Diese Vor-Ort-Aktualisierungen können sich jedoch kompliziert gestalten, da ein Entwickler entweder einen eigenen Bootloader programmieren oder mit dem Bootloader eines Lieferanten von Drittanbieterkomponenten arbeiten muss.

Doch es gibt eine einfachere Möglichkeit! In diesem Artikel erfahren Sie, wie Sie die DFU-Funktion (Device Firmware Update) verwenden, die zwar in viele Mikrocontroller integriert ist, aber häufig übersehen wird.

Durchführungsoptionen für Firmware-Aktualisierungen

Die vollständige Entwicklung eines Bootloaders ist kein triviales Unterfangen. Zuerst müssen die Entwickler den Flash-Speicher aufgliedern, damit mehrere Anwendungen koexistieren können. Anschließend müssen sie nach einer Möglichkeit suchen, um die kompilierte Binärdatei ohne Zuhilfenahme eines Programmierwerkzeugs auf den Mikrocontroller zu übertragen. Hierfür ist entweder die Entwicklung eines Kommunikationsprotokolls erforderlich oder eine Erhöhung der Systemkomplexität, indem externer Speicher zur Speicherung neuer Images hinzugefügt wird. Wahlweise können sie auch den internen Speicher des Mikrocontrollers erweitern.

Auch die Software selbst kann sehr komplex ausfallen, da der Bootloader den Systemstatus festlegen und erkennen muss, ob es sicher ist, zum Anwendungscode zu springen oder nicht.

Ein benutzerdefinierter Bootloader bietet den Entwicklern ein hohes Maß an Flexibilität bei der Anwendungserstellung. Es gibt jedoch auch einen Standard zur Firmware-Aktualisierung, der für viele Anwendungen genutzt werden kann und kein Eingreifen eines Entwicklers erfordert: die integrierte DFU-Klasse des USB-Standards. Diese Möglichkeit kann zur Vor-Ort-Aktualisierung des Anwendungscodes eines Mikrocontrollers über seinen USB-Anschluss genutzt werden. Firmware-Aktualisierung und Entwicklungszyklus lassen sich auf diese Weise erheblich beschleunigen.

Der DFU-Modus ist inzwischen so weit verbreitet, dass manche Anbieter von Mikrocontrollern wie beispielsweise STMicroelectronics sogar die Software beilegen, die zur Durchführung der im ROM hartcodierten Aktualisierungen benötigt wird. Diejenigen, die dies nicht tun, stellen häufig Beispielcode zur Unterstützung des DFU-Modus zur Verfügung.

Auswählen eines DFU-fähigen Mikrocontrollers

Am einfachsten lässt sich der DFU-Modus unterstützen, indem ein Mikrocontroller ausgewählt wird, bei dem der DFU-Modus bereits im ROM enthalten ist, wie etwa bei den Mikrocontrollern der Baureihe STM32 von STMicroelectronics. Am interessantesten für einen Entwickler sind hierbei die Komponenten auf dem STM32 IoT Discovery Node und dem STM32F429 Discovery Kit.

Abbildung: STM32 IoT Discovery Node von STMicroelectronics

Abbildung 1: Der STM32 IoT Discovery Node von STMicroelectronics basiert auf einem ARM® Cortex®-M4-Kern mit einer STM32L475-MCU, der DFU-Modusfunktionen für Firmware-Aktualisierungen enthält. Diese spezielle Komponente ist für die Verwendung als IoT-Knoten konzipiert. (Bildquelle: STMicroelectronics)

Beim STM32 IoT Discovery Node handelt es sich um eine kostengünstige Entwicklungskarte, die als IoT-Sensorknoten konzipiert ist. Die Karte verfügt über verschiedene Schnittstellen (z. B. Wi-Fi und Bluetooth), um die Karte zu verbinden. Interessant dabei ist, dass der Onboard-STM32L475 es Entwicklern ermöglicht, DFU-Funktionen auf einer Komponente zu testen und zu verwenden, die entwickelt wurde, um eine Verbindung zum Internet herzustellen.

Unter Entwicklern, die den DFU-Modus lediglich auf einem normalen Stand-Alone-Gerät testen möchten, ist das STM32F429 Discovery Kit ein weit verbreitetes, kostengünstiges Entwicklungskit für die Mikrocontroller der Baureihe STM32F4. Sehen wir uns jetzt an, wie ein Entwickler vorgehen würde, um den DFU-Modus auf diesen Mikrocontrollern zu testen.

Abbildung: STM32F429 Discovery Kit von STMicroelectronics

Abbildung 2: Das STM32F429 Discovery Kit von STMicroelectronics basiert auf einem ARM®-Cortex®-M4-Kern. Die MCU dieser kostengünstigen Entwicklungskarte enthält ebenfalls DFU-Modusfunktionen für Firmware-Aktualisierungen. (Bildquelle: STMicroelectronics)

Ein einfaches Beispiel zur Nutzung des DFU-Modus

Der DFU-Modus wird auf jedem Mikrocontroller auf andere Weise aufgerufen. Sehen wir uns als einfaches Beispiel an, wie ein Entwickler die Firmware eines Geräts mit einer STM32L475-MCU aktualisieren würde.

Wie bereits erwähnt, ist bei den Mikrocontrollern der Baureihe STM32 ein DFU-Bootloader im ROM enthalten. Um auf diesen Bootloader zuzugreifen, muss ein Entwickler einen der BOOT-Pins mit der Masse verbinden, während die MCU hochgefahren wird. Über die BOOT-Pins wird gesteuert, in welchem Modus die MCU hochgefahren wird. So kann sie entweder über den Flash-Speicher, den RAM oder, wie in unserem bevorzugten Fall, im DFU-Modus hochgefahren werden.

Für das Vorbereiten des Downloads einer Anwendung unter Verwendung des DFU-Modus ist kein weiteres Zutun des Entwicklers erforderlich. Die GNU Compiler Collection (GCC) unterstützt zusammen mit vielen anderen Toolchains die Erzeugung einer DFU-Datei, wenn eine Anwendung kompiliert wird. Der Entwickler muss hierbei lediglich entscheiden, wo diese Datei gespeichert werden soll. Wie bei jeder Anwendung befindet sich die DFU-Datei üblicherweise im Ordner „debug“ oder „objects“.

Die DFU-Datei ist anderen Datensatzformaten von Anwendungen wie etwa Binär-, S-Record- und Hex-Dateien sehr ähnlich. Das Dateiformat enthält Adress- und Dateninformationen, die über USB weitergeleitet, verarbeitet und anschließend an den im Flash-Speicher angegebenen Speicherort geschrieben werden. Dieser Prozess verläuft so nahtlos, dass ein Entwickler in den allermeisten Fällen nicht einmal das verwendete Protokoll überprüfen muss. Alles das läuft im Hintergrund ab, wodurch der Firmware-Aktualisierung und den Entwicklungsbemühungen ein Teil ihrer Komplexität genommen wird.

Einem Entwickler stehen verschiedene Tools zur Verfügung, um seine Anwendung im DFU-Modus auf den Mikrocontroller zu übertragen. Ein häufig verwendetes Befehlszeilenprogramm ist beispielsweise „dfu-util“. Dieses Programm ist sowohl für Linux als auch für Windows® als Open-Source-Softwarepaket verfügbar. Arbeiten die Entwickler mit der STM-Toolchain, können sie die STMicroelectronics-Anwendung „DfuSe“ (Abbildung 3) verwenden.

Abbildung: DfuSe-Tool von STMicroelectronics

Abbildung 3: Das DfuSe-Tool von STMicroelectronics kann zur Programmierung einer DFU-Datei verwendet werden, die von einem Compiler wie GCC erzeugt und auf einen DFU-fähigen Mikrocontroller geladen wird. (Bildquelle: Beningo Embedded Group)

Das DfuSe-Tool ist ein Dienstprogramm mit Windows-GUI, das jede STM32-Komponente erkennt, die im DFU-Modus gestartet wurde und über USB mit einem Computer verbunden ist. Entwickler können Informationen wie beispielsweise den einprogrammierten Anbieter und Produkt-IDs abrufen. Falls der Flash-Speicher nicht korrekt gesichert wurde, können sie sogar den Speicherinhalt der MCU kopieren und mithilfe der Upload Action Box auf dem Computer speichern.

Der Entwickler verwendet üblicherweise lediglich die Bereiche „Upgrade“ oder „Verify Action“ des DfuSe-Tools. In diesen Bereichen kann er die DFU-Anwendungsdatei auswählen und die Aktualisierung durchführen. Die Firmware-Aktualisierung wird vom DfuSe-Tool dann automatisch koordiniert, bis die gesamte Datei erfolgreich auf die MCU geladen wurde. Anschließend kann der Entwickler überprüfen, ob das Image erfolgreich übertragen wurde. Nach der Überprüfung wird wieder auf die Standardkonfiguration der BOOT-Pins umgestellt (z. B. Hochfahren über den Flash-Speicher) und der Entwickler wählt die Option „Leave DFU“ aus, um die aktualisierte Firmware zu laden und auszuführen.

Verwenden des DFU-Modus auf Komponenten ohne DFU-Unterstützung

Nur weil im ROM eines Mikrocontrollers kein DFU-Bootloader enthalten ist, heißt das nicht, dass ein Entwickler die DFU-Funktionen nicht dennoch verwenden kann. DFU ist eine USB-Klasse und wird von vielen USB-Stacks unterstützt. Das bedeutet, dass ein Entwickler seinen Anwendungsrahmen problemlos um DFU-Funktionen erweitern und so eine Aktualisierung im DFU-Modus durchführen kann.

Beispielsweise verfügt Microchip Technologys AT32UC3A3 nicht über einen integrierten DFU-Modus (Abbildung 4). Ein einfacher Anwendungshinweis beschreibt, wie DFU funktioniert und wie der Entwickler einen Mikrocontroller konfigurieren muss, um den DFU-Modus korrekt zu unterstützen.

Abbildung: Embedded-Evaluierungskarte AT32UC3A3 UC3-A3 XPLD AVR®32 mit 32-Bit-AVR-MCU von Atmel

Abbildung 4: Die Embedded-Evaluierungskarte AT32UC3A3 UC3-A3 XPLD AVR®32 mit 32-Bit-AVR-MCU verfügt nicht über einen On-Chip-DFU-Modus. Sie kann jedoch um einen Framework-USB-Code erweitert werden, der die DFU-Funktion zur Firmware-Aktualisierung aktiviert. (Bildquelle: Microchip Technology)

Tipps und Tricks zur Durchführung von Firmware-Aktualisierungen

Die Vor-Ort-Aktualisierung der Firmware muss nicht notwendigerweise nur über einen DFU-fähigen Mikrocontroller erfolgen. Ein Entwickler kann für sich entscheiden, dass ein alternativer Ansatz zur Firmware-Aktualisierung erforderlich oder praktikabler ist. Unter diesen Umständen gibt es verschiedene Tipps, die er bezüglich der Firmware-Aktualisierung berücksichtigen sollte. Zu diesen zählen:

  • Verwenden Sie eine Prüfsumme oder einen Hash-Wert, um die Anwendung zu prüfen, die in den Speicher des Mikrocontrollers geschrieben wird.
  • Wählen Sie einen Mikrocontroller mit ausreichend Speicherplatz für eine Sicherungskopie der Firmware, damit bei Problemen ein Rollback auf die vorherige Firmware-Version durchgeführt werden kann.
  • Vergewissern Sie sich bei einem Mikrocontroller mit integriertem Flashloader, dass dieser vom Endanwender nicht versehentlich ausgelöst werden kann.
  • Vergewissern Sie sich, dass jegliche Software-Bootloader kompiliert und hinsichtlich ihrer Größe optimiert wurden.
  • Sperren Sie die Flash-Peripheriegeräte, damit die Anwendung nicht aus dem Speicher ausgelesen und rückentwickelt werden kann.
  • Stellen Sie sicher, dass die Register von Stapelzeiger, Vektortabelle und Programmzähler auf den entsprechenden Anwendungswert eingestellt sind.
  • Denken Sie über die Verwendung alternativer Aktualisierungsmethoden nach, beispielsweise über Drag-and-Drop-Aktualisierungen per USB-Massenspeichergerät, wie sie für die KL46Z Freedom-Karte (Abbildung 5) demonstriert wurden.

Abbildung: KL46Z Freedom-Karte von NXP Semiconductors

Abbildung 5: Die KL46Z Freedom-Karte von NXP Semiconductors ist eine kostengünstige Entwicklungsplatine, die den DFU-Modus nicht standardmäßig unterstützt. Entwickler können alternative Aktualisierungsmethoden wie beispielsweise über ein USB-Massenspeichergerät verwenden, bei der ein neues Firmware-Image per Drag-and-Drop im internen Speicher abgelegt wird. (Bildquelle: NXP Semiconductor)

Fazit

Für beinahe jedes Embedded-System wird eine Methode benötigt, um Anwendungscode vor Ort aktualisieren und Rückrufaktionen auf diese Weise vermeiden zu können. Die Programmierung eines Bootloaders von Grund auf bzw. die Modifikation eines bereits vorhandenen Bootloaders kann den Entwicklungszyklus verkomplizieren und zu Integrationsproblemen führen.

Stattdessen können Entwickler auf die bewährte, in den USB-Standard integrierte DFU-Funktion zurückgreifen, um Vor-Ort-Aktualisierungen schnell, effizient und mit geringem bis gar keinem Aufwand durchführen zu können. Damit alles reibungslos verläuft, müssen die Entwickler wissen, ob der DFU-Modus in den verwendeten Mikrocontroller bereits integriert ist oder ob die DFU-Funktionen erst über einen zusätzlichen Software-Stack aktiviert werden müssen.
DigiKey logo

Haftungsausschluss: Die Meinungen, Überzeugungen und Standpunkte der verschiedenen Autoren und/oder Forumsteilnehmer dieser Website spiegeln nicht notwendigerweise die Meinungen, Überzeugungen und Standpunkte der DigiKey oder offiziellen Politik der DigiKey wider.

Über den Autor

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo ist ein Berater für eingebettete Software, der derzeit mit Kunden in mehr als einem Dutzend Ländern zusammenarbeitet, um ihr Unternehmen durch die Verbesserung von Produktqualität, Kosten und Markteinführungszeit dramatisch zu transformieren. Er hat mehr als 200 Artikel über Entwicklungstechniken für eingebettete Software veröffentlicht, ist ein gefragter Redner und technischer Trainer und verfügt über drei Abschlüsse, darunter einen Masters of Engineering der University of Michigan. Bei Interesse können Sie ihn unter jacob@beningo.com kontaktieren oder besuchen Sie seine Website www.beningo.com und melden Sie sich für seinen monatlichen Embedded Bytes Newsletter an.

Über den Verlag

Nordamerikanische Fachredakteure von DigiKey