🛠 Dompter l'USB natif de la Blue Pill : CDC, DFU et la résistance rebelle

STM32F103 "Blue Pill" (STM32F103C8T6) · intermediaire · Le F103 possède un vrai périphérique USB full-speed sur PA11/PA12. Comment l'exploiter, et pourquoi l'énumération échoue sur beaucoup de cartes.

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

  1. Verificar/reemplazar la resistencia de pull-up de D+ (componente cerca del conector USB; 1,5 kΩ).
  2. 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.
  3. 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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales