3.8 KiB
Raspberry Pi Pico Debugging mit Rust
ST-Link V2 funktioniert nicht mit dem RP2040
Problem
Beim Verbinden über probe-rs erschien:
JtagGetIdcodeError
Mit OpenOCD:
Error: init mode failed (unable to connect to the target)
Ursache
Der verwendete günstige ST-Link-V2-Klon konnte zwar erkannt werden und sogar die Zielspannung messen, war aber nicht in der Lage, zuverlässig mit dem RP2040 über SWD zu kommunizieren.
Lösung
Verwendung der offiziellen Raspberry Pi Debug Probe (CMSIS-DAP).
Raspberry Pi Debug Probe
Die Raspberry Pi Debug Probe wird von probe-rs und OpenOCD nativ unterstützt.
Verkabelung:
Debug Probe Pico
SWCLK --------> SWCLK
SWDIO --------> SWDIO
GND --------> GND
Der Pico kann weiterhin separat per USB versorgt werden.
Firmware der Debug Probe aktualisieren
probe-rs meldete:
The firmware on the probe is outdated.
The minimum supported firmware version is 2.2.0.
Lösung
Firmware der Debug Probe mittels UF2-Datei aktualisieren.
Danach funktionierte probe-rs problemlos.
OpenOCD testen
Zum Testen der SWD-Verbindung:
openocd \
-f interface/cmsis-dap.cfg \
-f target/rp2040.cfg
Erfolgreiche Verbindung erkennt man an:
SWD DPIDR 0x0bc12477
probe-rs als Cargo Runner
In .cargo/config.toml:
[target.thumbv6m-none-eabi]
runner = "probe-rs run --chip RP2040 --protocol swd"
Dadurch führt cargo run automatisch aus:
- Build
- Flash
- Reset
- Start
- RTT/defmt-Monitoring
cargo run beendet sich nicht
Beobachtung
Nach dem Flashen blieb cargo run geöffnet.
Erklärung
Das ist beabsichtigt.
probe-rs run bleibt mit dem Mikrocontroller verbunden, damit:
- RTT gelesen werden kann
defmt-Logs angezeigt werden- später Debugging möglich ist
defmt einrichten
Benötigte Crates:
defmt = "1"
defmt-rtt = "1"
panic-probe = { version = "...", features = ["print-defmt"] }
Initialisierung:
use defmt_rtt as _;
use panic_probe as _;
Logs:
defmt::info!("Hello!");
defmt::warn!("Voltage low");
defmt::debug!("Counter = {}", counter);
duplicate lang item: panic_impl
Problem
duplicate lang item: panic_impl
Ursache
Es waren zwei Panic-Handler eingebunden.
Beispielsweise:
use panic_halt as _;
und zusätzlich
use panic_probe as _;
Lösung
Es darf nur ein Panic-Handler vorhanden sein.
Für defmt sollte ausschließlich panic-probe verwendet werden.
Failed to parse defmt data
Problem
Failed to parse defmt data
defmt version found, but no .defmt section
Ursache
Das Linkerscript defmt.x wurde nicht eingebunden.
Lösung
.cargo/config.toml erweitern:
rustflags = [
"-C", "link-arg=-Tlink.x",
"-C", "link-arg=-Tdefmt.x",
]
Keine defmt-Ausgaben sichtbar
Ursache
DEFMT_LOG war nicht gesetzt.
Lösung
In .cargo/config.toml:
[env]
DEFMT_LOG = "info"
oder
DEFMT_LOG = "debug"
oder
DEFMT_LOG = "trace"
Danach wurden die Log-Ausgaben sofort angezeigt.
Debugging-Geschwindigkeit
Anfangs wurde mit
--speed 100
gearbeitet.
Das funktioniert zuverlässig, ist aber sehr langsam.
Später kann die Geschwindigkeit auf mehrere MHz erhöht werden, z.B.
--speed 4000
was Flash- und Debug-Zeiten deutlich reduziert.
Erkenntnisse
- SWD benötigt lediglich:
- SWCLK
- SWDIO
- GND
- Der Pico kann gleichzeitig per USB versorgt werden.
probe-rs runersetzt den manuellen Flash-Vorgang.defmtist der De-facto-Standard für Logging im Rust-Embedded-Ökosystem.- Die Raspberry Pi Debug Probe funktioniert mit dem RP2040 deutlich zuverlässiger als günstige ST-Link-V2-Klone.