🛠 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.

Objetivo

Desarrollar en Rust sobre la STM32F4DISCOVERY sin ninguna herramienta propietaria de ST: el HAL comunitario stm32f4xx-hal (stm32-rs, activo en 2026 para toda la familia F4) + OpenOCD, que proporciona un archivo de configuración de placa listo para usar stm32f4discovery.cfg (interfaz ST-LINK, SWD, srst_only, área de trabajo de 64 KB). Este tutorial también documenta el mapa de memoria real del F407VGT6, que los tutoriales de "blinky" suelen pasar por alto.

El mapa de memoria antes del código

Cadena de herramientas

# 1. Toolchain Rust bare-metal
rustup target add thumbv7em-none-eabihf   # M4F avec FPU materiel

# 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

Código (stm32f4xx-hal)

// LED verte LD4 = PD12, orange LD3 = PD13 — broches verifiees 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 systeme
    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);
    }
}

¿Por qué OpenOCD en lugar de CubeProgrammer?

Ambos funcionan (Zephyr usa CubeProgrammer por defecto, con --runner openocd como alternativa). OpenOCD aporta: scripts GDB abiertos, reset_config srst_only conforme al diseño de la placa, y el mismo ejemplo para la integración en CI. El archivo tcl/board/stm32f4discovery.cfg del repositorio de OpenOCD es la referencia de configuración.

Verificación esperada

Open On-Chip Debugger muestra Target chip is STM32F4xx; la carga de GDB escribe en 0x08000000 y el LED verde parpadea a 1 Hz. En caso de una placa "bloqueada" en bajo consumo, srst_only garantiza que es el reset físico de la placa el que actúa, no un reset software del ST-LINK.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales