web-dev-qa-db-fra.com

STM32CubeMX USB CDC VCP?

J'ai trouvé un grand nombre d'exemples, mais rien sur la façon de le faire "correctement" à partir de STM32MXCube.

Comment créer un code squelette à partir de STM32CubeMX pour les communications du port COM virtuel CDC USB (si possible la découverte STM32F4)?

8
user505160

Un projet STM32CubeMX pour Discovery F4 avec CDC comme périphérique USB devrait fonctionner hors de la boîte. En supposant que vous utilisez un STM32CubeMX et une bibliothèque à jour:

  • Démarrez STM32CubeMX
  • Sélectionnez la planche Discovery F4
  • Activer le périphérique UBS_OTG_FS uniquement (ne pas cocher la case)
  • Activer la communication USB_Device du logiciel intermédiaire .. .aka CDC

Dans l'onglet horloge, vérifiez que la source d'horloge est HSE HCLK. Il doit fournir 168 MHz HLCK et 48 MHz dans le 48 MHz (USB). Vérifiez qu'il n'y a de rouge nulle part.

Enregistrez le projet

Générer du code (j'ai utilisé des chaînes d'outils SW4STM32)

Build (vous devrez peut-être passer au générateur CDT interne vs GNU make).

Ajoutez maintenant du code pour envoyer des données sur le port COM et le tour est joué.

En fait, la partie délicate n'est pas d'essayer de faire un accès "CDC" jusqu'à ce que l'hôte USB se connecte (pas encore de configuration CDC)

Voici comment je l'ai fait pour un test d'émission rapide:

Dans le fichier usbd_cdc_if.c

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
    uint8_t result = USBD_OK;

    /* USER CODE BEGIN 7 */
    if (hUsbDevice_0 == NULL)
        return -1;

    USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);
    result = USBD_CDC_TransmitPacket(hUsbDevice_0);
    /* USER CODE END 7 */

    return result;
}

static int8_t CDC_DeInit_FS(void)
{
    /* USER CODE BEGIN 4 */
    hUsbDevice_0 = NULL;
    return (USBD_OK);
    /* USER CODE END 4 */
}

Dans le fichier main.c

/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"
/* USER CODE END Includes */
....

/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    uint8_t HiMsg[] = "hello\r\n";
    CDC_Transmit_FS(HiMsg, strlen(HiMsg));
    HAL_Delay(200);
}

Dès que vous branchez le micro USB (CN5), les données CDC commencent à s'afficher sur le terminal hôte.

Ça marche. Je peux voir "bonjour" sur le terminal (vous devrez peut-être installer un pilote, http://www.st.com/web/en/catalog/tools/PF257938 ).

Pour la réception, il doit d'abord être armé, par exemple, démarré par un premier appel à USBD_CDC_ReceivePacket () dans un bon endroit. Pour cela, il peut s'agir de CDC_Init_FS.

Ensuite, vous pouvez gérer les données lorsqu'elles arrivent dans CDC_Receive_FS et réarmer la réception à partir d'ici.

Ça marche pour moi.

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
    /* USER CODE BEGIN 6 */
    USBD_CDC_ReceivePacket(hUsbDevice_0);
    return (USBD_OK);
    /* USER CODE END 6 */
}

static int8_t CDC_Init_FS(void)
{
    hUsbDevice_0 = &hUsbDeviceFS;

    /* USER CODE BEGIN 3 */
    /* Set Application Buffers */
    USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, 0);
    USBD_CDC_SetRxBuffer(hUsbDevice_0, UserRxBufferFS);
    USBD_CDC_ReceivePacket(hUsbDevice_0);

    return (USBD_OK);
    /* USER CODE END 3 */
}
13
Michel Sanches

Il existe un certain nombre de cartes Discovery STM32F4 prises en charge par le logiciel STM32Cube, et vous n'avez pas dit lequel vous utilisez, mais j'ai eu exactement le même problème avec la carte Discovery avec le MCU F401VCT.

Après avoir installé le pilote de port COM virtuel STM, le Gestionnaire de périphériques Windows a montré un port COM virtuel STMicroelectronics, mais avec une marque d'avertissement jaune. Le port COM n'était pas accessible avec une application de terminal ( PuTTY ).

J'ai finalement trouvé qu'il y avait problème avec la sortie du code source du programme STMCube. Mais il existe une solution simple:

  1. Ouvrez un nouveau projet STM32Cube et activez USB_OTG_FS en tant que périphérique uniquement et sélectionnez CDC Virtual Port COM dans la liste déroulante MiddleWares USB_Device.
  2. Générez le code source sans autres modifications nécessaires aux paramètres USB.
  3. Dans le fichier usbd_cdc_if.c, modifiez #define USB_HS_MAX_PACKET_SIZE de 512 à 256.
  4. Dans le fichier usbd_cdc.c, modifiez le #define CDC_DATA_HS_MAX_PACKET_SIZE de 512 à 256.

Après cela, l'avertissement jaune a disparu du Gestionnaire de périphériques et j'ai pu recevoir des données sur la fonction CDC_Receive_FS (dans le fichier usbd_cdc_if.c) lors de l'utilisation de PuTTY. Sachez que ces définitions reviennent à leurs valeurs incorrectes chaque fois que le STM32Cube génère du code, et je n'ai pas encore trouvé de solution.

J'espère que ça aide.

6
iChal

correction d'iChal a travaillé pour supprimer la marque d'avertissement jaune.

Je voudrais mentionner que USB_HS_MAX_PACKET_SIZE est maintenant dans usbd_def.h et CDC_DATA_HS_MAX_PACKET_SIZE est dans usbd_cdc.h

J'utilise STM32CubeMX v4.11.0 STM32Cube v1.0 et le STM32F401C-DISCO.

Lors de travaux ultérieurs, il ne me reste plus qu'à définir la taille du tas sur une valeur plus élevée. Je le mets à 0x600 car j'ai également FreeRTOS activé. J'utilise IAR EWARM, la modification est donc effectuée dans le script de l'éditeur de liens stm32f401xc_flash.icf.

4
Richard Kadrmas