Laden Sie die Firmware über USB auf STM32 herunter

Bild

In meinem Projekt verwende ich den STM32F103C8-Mikrocontroller und das stm32duino-Framework . Dieser Klon von Arduino 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 hier ist das Problem. Selbst eine einfache Blinkerlampe, die durch diesen Bootloader gegossen wird, funktioniert nicht.

Lass es uns richtig machen. Vielleicht scheinen meine Berechnungen für einige alltäglich zu sein. Aber ich fange gerade an, STM32-Controller zu studieren und habe mindestens einen halben Tag getötet, um das Problem zu finden. Plötzlich verkürzt dieser Artikel die Entwicklungszeit für jemanden.

Ich habe nichts gegen ST-Link und andere Debugger. Aber in meinem fertigen Gerät wird es nicht sein, aber es wird definitiv USB geben. Warum nicht sofort die Möglichkeit zum Aktualisieren der Firmware über USB festlegen? Persönlich finde ich diese Methode bequem. Umso mehr, ich habe bereits ein Kabel angeschlossen, an das Strom und USB Serial angeschlossen sind.

Mal sehen, wie der Bootloader funktioniert. Erste Schritte mit dem Beispiel von AVR-Controllern. Warum habe ich mich an ihn erinnert? Ich wechselte von Arduino und erwartete unbewusst das gleiche Verhalten. Aber in STM32 lief alles anders. Daher möchte ich über den Unterschied zwischen diesen beiden Mikrocontrollern sprechen.

Also. In AVeg ATMega-Mikrocontrollern kann gegen Ende des Flashs eine bestimmte Speichermenge für den Bootloader reserviert werden. Mit Sicherungsbits können Sie steuern, von welcher Adresse aus das Programm gestartet wird. Wenn kein Bootloader vorhanden ist, startet das Programm an der Adresse 0x0000. Wenn es einen Bootloader gibt, beginnt er an einer anderen Adresse (z. B. in ATMega32 mit 0x3C00, wenn die Bootloader-Größe 2 KB beträgt).

Bild

Wenn der Bootloader seine Arbeit erledigt hat, überträgt er die Steuerung von der Adresse 0x0000 an das Hauptprogramm. Das heißt, Das Programm startet immer um 0x0000. Der Compiler und der Linker arbeiten mit der Tatsache, dass sich der Code am Anfang des Adressraums befindet.

Bei STM32-Mikrocontrollern ist alles anders. Alle Programme starten ab der Adresse 0x0800000. Ein Bootloader ist nicht so besonders. Dies ist das gleiche Programm, das von derselben Startadresse startet. Dabei kann der Bootloader die Firmware empfangen (über USB oder UART, von einem USB-Flash-Laufwerk lesen, von einem Satelliten empfangen, von einem Unterraum abrufen, was auch immer ...) und an Adressen schreiben, die höher als der Bootloader selbst sind. Und natürlich am Ende seiner Arbeit die Kontrolle auf das Hauptprogramm übertragen.

Bild

Wenn Sie also die Firmware kompilieren, müssen Sie wissen, wo der Bootloader die Firmware schreibt, und die Adressen entsprechend anpassen.

Das ist alles mit Theorie. Lass uns weiter üben. Im Folgenden finden Sie eine schrittweise Anleitung zum Anbringen des USB-Bootloaders an den Mikrocontrollern der STM32F1xx-Serie und möglicherweise auch an einigen anderen.

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

Anleitung:

  • Laden Sie github.com/rogerclarkmelbourne/STM32duino-bootloader herunter. Im Verzeichnis STM32F1 \ binaries befindet sich bereits ein Paket kompilierter Bootloader für verschiedene Boards. Der Index am Ende des Dateinamens gibt an, wo die LED angeschlossen ist. Bei meiner Karte, bei der die LED an Pin C13 angeschlossen ist, habe ich die Datei generic_boot20_pc13.bin verwendet.

  • Wir blinken gemäß den Anweisungen . Ja, hier benötigen Sie einen USB-UART-Adapter, aber Sie können auch einen Debugger verwenden .

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

    • Geben Sie dem Linker eine Startadresse. In CooCox erfolgt dies in den Projekteinstellungen, Registerkarte Verknüpfung, Abschnitt Speicherbereiche, IROM1-Startadresse. Der Bootloader benötigt die ersten 8 Kilobyte, was bedeutet, dass die Startadresse der Firmware 0x0800000 + 0x2000 = 0x08002000 lautet. Das Feld Größe sollte wahrscheinlich auch um 8 KB reduziert werden.

    • Rufen Sie irgendwo zu Beginn des Programms an, bevor Sie die Peripherie initialisieren

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); 


      UPDATE 17.05.2008: In der modernen Version von STM32Cube gibt es keine NVIC_SetVectorTable () -Funktion. Stattdessen können Sie den Fehler VECT_TAB_OFFSET in der Datei system_stm32f1xx.c (oder ähnlichem für einen anderen Mikrocontroller) beheben.

  • Die Firmware-Füllung kann aus dem stm32duino-Projekt entnommen werden . Suchen Sie im Tools-Verzeichnis nach einem Skript namens maple_upload. Ich habe nur die Windows-Version 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 ersetzen, an dem der Mikrocontroller angeschlossen ist.

    Der Ausgießer ist eine sehr zarte Sache, er mag keine relativen Wege. Daher muss der Pfad zur Firmware vollständig angegeben werden.

    1EAF: 0003 ist die VID und PID

    2 - Dies ist der AltID-Parameter, der angibt, dass die Firmware unter 0x08002000 hochgeladen werden soll (lesen Sie hier ).

Noch ein paar Nuancen. Vor dem Hochladen der Firmware müssen Sie den Bootloader ausführen. Am einfachsten ist es, die Reset-Taste zu drücken. Danach startet der Bootloader und wartet einige Sekunden auf die Firmware. Wenn zu diesem Zeitpunkt niemand maple_upload gestartet hat, überträgt der Bootloader die Kontrolle an die Hauptfirmware.

Um nicht jedes Mal auf Zurücksetzen zu drücken, verwenden libmaple / stm32duino-basierte Boards einen Trick. Sie hören auf die serielle USB-Schnittstelle. Wenn dort ein DTR-Signal auftritt und eine Schlüsselfolge von Bytes übertragen wird, wird der Mikrocontroller erneut in den Bootloader geladen. Schauen Sie sich die Funktion rxHook () an .

Dies kann zu Unannehmlichkeiten führen. Wenn der Mikrocontroller heruntergefahren wird und hängt, 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 gibt Aufschluss darüber, wie der Bootloader in STM32 funktioniert und wie Firmware über einen USB-Anschluss heruntergeladen wird. Leider ist die Eintrittsschwelle immer noch hoch, aber plötzlich wird mein Artikel jemandem helfen, sie zu überwinden.

Source: https://habr.com/ru/post/de403007/


All Articles