🛠 USB OTG FS sur le port micro-AB : se faire passer pour un périphérique classe CDC
Objetivo
La STM32F4DISCOVERY posee dos conectores USB independientes: el del depurador ST-LINK/V2-A (que programa la placa) y un verdadero puerto USB OTG FS micro-AB conectado al controlador USB 2.0 OTG FS del STM32F407 (phy integrado). Este tutorial configura este segundo puerto como dispositivo CDC — un puerto serie USB que, a diferencia del VCP del ST-LINK no conectado en las placas estándar, siempre funciona.
Pinado exacto
- DM/DP OTG FS: PA11 / PA12
- Detección de VBUS: PA9, pin ID: PA10 (el conector micro-AB distingue dispositivo y host mediante el pin ID)
- LEDs LD7/LD8: VBUS OTG y detección de sobrecorriente — le informan sobre la alimentación del puerto
- El F407 también incorpora un controlador OTG HS (phy de alta velocidad + ULPI): no está expuesto en esta placa, solo el FS es utilizable aquí
Material
- 1 placa STM32F4DISCOVERY + cable micro-USB (o micro-AB) hacia el PC, conectado al conector OTG
- STM32CubeF4: la biblioteca USB Device (clase CDC) se incluye en el paquete, con ejemplos completos para la placa
Procedimiento
- En el ejemplo CDC de CubeF4 para STM32F4-Discovery, regenere o escriba: reloj de 168 MHz, USB FS en PA11/PA12, pull-up en la línea DP controlado por la pila USB.
- La pila USB Device (módulo
STM32_USB_DEVICE_Library) proporcionaUSBD_CDC: usted implementa la recepción en el callback de la clase y envía conCDC_Transmit_FS. - Flashee a través del puerto ST-LINK (nunca por el OTG en una placa virgen), luego conecte el cable al OTG: el PC enumera un dispositivo serie CDC sin necesidad de controladores.
Esqueleto de la aplicación
/* apres generation CDC sample CubeF4 — USB_DEVICE CDC */
USBD_HandleTypeDef husb;
USBD_Init(&husb, FS_PAD_VBUS, USB_OTG_FS_CORE_ID);
USBD_RegisterClass(&husb, USBD_CDC_CLASS);
USBD_CDC_RegisterInterface(&husb, &USBD_Interface_fops_FS);
USBD_Start(&husb);
/* Boucle principale : echo vers le terminal PC (port CDC, pas ST-Link) */
int main(void) {
SystemClock_Config; /* 48 MHz USB extraits de la PLL */
/* ... USBD init ci-dessus ... */
while (1) {
if (rxReady) { CDC_Transmit_FS(rxData, rxLen); rxReady = 0; }
}
}
Puntos críticos
- El reloj USB exige 48 MHz exactos en la salida PLL dedicada: con el cristal HSE de 8 MHz de la placa, la configuración estándar de 168 MHz proporciona una señal de 48 MHz correcta — no modifique la PLL sin verificar.
- El puerto OTG también puede trabajar como host (las demos de host mass-storage existen en CubeF4): la detección de dispositivo/host proviene del pin ID PA10 y del tipo de cable micro-A/micro-B.
- MicroPython utiliza exactamente este puerto (
MICROPY_HW_USB_FS) para su REPL: cuando MicroPython está flasheado, el puerto ST-LINK solo sirve para volver a flashear.
Verificación esperada
El PC ve un dispositivo serie CDC (nombrado según los descriptores USB del firmware); el eco funciona a 115200 y más. El LED LD7 se enciende cuando hay VBUS presente en el puerto OTG.
Errores frecuentes
- Conectar el cable al puerto ST-LINK buscando el nuevo dispositivo CDC: los dos puertos están eléctrica y lógicamente separados.
- Olvidar la configuración de 48 MHz de la PLL USB: la enumeración falla aleatoriamente o no ocurre en absoluto.
- Usar un cable micro-USB estándar en el conector micro-AB sin verificar la detección ID: en algunos cables/posiciones, la detección de rol tarda — pruebe la otra orientación del conector.
- Contar con el VCP del ST-LINK como segundo puerto serie: no está conectado en las placas estándar, solo este puerto OTG proporciona una verdadera serie USB.
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
- Acquérir le micro PDM MP45DT02 : I2S2, filtre PDM-vers-PCM et contraintes de sortie