🛠 Rust embarqué et OpenOCD sur la Discovery F4 : chaîne complète sans CubeIDE
Objectif
Développer en Rust sur la STM32F4DISCOVERY sans aucun outil ST propriétaire : le HAL communautaire stm32f4xx-hal (stm32-rs, actif en 2026 pour toute la famille F4) + OpenOCD, qui fournit un fichier de carte prêt à l'emploi stm32f4discovery.cfg (interface ST-LINK, SWD, srst_only, zone de travail 64 Ko). Ce tutoriel documente aussi la carte mémoire réelle du F407VGT6, que les tutoriels « blinky » survolent.
La carte mémoire avant le code
- Flash : 1024 Ko à partir de
0x0800_0000(le F407VGT6 est la version 1 Mo de la gamme). - SRAM : 192 Ko dont 64 Ko en mémoire couplée cœur (CCM) — visible à
0x1000_0000, rapide mais inaccessible à la plupart des DMA : les buffers DMA vont dans la SRAM principale de 128 Ko. - +4 Ko de RAM sauvegardée sur batterie (registres RTC et données préservées extinction).
- Le débogage SWD par le ST-LINK/V2-A est la voie normale : pas de flux DFU grand public sur cette carte, le bootloader système (USART/DFU via l'OTG) existe mais le port OTG est séparé du port ST-LINK.
Chaîne outil
# 1. Toolchain Rust bare-metal
rustup target add thumbv7em-none-eabihf # M4F avec FPU matériel
# 2. OpenOCD voit la carte sans configuration maison :
openocd -f interface/stlink.cfg -f board/stm32f4discovery.cfg
# (le fichier board embarque deja SWD + srst_only + workarea 64K)
# 3. Projet cargo avec stm32f4xx-hal (feature stm32f407, vgt = 1 Mo flash)
cargo build --release --target thumbv7em-none-eabihf
arm-none-eabi-gdb target/thumbv7em-none-eabihf/release/app \
-ex "target remote :3333" -ex load
Code (stm32f4xx-hal)
// LED verte LD4 = PD12, orange LD3 = PD13 — broches vérifiées BSP ST
use stm32f4xx_hal::{pac, prelude::*};
fn main -> ! {
let dp = pac::Stm32::take.unwrap;
let cp = cp_core::Peripherals::take.unwrap;
let mut rcc = dp.RCC.constrain;
let mut flash = dp.FLASH.constrain;
// HSE 8 MHz (quartz de la carte) -> 168 MHz système
let clocks = rcc.cfgr.use_hse(8.MHz)
.sysclk(168.MHz).freeze(&mut flash.acr);
let mut gpiod = dp.GPIOD.split(&mut rcc.ahb1);
let mut green = gpiod.pd12.into_push_pull_output(&mut gpiod.moder,
&mut gpiod.afr);
let mut delay = cp.SYST.delay(&rcc.clocks);
loop {
green.toggle(&mut gpiod.odr);
delay.delay(1.secs);
}
}
Pourquoi OpenOCD plutôt que CubeProgrammer ?
Les deux marchent (Zephyr utilise CubeProgrammer par défaut, avec --runner openocd en alternative). OpenOCD apporte : scripts GDB ouverts, reset_config srst_only conforme au design de la carte, et le même démon pour l'intégration CI. Le fichier tcl/board/stm32f4discovery.cfg du dépôt OpenOCD est la référence de configuration.
Vérification attendue
Open On-Chip Debugger affiche Target chip is STM32F4xx ; le load GDB écrit en 0x08000000 et la LED verte pulse à 1 Hz. En cas de carte « collée » en bas de puissance, srst_only garantit que c'est le reset physique de la carte qui agit, pas un reset logiciel du ST-LINK.
Erreurs fréquentes
- Mettre un buffer DMA en CCM (
0x10000000) : les DMA du F407 ne voient pas la mémoire couplée cœur — gardez les buffers audio/SPI dans la SRAM principale. - Compiler en
thumbv7em-none-eabi(sanshf) : vous perdez le FPU matériel du M4F, critique en DSP/audio. - Oublier les permissions USB (udev) pour le ST-LINK sous Linux avant de blâmer OpenOCD.
- Suivre un vieux tutoriel mbed en ligne : la plateforme mbed a été fermée en juillet 2026 ; si vous voulez mbed, passez par le fork communautaire mbed-ce, sinon restez sur cette chaîne Rust/OpenOCD ou CubeF4.
Autres tutoriels pour cette carte
- Premier téléversement sur la STM32F4DISCOVERY avec l'Arduino STM32duino
- Zephyr RTOS sur la STM32F4DISCOVERY : west build et west flash
- MicroPython sur la STM32F4DISCOVERY : REPL interactif et pilotage des LED
- STM32Cube HAL et BSP officiel : LED, bouton et accéléromètre avec détection automatique
- Lecture audio sur le codec CS43L22 : I2S, classe D et les limitations du BSP
- USB OTG FS sur le port micro-AB : se faire passer pour un périphérique classe CDC