🛠 Rust embarqué et OpenOCD sur la Discovery F4 : chaîne complète sans CubeIDE

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · avance · Schéma : chaîne de développement bare-metal de la STM32F4DISCOVERY — éditeur Rust (stm32f4xx-hal), compilateur cross thumbv7em, GDB pilotant OpenOCD (stm32f4discovery.cfg, ST-LINK, SWD) relié au STM32F407 ; en arrière-plan, la carte mémoire : flash 1024 Ko, SRAM 192 Ko dont 64 Ko CCM, 4 Ko sauvegardée.

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels