Ich habe eine Weile angefangen, den stm32-Mikrocontroller mit einem sehr kleinen Entwicklungsboard "stm32f103c8t6" (oder blaue Pille) zu lernen. Als ich anfing, lernte ich aus einigen Tutorials, dass ich einen Jumper umstecken muss, um ihn zu programmieren.
(Das Foto ist ein Screenshot aus einem zufälligen Tutorial, aber jedes Tutorial, das ich mir angesehen habe, sagte das auch)
Der Jumper ändert - soweit ich weiß - nur den Boot-Modus des Prozessors, um ihn aus dem Systemspeicher (dem Bootloader) zu laden, was nur wirksam wird, wenn ich das Board neu starte, um von dort aus zu booten.
Ich weiß nicht, wie das ein "Programmiermodus" sein soll, da ich einen externen ST-Link-Programmierer verwende, der SWD verwendet.
Also meine Frage hier, gibt es wirklich so etwas wie "Programmiermodus"? und wenn ja, wie genau funktioniert das?
Erwähnenswert ist auch, dass ich gerade versucht habe, es zu programmieren, und das Programm funktionierte so, wie es sollte (ich hoffe, ich habe nichts vermasselt :d ).
Sie müssen den Mikrocontroller nur in den Bootloader-Modus versetzen, wenn Sie ihn mit dem Bootloader über den UART programmieren möchten.
Grundsätzlich können Sie den Mikrocontroller jederzeit über SWD programmieren.
Die primären Ausnahmen sind, wenn der Mikrocontroller ein Programm ausführt, das SWD durch Setzen eines SWJ_CFG
Bits deaktiviert AFIO->MAPR
(z. B. um die zugehörigen Pins als GPIOs zu verwenden), oder wenn die MCU im Energiesparmodus läuft, ohne dass die entsprechenden DBGMCU
Flags gesetzt sind, um die Debug-Schnittstelle in diesen Modi aktiv. Wenn einer dieser Fälle zutrifft, 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.
Es gibt möglicherweise viele Möglichkeiten, das Board mit verschiedenen Tools zu programmieren. Eine davon, die ziemlich einfach zu sein scheint, ist die Verwendung von ST-Link V2 (google it) und OpenOCD.
Lassen Sie beide Bootjumper auf "0". Verbinden Sie die Pins SWDIO, SWCLK, GND mit den entsprechenden Pins des ST Link. Legen Sie Strom an die Platine an und achten Sie darauf, ob es 5 V oder 3,3 V beträgt. Der ST-Link verfügt praktischerweise über einen 3,3-V-Ausgang, der verwendet werden kann. Da die Platine 5 V vom USB-Anschluss erhält, verbinden Sie keine anderen Stromanschlüsse gleichzeitig mit dem USB-Anschluss. Es kann sinnvoll sein, ein Kabel mit 4 Anschlüssen auf der ST-Link-Seite und geteilten 3+1-Anschlüssen auf der Platinenseite zu haben. Die Platine sollte eine LED aufleuchten und kann mit der anderen blinken, wenn sie programmiert ist.
Haben Sie OpenOCD installiert, neuere Versionen können weniger fehlerhaft sein (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 z. B. dem Zurücksetzen der Konfiguration und erfordern das Hantieren mit Konfigurationsdateien.
[optional] Wenn Sie Linux ausführen und OpenOCD nicht als Root ausführen möchten, erstellen Sie eine Datei /etc/udev/rules.d
mit folgendem Inhalt:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0664", GROUP="stlink"
Dadurch können Mitglieder der stlink
Gruppe auf das ST-Link-Gerät zugreifen. Erstellen Sie diese Gruppe und fügen Sie sich selbst hinzu. Sie können jede geeignete Gruppe verwenden.
Unter der Annahme eines Linux-Hosts und einer systemweiten OpenOCD-Standardinstallation prüfen Sie, ob die Konnektivität in Ordnung ist, die MCU am Leben ist und OpenOCD mit ihr kommunizieren kann:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg
Je nach 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.
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, sagen wir, blinky.bin
, können Sie sie 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 Obige geht hauptsächlich von Linux als Host aus, aber die Schritte sollten in Windows konzeptionell ähnlich sein, nachdem Sie Treiber installiert und Anpassungen an der Installation vorgenommen haben, wie z. B. Pfade und so weiter.
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 "Programmiermodus"-Jumper verwendet die BOOT-Pins, um dem ROM-Bootloader zu signalisieren, dass er bereit sein muss, ein neues Programm herunterzuladen, andernfalls beginnt der Chip mit der Ausführung des Programms, das sich bereits im Speicher befindet. Da Sie SWD zum Programmieren verwenden, wird der ROM-Bootloader nicht benötigt.
[Bearbeiten]: Wie Chris Stratton und Duskwuff unten hervorheben, unterstützt der STM32F103-ROM-Bootloader keine Programmierung über USB, sondern nur UART, und er kann nicht gelöscht werden. Es gibt einen separaten Benutzer-Flash-Bootloader , der auf das Board geladen werden kann, der die Programmierung über USB unterstützt (dh zur Verwendung mit Arduino IDE), aber die BOOT-Pins nicht verwendet (also nicht vom Jumper "Programmiermodus" betroffen ist). .
Aus dem Produktspezifikationsdatenblatt DS5319 PDF , Rev. 17 (vom August 2015), Abschnitt 2.3.8, Boot-Modi:
Beim Start werden Boot-Pins verwendet, um eine von drei Boot-Optionen auszuwählen:
- Booten Sie vom Benutzer-Flash
- Booten Sie vom Systemspeicher
- Booten Sie vom eingebetteten SRAM
Der Bootloader befindet sich im Systemspeicher. Es wird verwendet, um den Flash-Speicher mithilfe von USART1 neu zu programmieren. Weitere Einzelheiten entnehmen Sie bitte AN2606.
Aus der Einführung von AN2606 PDF (Rev. 42, vom Dez. 2019) : „Der Bootloader ist im internen Boot-ROM-Speicher (Systemspeicher) von STM32-Geräten gespeichert. Er wird von ST während der Produktion programmiert. Seine Hauptaufgabe besteht darin, die Anwendung herunterzuladen Programmieren Sie über eines der verfügbaren seriellen Peripheriegeräte (USART, CAN, USB, I2C, SPI usw.) in den internen Flash-Speicher. Für jede serielle Schnittstelle ist ein Kommunikationsprotokoll mit einem kompatiblen Befehlssatz und kompatiblen Sequenzen definiert. Dieses Dokument gilt für die in Tabelle 1 aufgeführten Produkte. Sie werden im gesamten Dokument als STM32 bezeichnet.“
Im Kapitel über den Bootloader der STM32F10xxx-Geräte heißt es: „Nach der Initialisierung lautet die USART1-Konfiguration: 8 Bits, gerade Parität und 1 Stoppbit.“ "PA10-Stift: USART1 im Empfangsmodus", "PA9-Stift: USART1 im Sendemodus".
Dann gibt es AN3155 , das das eigentliche USART-Protokoll beschreibt, das initiiert wird, wenn der STM32 das Byte empfängt 0x7F
.
Kohlschmied
Chris Stratton
Benutzer39382
0___________
Arosha Dissanayake