
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).
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.
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:
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.