🛠 Dompter l'USB natif de la Blue Pill : CDC, DFU et la résistance rebelle
Un verdadero dispositivo USB, no un puente serie
Una de las grandes ventajas del STM32F103 a este precio: un periférico USB full-speed integrado en el chip, sobre PA11 (D−) y PA12 (D+). A diferencia de un Arduino Uno y su ATmega16U2, aquí el propio microcontrolador habla USB: CDC (puerto serie virtual), HID (teclado/ratón), MIDI, DFU… sin necesidad de silicio adicional. Atención: el USB es únicamente dispositivo (la placa no controla memorias USB) y el F103 no tiene ni WiFi ni Bluetooth.
El defecto de hardware famoso: la resistencia de pull-up de D+
Para enumerarse en un bus USB full-speed, la línea D+ debe llevarse a nivel alto mediante una resistencia de 1,5 kΩ hacia 3,3 V. Sin embargo, stm32-base documenta un defecto de fabricación recurrente: «en lugar de una resistencia de 1,5 kΩ, lleva ya sea una de 10 kΩ, ya sea una de 4,7 kΩ» — lo que provoca una enumeración USB aleatoria (dispositivo reconocido y luego perdido, o nunca detectado). La solución: reemplazar la resistencia por una de 1,5 kΩ. Esta misma resistencia de pull-up es crítica para el bootloader STM32duino, cuyo truco de reset USB (poner brevemente PA12 a masa para reenumerar) «se basa en que PA12 tenga una resistencia de pull-up de aproximadamente 1,5 kΩ».
El plan en tres pasos
- Verificar/reemplazar la resistencia de pull-up de D+ (componente cerca del conector USB; 1,5 kΩ).
- Instalar el bootloader comunitario STM32duino (derivado de maple-bootloader) mediante SWD o el bootloader ROM serie. Ocupa 8 Ko de flash (la revisión «boot20»; el antiguo bootloader maple reservaba 20 Ko de flash / 3 Ko de RAM) y expone la carga DFU y serie por USB.
- Cargar mediante DFU:
dfu-util -a 1 -D sketch.bin -s 0x8002000:leave— el offset 0x8002000 corresponde al desplazamiento de 8 Ko dejado por el bootloader.
Precauciones antes de abrir la tapa USB
- Mantén un medio de reprogramación de respaldo (ST-Link en el conector SWD, o serie en USART1): cortarte el acceso al modificar el bootloader es la forma más rápida de provocar un bloqueo aparente.
- El bootloader comunitario debe compilarse con GCC 4.8; con 4.9 o más reciente, «los registros de hardware se leen incorrectamente y el bootloader no funciona» — útil si deseas compilarlo tú mismo.
- Para HID/MIDI a medida sin bootloader, consulta los ejemplos USB CDC-ACM de libopencm3-examples, que funcionan en placas de la clase Maple/Blue Pill.
Otros tutoriales para esta placa
- Découvrir la Blue Pill : que trouve-t-on dans la boîte ?
- Premier programme Arduino sur la Blue Pill (core officiel stm32duino)
- Alimenter et flasher la Blue Pill : BOOT0, port série, ST-Link et DFU
- Série, ADC et chasse aux contrefaçons : diagnostiquer sa Blue Pill
- Passer au niveau supérieur : STM32CubeIDE, HAL et LL sur F103
- Firmware libre sur Blue Pill avec libopencm3 et OpenOCD