🛠 USB OTG FS sur le port micro-AB : se faire passer pour un périphérique classe CDC
Objectif
La STM32F4DISCOVERY possède deux connecteurs USB indépendants : celui du débogueur ST-LINK/V2-A (qui programme la carte) et un vrai port USB OTG FS micro-AB câblé sur le contrôleur USB 2.0 OTG FS du STM32F407 (phy intégré). Ce tutoriel configure ce second port en périphérique CDC — un port série USB qui, lui, fonctionne toujours, contrairement au VCP du ST-LINK non câblé sur les cartes stock.
Brochage exact
- DM/DP OTG FS : PA11 / PA12
- Détection VBUS : PA9, broche ID : PA10 (le connecteur micro-AB distingue device et host par la broche ID)
- LED LD7/LD8 : VBUS OTG et détection de surintensité — elles vous renseignent sur l'alimentation du port
- Le F407 embarque aussi un contrôleur OTG HS (phy grand vitesse + ULPI) : non exposé sur ce board, seul le FS est utilisable ici
Matériel
- 1 carte STM32F4DISCOVERY + câble micro-USB (ou micro-AB) vers le PC, branché sur le connecteur OTG
- STM32CubeF4 : la bibliothèque USB Device (classe CDC) est fournie dans le paquet, avec des exemples complets pour la carte
Démarche
- Dans l'exemple CDC de CubeF4 pour STM32F4-Discovery, régénérez ou écrivez : horloge 168 MHz, USB FS sur PA11/PA12, pull-up sur la ligne DP piloté par la pile USB.
- La pile USB Device (module
STM32_USB_DEVICE_Library) fournitUSBD_CDC: vous implémentez la réception dans le callback de la classe et envoyez avecCDC_Transmit_FS. - Flash par le port ST-LINK (jamais par l'OTG sur une carte vierge), puis branchez le câble sur l'OTG : le PC énumère un périphérique série CDC sans pilote.
Squelette applicatif
/* après 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; }
}
}
Points critiques
- L'horloge USB exige 48 MHz exacts sur la sortie PLL dédiée : avec le quartz HSE 8 MHz de la carte, la configuration 168 MHz standard fournit un 48 MHz correct — ne bricolez pas la PLL sans vérifier.
- Le port OTG peut aussi travailler en hôte (les démos host mass-storage existent dans CubeF4) : la détection device/host vient de la broche ID PA10 et du type de câble micro-A/micro-B.
- MicroPython exploite exactement ce port (
MICROPY_HW_USB_FS) pour son REPL : quand MicroPython est flashé, le port ST-LINK ne sert plus qu'à re-flasher.
Vérification attendue
Le PC voit un périphérique série CDC (nommé selon les descripteurs USB du firmware) ; l'écho fonctionne à 115200 et plus. La LED LD7 s'allume quand VBUS est présent sur le port OTG.
Erreurs fréquentes
- Brancher le câble sur le port ST-LINK en cherchant le nouveau périphérique CDC : les deux ports sont électriquement et logiquement séparés.
- Oublier la configuration 48 MHz de la PLL USB : l'énumération échoue aléatoirement ou pas du tout.
- Utiliser un câble micro-USB standard sur le connecteur micro-AB sans vérifier la détection ID : sur certains câbles/positions, la détection de rôle met du temps — testez l'autre sens du connecteur.
- Compter sur le VCP du ST-LINK comme second port série : non câblé sur les cartes stock, seul ce port OTG fournit une vraie série USB.
Autres tutoriels pour cette carte
- 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