🛠 Rust embarqué et OpenOCD sur la Discovery F4 : chaîne complète sans CubeIDE
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
- Flash: 1024 KB a partir de
0x0800_0000(el F407VGT6 es la versión de 1 MB de la gama). - SRAM: 192 KB, de los cuales 64 KB son memoria acoplada al núcleo (CCM) — visible en
0x1000_0000, rápida pero inaccesible para la mayoría de los DMA: los buffers DMA deben ir en la SRAM principal de 128 KB. - +4 KB de RAM respaldada por batería (registros RTC y datos preservados al apagar).
- La depuración SWD mediante el ST-LINK/V2-A es la vía normal: no hay flujo DFU de consumo general en esta placa; el bootloader del sistema (USART/DFU a través del OTG) existe, pero el puerto OTG está separado del puerto ST-LINK.
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
- Poner un buffer DMA en CCM (
0x10000000): los DMA del F407 no ven la memoria acoplada al núcleo — mantenga los buffers de audio/SPI en la SRAM principal. - Compilar para
thumbv7em-none-eabi(sinhf): pierde la FPU hardware del M4F, crítico en DSP/audio. - Olvidar los permisos USB (udev) para el ST-LINK en Linux antes de culpar a OpenOCD.
- Seguir un viejo tutorial de mbed en línea: la plataforma mbed fue cerrada en julio de 2026; si quiere mbed, use el fork comunitario mbed-ce, de lo contrario, permanezca en esta cadena Rust/OpenOCD o CubeF4.
Otros tutoriales para esta placa
- 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