Muss ich den stm32-Mikrocontroller wirklich in den Bootloader-Modus versetzen, um ihn zu programmieren?

7

Ich habe eine Weile angefangen, stm32-Mikrocontroller mit einem sehr kleinen Entwicklungsboard "stm32f103c8t6" (oder einer blauen Pille) zu lernen. Als ich anfing, habe ich aus einigen Tutorials gelernt, dass ich einen Jumper wechseln muss, um ihn zu programmieren.

Geben Sie hier die Bildbeschreibung ein (Das Foto ist ein Screenshot aus einem zufälligen Tutorial, aber jedes Tutorial, das ich gesehen habe, hat das auch gesagt.)

Geben Sie hier die Bildbeschreibung ein

Der Jumper ändert - soweit ich weiß - nur den Startmodus des Prozessors, um ihn aus dem Systemspeicher (dem Bootloader) zu laden. Dies wird nur wirksam, wenn ich die Karte neu starte, um von dort aus mit dem Booten zu beginnen.

Ich weiß nicht, wie das ein "Programmiermodus" sein soll, da ich einen externen St-Link-Programmierer verwende, der SWD verwendet.

Geben Sie hier die Bildbeschreibung ein

Also meine Frage hier: Gibt es wirklich so etwas wie "Programmiermodus"? und wenn ja, wie genau funktioniert es?

Erwähnenswert ist auch, dass ich gerade versucht habe, es zu programmieren, und das Programm so funktioniert hat, wie es soll (ich hoffe, ich habe nichts vermasselt: d).

iMohaned
quelle

Antworten:

14

Sie müssen den Mikrocontroller nur in den Bootloader-Modus versetzen, wenn Sie ihn mit dem Bootloader über den UART programmieren möchten.

Generell können Sie den Mikrocontroller jederzeit über SWD programmieren.

Die Hauptausnahmen sind, wenn der Mikrocontroller ein Programm ausführt, das SWD durch Setzen eines SWJ_CFGBits deaktiviert AFIO->MAPR(z. B. um die zugehörigen Pins als GPIOs zu verwenden), oder wenn die MCU im Energiesparmodus ausgeführt wird, ohne dass die entsprechenden DBGMCUFlags gesetzt sind, um das zu halten Debug-Schnittstelle in diesen Modi aktiv. Wenn dies der Fall ist, ist es eine einfache Problemumgehung, den Mikrocontroller in den Bootloader-Modus zu versetzen, da die SWD-Schnittstelle aktiv ist (und keine Schlafmodi verwendet werden), während der Bootloader ausgeführt wird.

Dämmerung -inaktiv-
quelle
1
Dazu müssen Sie nicht einmal mit den BOOT0 / 1-Pins spielen. Ich habe den ROM-Bootloader in mehreren STM32-Familien durch sorgfältige Codierung erfolgreich neu gestartet. Die BOOT-Pins sind praktisch, aber nicht unbedingt erforderlich.
Akohlsmith
1
Beachten Sie auch, dass der ROM-Bootloader verschiedene Arten von Schnittstellen unterstützt, nicht nur UART. Obwohl der 103 über USB verfügt, ist dies keine der vom ROM-Bootloader unterstützten Schnittstellen. Bei späteren STM32-Varianten ist es so.
Chris Stratton
1
@ChrisStratton Es ist nicht unbedingt so einfach wie "spätere" Varianten, aber Sie haben im Wesentlichen Recht. ST Application Note AN2606 enthält einen ausführlichen Überblick darüber, welche STM32-Teile über welche Bootloader verfügen und welche Funktionen unterstützt werden.
Abenddämmerung -inaktiv-
@akohlsmith, das keine Raketenwissenschaft ist (6-7 Codezeilen zum Aufrufen). Der interne Bootloader ist jedoch etwas nutzlos, da er nicht überprüft, ob das Image korrekt ist, das geladene Image nicht entschlüsselt und nicht funktioniert, wenn Sie den Speicher schützen. Ich benutze in den Produktionsgeräten meine eigenen - das Schreiben ist ganz einfach und unkompliziert.
P__J__
4

Es gibt möglicherweise viele Möglichkeiten, die Karte mit verschiedenen Werkzeugen zu programmieren. Eine davon, die recht einfach zu sein scheint, ist die Verwendung von ST-Link V2 (google it) und OpenOCD.

  1. Lassen Sie beide Boot-Jumper auf "0". Verbinden Sie die SWDIO-, SWCLK- und GND-Pins mit den entsprechenden Pins des ST-Links. Schalten Sie die Platine ein und achten Sie darauf, ob sie 5 V oder 3,3 V beträgt. Der ST-Link verfügt bequem über einen 3,3-V-Ausgang, der verwendet werden kann. Da die Karte 5 V vom USB-Anschluss empfängt, schließen Sie nicht gleichzeitig andere Stromanschlüsse an den USB-Anschluss an. Es kann nützlich sein, ein Kabel mit 4 Anschlüssen auf der ST-Link-Seite und geteilten 3 + 1-Anschlüssen auf der Platinenseite zu haben. Die Karte sollte eine LED aufleuchten lassen und kann mit der anderen LED zu blinken beginnen, wenn sie programmiert ist.

  2. Wenn OpenOCD installiert ist, sind neuere Versionen möglicherweise weniger fehlerhaft (z. B. mindestens 0.9.x oder besser 0.10.x). Ältere Versionen, wie sie in Linux-Distributionen enthalten sind, haben möglicherweise Probleme mit dem Zurücksetzen der Konfiguration und erfordern das Herumspielen mit Konfigurationsdateien.

  3. [optional] Wenn Sie Linux ausführen und OpenOCD nicht als Root ausführen können, erstellen Sie eine Datei /etc/udev/rules.dmit folgendem Inhalt:

    SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0664", GROUP="stlink"

Dadurch können Mitglieder der stlinkGruppe auf das ST-Link-Gerät zugreifen. Erstellen Sie diese Gruppe und fügen Sie sich hinzu. Sie können jede geeignete Gruppe verwenden.

  1. Unter der Annahme eines Linux-Hosts und einer systemweiten OpenOCD-Standardinstallation prüfen Sie, ob die Konnektivität in Ordnung ist, die MCU aktiv ist und OpenOCD mit ihr kommunizieren kann:

     openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg

Abhängig von der OpenOCD-Version kann auch Folgendes funktionieren:

     openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg

Wenn die Dinge gut sind, druckt OpenOCD einige Informationen über die MCU (Spannung, Anzahl der HW-Haltepunkte usw.) und läuft weiter.

  1. Es ist möglicherweise möglich, OpenOCD als Daemon auszuführen und Telnet zu verwenden, aber ich denke, es ist bequemer, es jedes Mal zu starten. Angenommen, Sie haben eine ordnungsgemäß kompilierte Binärdatei, blinky.binkönnen Sie sie beispielsweise mit dem folgenden Skript in die MCU programmieren:

    OPENOCD="openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg"
    $OPENOCD -c "init" -c "reset halt" -c "stm32f1x mass_erase 0" -c "flash write_bank 0 blinky.bin 0" -c "reset run" -c "shutdown"

Beachten Sie, dass sich in diesem Skript der Dateiname befindet, den Sie anpassen müssen. Es ist wahrscheinlich eine gute Idee, mit etwas wirklich Einfachem zu beginnen.

Das oben Gesagte setzt hauptsächlich Linux als Host voraus, aber die Schritte sollten in Windows konzeptionell ähnlich sein, nachdem Treiber installiert und Anpassungen an der Installation vorgenommen wurden, z. B. Pfade usw.

AK
quelle
4

Wenn Sie einen ST-Link (SWD) -Programmierer verwenden, müssen Sie die Karte nicht in den "Programmiermodus" versetzen.

Ein Bootloader ermöglicht es dem Chip, ein neues Programm "herunterzuladen" und auszuführen. Der Jumper "Programmiermodus" signalisiert dem ROM-Bootloader mithilfe der BOOT-Pins, dass er sich zum Herunterladen eines neuen Programms vorbereiten muss. Andernfalls führt der Chip das bereits im Speicher befindliche Programm aus. Da Sie SWD zum Programmieren verwenden, wird der ROM-Bootloader nicht benötigt.

[Bearbeiten]: Wie Chris Stratton und duskwuff weiter unten hervorheben, unterstützt der STM32F103 ROM-Bootloader keine Programmierung über USB, sondern nur über UART und kann nicht gelöscht werden. Es gibt einen separaten Benutzer-Flash-Bootloader , der auf die Karte geladen werden kann und die Programmierung über USB unterstützt (dh für die Verwendung mit Arduino IDE), jedoch nicht die BOOT-Pins verwendet (daher wird der Jumper "Programmiermodus" nicht beeinflusst). .

youtooth
quelle
1
Der hier betroffene Bootloader befindet sich im ROM (oder zumindest im nicht vom Benutzer veränderbaren Flash). Es ist vom Benutzer-Flash getrennt und kann nicht über SWD gelöscht werden.
Abenddämmerung -inaktiv-
@duskwuff, danke für die Korrektur! Ich dachte an einen anderen Chip.
Youtooth
2
Dies ist falsch - der werkseitige ROM-Bootloader des STM32F103 unterstützt USB nicht , obwohl dies bei vielen späteren STM32-Varianten der Fall ist. Daher müsste jeder funktionierende USB-Bootloader für den `103 im Anwendungs-Flash und nicht im ROM gespeichert sein, und daher würden die Boot-Pins für einen normalen Flash-Boot gesetzt, nicht für einen ROM-Bootloader-Boot.
Chris Stratton
@ ChrisStratton, danke für die Korrektur! Anscheinend habe ich nur STM32-Teile verwendet, die USB / DFU für den werkseitigen Bootloader unterstützen, daher war mir nicht bewusst, dass dies auf diesem Chip nicht unterstützt wurde.
youtooth
"nur UART" ist auch nicht korrekt - es unterstützt eine Reihe von Schnittstellen, nur nicht (auf dem `103) USB.
Chris Stratton