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)?
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:
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:
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 */
}
/* 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 */
}
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:
#define USB_HS_MAX_PACKET_SIZE
de 512 à 256.#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.
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
.