USB

Emulation d’un port COM avec l’USB

Il est possible d’émuler un port COM avec la prise USB OTG (connecteur micro-AB).

usb

Cet exemple utilise l’USB CDC (USB Communications Device Class) disponible dans le STM32 Cube F4.

 

Cet exemple contient les modules suivants :

  • La LED 5 clignotte avec une période de 2 secondes (1 sec. on, 1 sec. off)
  • La LED 4 correspond au statut du bouton utilisateur (appuyé ou relaché)
  • L’USB OTG émule un nouveau port de communication qui recopie les caractères entrant sur la sortie

Vous pouvez télécharger le code ICI ou sur mon dépots GitHub

Pour compiler les fichiers source avec em::Blocks, vous devez :

  1. Télécharger les fichiers source et les dé-zipper
  2. Ouvrir un projet existant en sélectionnant le projet « Usb-HAL.ebp »
  3. Vérifier que la constants USE_USB_FS est bien défnine au niveau du projet.

Pour faire cette vérifiaction, faites un clique droit sur le projet dans la fenêtre « management « , puis sélectionner l’option « build Option… » dans le menu contextuel.

USB_Constant

Cliquer sur « Usb-Hal » dans la partie gauche de la boite de dialogue pour sélectionner les paramètres globaux du projet.

Dans l’onglet « #defines » des options du compilateur, vérifier que USE_USB_FS est présent.

 

Attention: Il y a un bug dans la distribution STM32 Cube F4 (corrigé ici)

Dans le fichier usbd_cdc.c, dans la fonction USBD_CDC_TransmitPacket(), la mise à jour de l’état de la transmission est faite après l’appel de la fonction d’émission (qui fonctionne sous interruption et met à jour également cet état).

USBD_LL_Transmit(...);
hcdc->TxState = 1;

Donc en cas de transmission courte (1 octet par exemple), la fonction Transmit peut se terminer avant que la fonction en cours mette à jour l’état avec une mauvaise valeur dans ce cas. La solution : inverser les 2 lignes pour indiquer la transmission avant d’envoyer les octets.

hcdc->TxState = 1;
USBD_LL_Transmit(...);