Bluepill mit STM32duino-USB-Bootloader über Visual Studio Code mit Platform IO flashen
In meinem Artikel Den STM32duino-Bootloader flashen, um den STM32 direkt per USB zu programmieren habe ich erläutert, wie man mit diesem Bootloader die Arduino IDE benutzt, um eine Bluepill ganz ohne FTDI-Serial-Adapter oder ST Link-Adapter, sondern direkt über den USB-Port der Blue Pill zu flashen. Außerdem funktioniert der Serielle Monitor über den USB-Port.Eine ungeheuer praktische Sache. Aber einmal mit dem STM32duino-USB-Bootloader geflasht, mag die BluePill danach nicht mehr mit dem STLink zusammen arbeiten. Nun möchte ich für mein nächstes STM32-Projekt aber Visual Studio Code mit Platform IO benutzen und da stellte sich mir die Frage, ob das da nicht irgendwie mit geht oder ob ich quasi gezwungen bin, meine STM32duino-BluePills mit der Arduino IDE zu programmieren - man gewöhnt sich ja so schnell an den Komfort eine Syntax-Vervollständigung...
In der Arduino IDE fiel die Auswahl ja einfach:
Doch wie sage ich VSC/PIO (Visual Studio Code mit Platform IO), dass es die STM32duino-Funktionalität benutzen soll? Das ist im Grunde ganz einfach, wenn man weiß, wie es geht. Man muss nur die richtigen Zeilen in die platformio.ini des Projektes schreiben:
[env:genericSTM32F103CB]
platform = ststm32
board = genericSTM32F103CB
framework = arduino
monitor_speed = 115200
;monitor_port = COM20
;upload_port = COM20
upload_protocol = dfu
Und schon benutzt VSC/PIO das richtige Prototokoll und flasht mit Ctrl+Alt+U das kompilierte Image auf den STM32. Das war nicht immer so. Ältere Versionen von PIO hatten hier einen Bug, der allerdings inzwischen behoben ist. Also ggf. die neueste Version installieren.Einen Stolperstein hat mir PIO aber trotzdem in den Weg gelegt. Denn anstatt hochzuladen, warf er mir anfangs nur ein
Der Befehl "java" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
an den Kopf. Als Software-Entwickler, der manchmal auch Java als Programmiersprache benutzt, war mir klar, dass hier PIO wohl auf ein Java-Programm über die java.exe ausführen wollte, diese aber nicht finden konnte. Und scheinbar hat PIO Java auch nicht mit installiert.Aber glücklicherweise habe ich ein paar Java-Runtime-Installationen und weiß, das dort die java.exe im bin-Verzeichnis zu finden ist. Falls ihr noch keine Java Runtime, kurz JRE (Java Runtime Environment), habt, die gibt es unter java.com/de/download/ herunterzuladen.
Es muss aber nicht die neueste Version sein. Meine ältere 1.8.0.144 tut es genauso. Nun benötigen wir den Bin-Pfad, was bei mir d:\java_1.8.0_144\bin ist. Hier muss auch die java.exe liegen.
d:\java_1.8.0_144\bin >> dir *.exe
Verzeichnis von d:\java_1.8.0_144\bin
12.10.2017 16:23 30.784 jabswitch.exe
12.10.2017 16:23 15.936 java-rmi.exe
12.10.2017 16:23 191.040 java.exe
12.10.2017 16:23 71.232 javacpl.exe
12.10.2017 16:23 191.552 javaw.exe
12.10.2017 16:23 270.912 javaws.exe
12.10.2017 16:23 15.936 jjs.exe
12.10.2017 16:23 83.520 jp2launcher.exe
12.10.2017 16:23 15.936 keytool.exe
12.10.2017 16:23 15.936 kinit.exe
12.10.2017 16:23 15.936 klist.exe
12.10.2017 16:23 15.936 ktab.exe
12.10.2017 16:23 16.448 orbd.exe
12.10.2017 16:23 15.936 pack200.exe
12.10.2017 16:23 15.936 policytool.exe
12.10.2017 16:23 15.936 rmid.exe
12.10.2017 16:23 15.936 rmiregistry.exe
12.10.2017 16:23 15.936 servertool.exe
12.10.2017 16:23 53.312 ssvagent.exe
12.10.2017 16:23 16.448 tnameserv.exe
12.10.2017 16:23 159.296 unpack200.exe
Damit PIO jetzt die java.exe auch findet, müssen wir den Pfad in die globale Pfad-Variable von Windows aufnehmen. Dazu einmal Windows+Pause drücken, dann auf Erweiterte Systemeinstellungen und dort unten auf Umgebungsvariablen klicken.Dort dann auf Path unter Systemvariablen doppelklicken.
Hier dann ans Ende durch Semikolon getrennt, den java-bin-Pfad hinzufügen. Leider ist danach ein Neustart von Windows zwingend erforderlich, ohne geht es leider nicht.
Aber dafür weiß dann nach dem Neustart VSC/PIO auch, wo er java.exe finden kann (nämlich in dem Pfad, den wir hinzugefügt haben) und kann das Upload-Progrämmchen ausführen und das Image auf den STM32 schieben.
Zum Testen habe ich ein ganz einfaches Blink-Progrämmchen genommen, das auch einen Serial.print-Befehl beinhaltet, damit wir auch etwas auf der Konsole sehen können.
////////////////////////////////////////////////////////
// (C) 2020 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich über Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: http://cool-web.de/arduino/ //
////////////////////////////////////////////////////////
#include <Arduino.h>
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN,OUTPUT);
}
void loop() {
int state;
while (1) {
state = digitalRead(LED_BUILTIN);
state = !state;
Serial.println(state);
digitalWrite(LED_BUILTIN,state);
delay (500);
}
}
> Executing task: C:\Users\admin\.platformio\penv\Scripts\platformio.exe run --target upload <
Processing genericSTM32F103CB (platform: ststm32; board: genericSTM32F103CB; framework: arduino)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/genericSTM32F103CB.html
PLATFORM: ST STM32 6.0.0 > STM32F103CB (20k RAM. 128k Flash)
HARDWARE: STM32F103CBT6 72MHz, 20KB RAM, 128KB Flash
DEBUG: Current (blackmagic) External (blackmagic, jlink, stlink)
PACKAGES:
- framework-arduinoststm32-maple 1.10000.190819 (1.0.0)
- tool-dfuutil 1.9.200310
- tool-openocd 2.1000.190707 (10.0)
- tool-stm32duino 1.0.2
- toolchain-gccarmnoneeabi 1.70201.0 (7.2.1)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\genericSTM32F103CB\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [== ] 20.9% (used 4272 bytes from 20480 bytes)
Flash: [== ] 15.9% (used 20860 bytes from 131072 bytes)
Configuring upload protocol...
AVAILABLE: blackmagic, dfu, jlink, serial, stlink
CURRENT: upload_protocol = dfu
Looking for upload port...
Auto-detected: COM32
Uploading .pio\build\genericSTM32F103CB\firmware.bin
maple_loader v0.1
Resetting to bootloader via DTR pulse
Searching for DFU device [1EAF:0003]...
Found it!
Opening USB Device 0x1eaf:0x0003...
Found Runtime: [0x1eaf:0x0003] devnum=1, cfg=0, intf=0, alt=2, name="STM32duino bootloader v1.0 Upload to Flash 0x8002000"
Setting Configuration 1...
Claiming USB DFU Interface...
Setting Alternate Setting ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Transfer Size = 0x0400
bytes_per_hash=417
Starting download: [##################################################] finished!
error resetting after download: usb_reset: could not reset device, win error: Das System kann die angegebene Datei nicht finden.
state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
================================================================== [SUCCESS] Took 4.89 seconds ==================================================================
Terminal will be reused by tasks, press any key to close it.
Klicke ich unten in der blauen PIO-Leiste auf das Stecker-Icon, öffnet sich der Serial Monitor und gibt alle halbe Sekunde den Zustand der LED aus:
> Executing task: C:\Users\admin\.platformio\penv\Scripts\platformio.exe device monitor <
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on COM32 115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
0
1
0
1
0
1
0
1
...
Auf das Debuggen in VS Code muss man allerdings verzichten, das geht nicht über dieses Protokoll und leider auch nicht mehr über den STLink, wenn einmal der STM32duino-USB-Bootloader geflasht ist. Hier muss man also wieder mit Serial.print() arbeiten wie schon unter der Arduino IDE. Verglichen mit der Arduino IDE bietet VS Code/PIO also keine Nachteile beim Umgang mit BluePills mit STM32duino-Bootloader.