267 lines
3.8 KiB
Markdown
267 lines
3.8 KiB
Markdown
# 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. |