# Raspberry Pi Pico Debugging mit Rust ## ST-Link V2 funktioniert nicht mit dem RP2040 ### Problem Beim Verbinden über `probe-rs` erschien: ```text JtagGetIdcodeError ``` Mit OpenOCD: ```text 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: ```text 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: ```bash openocd \ -f interface/cmsis-dap.cfg \ -f target/rp2040.cfg ``` Erfolgreiche Verbindung erkennt man an: ```text SWD DPIDR 0x0bc12477 ``` --- ## probe-rs als Cargo Runner In `.cargo/config.toml`: ```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: ```toml defmt = "1" defmt-rtt = "1" panic-probe = { version = "...", features = ["print-defmt"] } ``` Initialisierung: ```rust use defmt_rtt as _; use panic_probe as _; ``` Logs: ```rust defmt::info!("Hello!"); defmt::warn!("Voltage low"); defmt::debug!("Counter = {}", counter); ``` --- ## duplicate lang item: panic_impl ### Problem ```text duplicate lang item: panic_impl ``` ### Ursache Es waren zwei Panic-Handler eingebunden. Beispielsweise: ```rust use panic_halt as _; ``` und zusätzlich ```rust 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 ```text 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: ```toml 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`: ```toml [env] DEFMT_LOG = "info" ``` oder ```toml DEFMT_LOG = "debug" ``` oder ```toml DEFMT_LOG = "trace" ``` Danach wurden die Log-Ausgaben sofort angezeigt. --- ## Debugging-Geschwindigkeit Anfangs wurde mit ```text --speed 100 ``` gearbeitet. Das funktioniert zuverlässig, ist aber sehr langsam. Später kann die Geschwindigkeit auf mehrere MHz erhöht werden, z.B. ```text --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 run` ersetzt den manuellen Flash-Vorgang. - `defmt` ist 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.