Files

3.8 KiB

Raspberry Pi Pico Debugging mit Rust

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 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.