🛠 Développer en Rust embarqué avec nrf52840-mdk-rs
Le contexte
Le BSP communautaire nrf-rs/nrf52840-mdk-rs (double licence MIT/Apache-2.0) fournit le support de la carte pour l'écosystème Rust embarqué : il ré-exporte nrf52840-hal et expose les broches de l'en-tête double 18 broches — la LED RGB et le bouton utilisateur sont des broches P0 ordinaires (voyez le schéma de brochage de la carte pour l'affectation exacte). Avertissement du dépôt : l'écosystème embedded-hal bouge vite, prenez la version canonique des exemples dans examples/ du crate.
Étape 1 — Toolchain
rustup target add thumbv7em-none-eabihf # Cortex-M4F avec FPU
cargo install cargo-binutils # pour produire l'hex via rust-objcopy
Étape 2 — Le projet blinky
Adapté des exemples du crate — vérifiez l'API courante dans examples/ :
//! examples/blinky.rs — nrf52840-mdk-rs
#![no_std]
#![no_main]
use embedded_hal::digital::OutputPin;
use nrf52840_mdk::hal;
use panic_halt as _;
#[cortex_m_rt::entry]
fn main -> ! {
let p = hal::nb::new(
nrf52840_mdk::hal::pac::Peripherals::take.unwrap,
hal::InitialPeripherals::default,
);
// Broche P0 ordinaire de l'en-tête — l'affectation LED vient du pinout
let mut led = p.pins.p0_13.into_push_pull_output(hal::port::typestate::PushPull);
loop {
led.set_high.ok;
cortex_m::asm::nop; // du vrai code utilise un timer
led.set_low.ok;
cortex_m::asm::nop;
}
}
cargo build --release --example blinky --target thumbv7em-none-eabihf
Étape 3 — Flasher : le point sensible
Le README du BSP est explicite : son mainteneur n'a jamais réussi à faire fonctionner la sonde embarquée avec l'OpenOCD fourni par Ubuntu 18.04, et travaille avec un J-Link externe. Deux stratégies fiables :
- Sans matériel externe : convertir le ELF en hex et passer par le glisser-déposer DAPLink, infaillible :
rust-objcopy --output-target=hexfile target/thumbv7em-none-eabihf/release/example-blinky \
blinky.hex
# déposer blinky.hex sur le lecteur DAPLINK, puis bouton Boot/Reset
- Avec un J-Link : câblez l'en-tête SWD selon la table du README (3V3 / RST / SWDIO / SWCLK / TDO / GND) — c'est aussi le câblage utilisé par PlatformIO en
upload_protocol = jlink.
Étape 4 — Débogage
Avec le J-Link : probe-rs ou cargo embed pour chargement à chaud, GDB et inspection des registres du Cortex-M4F. Sans sonde externe, le port CDC du DAPLink reste disponible pour la journalisation série.
Ce que le BSP vous apporte
- PAC + HAL nRF52840 pré-câblés pour la carte (pins, features de carte) ;
- un point d'entrée
cortex_m_rtpropre pourno_std; - des exemples UART/blinky de référence pour démarrer GPIO, minuteurs et série avant d'attaquer le BLE (qui, lui, reste l'affaire des piles C ou des crates dédiées).