feat: worked writing using probe

This commit is contained in:
2026-07-10 23:14:45 +02:00
parent 422fb2a47a
commit b92c613f8d
6 changed files with 363 additions and 4 deletions
+267
View File
@@ -0,0 +1,267 @@
# 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.