Füllen der Firmware in STM32 über USB

Published on April 09, 2017

Füllen der Firmware in STM32 über USB

  • Tutorial
Bild

In meinem Projekt verwende ich den Mikrocontroller STM32F103C8 und das Framework stm32duino . Dieser Arduino-Klon bietet einen speziellen Bootloader, mit dem Sie Firmware über USB hochladen können, ohne externe Komponenten wie ST-Link oder USB-UART-Adapter zu verwenden.

Heute musste ich mit einem nackten Controller unter CooCox und ohne stm32duino arbeiten. Aber das ist das Problem. Sogar ein einfacher Blinker, der durch diesen Bootloader gegossen wurde, funktioniert nicht.

Lass es uns herausfinden. Vielleicht scheinen meine Berechnungen jemandem gemein zu sein. Aber ich fange gerade an, die STM32-Controller zu studieren, und auf der Suche nach einem Problem habe ich mindestens einen halben Tag getötet. Dieser Artikel verkürzt plötzlich die Entwicklungszeit.

Ich habe nichts gegen ST-Link und andere Debugger. Aber es wird nicht in meinem fertigen Gerät sein, aber es wird definitiv USB sein. Warum nicht gleich die Gelegenheit nutzen, die Firmware per USB zu aktualisieren? Ich persönlich finde diese Methode bequem. Trotzdem habe ich bereits ein Netzkabel an die Stromversorgung und USB Serial angeschlossen.

Mal sehen, wie der Bootloader funktioniert. Zuerst am Beispiel von AVR-Controllern. Warum habe ich mich an ihn erinnert? Ich wechselte von Arduino und erwartete unbewusst dasselbe Verhalten. Das STM32 stellte sich jedoch als anders heraus. Weil ich über den Unterschied zwischen diesen beiden Mikrocontrollern sprechen möchte.

So In AVR ATMega-Mikrocontrollern können Sie am Ende des Spülvorgangs eine bestimmte Menge Speicherplatz unter dem Bootloader reservieren. Mit Hilfe von Sicherungsbits können Sie einstellen, von welcher Adresse das Programm starten soll. Wenn kein Bootloader vorhanden ist, startet das Programm an der Adresse 0x0000. Wenn ein Bootloader vorhanden ist, beginnt er an einer anderen Adresse (z. B. in ATMega32 mit 0x3C00, wenn die Bootloadergröße 2k beträgt).

Bild

Wenn der Bootloader seine Arbeit erledigt hat, überträgt er die Steuerung von der Adresse 0x0000 an das Hauptprogramm. Ie Das Programm beginnt immer mit der Adresse 0x0000. Der Compiler und der Linker arbeiten unter Berücksichtigung, dass sich der Code am Anfang des Adressraums befindet.

Bei STM32-Mikrocontrollern ist dies nicht der Fall. Alle Programme beginnen an der Adresse 0x0800000. Der Bootloader ist nicht so besonders. Dies ist das gleiche Programm, das an derselben Startadresse beginnt. Während des Betriebs kann der Bootloader Firmware empfangen (über USB oder UART, von einem Flash-Laufwerk lesen, von einem Satelliten empfangen, von einem beliebigen Gerät abrufen, ...) und an Adressen schreiben, die über dem Bootloader selbst liegen. Und natürlich, am Ende ihrer Arbeit, die Kontrolle auf das Hauptprogramm zu übertragen.

Bild

Beim Kompilieren der Firmware müssen Sie also wissen, wo der Bootloader die Firmware schreibt und die Adressen entsprechend anpasst.

Darauf mit der Theorie von allem. Wir machen weiter zu üben. Nachfolgend finden Sie eine Schritt-für-Schritt-Anleitung, um den USB-Bootloader an die Mikrocontroller der Serie STM32F1xx zu schrauben, und möglicherweise auch an einige andere.

Es gibt jedoch einige Einschränkungen bei der Schaltung. Hier bin ich leider nicht stark. ITP benötigt einen 1,5-Punkt-Pull-Up-Widerstand für den PA12-Anschluss (auch als USB D + bezeichnet). Dadurch kann der Bootloader zu den richtigen Zeiten eine Verbindung zum USB herstellen und trennen.

Anweisung:

  • Github.com/rogerclarkmelbourne/STM32duino-bootloader wird heruntergeladen . Im Verzeichnis STM32F1 \ binaries befindet sich bereits ein Paket von kompilierten Bootloadern für verschiedene Boards. Der Index am Ende des Dateinamens gibt an, wo die LED angeschlossen ist. Bei meiner Platine, bei der die LED an Pin C13 angeschlossen ist, habe ich die Datei generic_boot20_pc13.bin verwendet.

  • Blitz gemäß den Anweisungen . Ja, Sie benötigen einen USB-UART-Adapter, Sie können jedoch auch den Debugger verwenden .

  • Jetzt kann der Mikrocontroller über den USB-Bootloader heruntergeladen werden. Sie müssen jedoch die Firmware selbst noch korrigieren. Und Sie müssen zwei Dinge tun:

    • Geben Sie die Startadresse des Linkers an. In CooCox erfolgt dies in den Projekteinstellungen, auf der Registerkarte Verknüpfung, im Bereich Speicherbereiche und der Startadresse von IROM1. Der Bootloader belegt die ersten 8 Kilobytes, daher ist die Startadresse der Firmware 0x0800000 + 0x2000 = 0x08002000. Das Größenfeld sollte wahrscheinlich ebenfalls um 8.000 reduziert werden.

    • Irgendwo am Anfang des Programms vor der Initialisierung der Peripherie einen Anruf tätigen

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);


      UPDATE 17.05.2014: In der modernen Version des STM32Cube ist die Funktion NVIC_SetVectorTable () nicht verfügbar. Sie können stattdessen das definierte VECT_TAB_OFFSET in der Datei system_stm32f1xx.c (oder einem ähnlichen für einen anderen Mikrocontroller) festlegen.

  • Die Firmware-Firmware kann dem stm32duino-Projekt entnommen werden . Suchen Sie im Tools-Verzeichnis nach einem Skript mit dem Namen maple_upload. Ich habe nur die Schraubenversion verwendet - maple_upload.bat.

  • Laufen Sie so:

    "maple_upload.bat" COM20 2 1EAF:0003  "Path\To\Firmware.bin"

    Anstelle von COM20 müssen Sie Ihren Port, an dem der Mikrocontroller angeschlossen ist, ersetzen.

    Zalivator Ding ist sehr sanft und mag keine relativen Pfade. Der Pfad zur Firmware muss also vollständig angegeben werden.

    1EAF: 0003 ist die VID und PID

    2 ist der AltID-Parameter, der angibt, dass die Firmware auf 0x08002000 hochgeladen werden sollte ( hier lesen ).

Noch ein bisschen Nuance. Bevor Sie die Firmware hochladen, müssen Sie den Bootloader starten. Am einfachsten ist es, die Reset-Taste zu drücken. Danach startet der Bootloader und die Firmware wartet einige Sekunden. Wenn zu diesem Zeitpunkt niemand maple_upload gestartet hat, überträgt der Loader die Steuerung an die Hauptfirmware.

Um nicht jedes Mal Resets drücken zu müssen, verwenden Motherboards, die auf libmaple / stm32duino basieren, einen Trick. Sie hören die serielle USB-Schnittstelle. Wenn dort ein DTR-Signal auftritt und eine Schlüsselsequenz von Bytes übertragen wird, wird der Mikrocontroller erneut in den Bootloader geladen. Siehe rxHook () - Funktion .

Dies kann zu Unannehmlichkeiten führen. Wenn der Mikrocontroller zaglyuchil aufgehängt hat, dann hört er nicht mehr auf den Port. Daher kann er die Tastenfolge nicht hören und den Bootloader neu starten. Dann nur zurücksetzen, um zu helfen.

Das ist alles Ich hoffe, mein Artikel wird Aufschluss darüber geben, wie der Bootloader im STM32 funktioniert und wie Sie die Firmware über den USB-Port herunterladen können. Leider ist die Eintrittsschwelle immer noch hoch, aber plötzlich hilft jemand, mein Artikel, um sie zu überwinden.