STM32CubeMX USB CDC VCP?

时间:2015-11-05 15:53:11

标签: usb stm32 stm32f4discovery

我已经找到了大量的例子,但没有关于如何做到的事情"正确"来自STM32MXCube。

如何从STM32CubeMX创建用于USB CDC虚拟COM端口通信的骨架代码(如果可能的话,STM32F4发现)?

3 个答案:

答案 0 :(得分:13)

使用CDC作为USB设备的Discovery F4的STM32CubeMX项目应该可以立即使用。假设您使用最新的STM32CubeMX和库:

  • 启动STM32CubeMX
  • 选择发现板F4
  • 仅启用外围设备UBS_OTG_FS设备(保留未选中的内容)
  • 启用midlleware USB_Device Communication .. .aka CDC

在时钟选项卡中,检查时钟源是HSE HCLK。它应在48 MHz(USB)中提供168 MHz HLCK和48 MHz。检查任何地方都没有红色。

保存项目

生成代码(我使用SW4STM32工具链)

构建(您可能需要切换到内部CDT构建器与GNU make)。

现在添加一些代码以通过COM端口发送数据,并且它应该可以正常工作。

实际上,棘手的部分是在主机USB连接之前不尝试进行任何“CDC”访问(尚未安装CDC)

以下是我为快速排放测试所做的工作:

在文件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 */
}

在文件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);
}

一旦插入micro USB(CN5),CDC数据就会开始显示在主机终端上。

有效。我可以在终端上看到“你好”(你可能需要安装一个驱动程序,http://www.st.com/web/en/catalog/tools/PF257938)。

对于接收,它需要首先布防,比如,在一个好地方第一次拨打USBD_CDC_ReceivePacket()开始。为此,它可以是CDC_Init_FS。

然后你可以处理CDC_Receive_FS中的数据并从这里再次重新接收。

这适合我。

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 */
}

答案 1 :(得分:6)

STM32Cube软件支持多种STM32F4发现板,您还没有说明您使用的是哪种板块,但我对发现板与F401VCT MCU的问题完全相同。

安装STM虚拟COM端口驱动程序后,Windows设备管理器显示STMicroelectronics虚拟COM端口,但带有黄色警告标记。终端应用程序(PuTTY)无法访问COM端口。

我最终发现STMCube程序的源代码输出存在 问题 。但有一个简单的解决方法:

  1. 打开一个新的STM32Cube项目并启用USB_OTG_FS作为设备 仅从MiddleWares中选择CDC虚拟端口COM USB_Device下拉。
  2. 生成源代码,无需对任何USB设置进行其他更改。
  3. 在文件usbd_cdc_if.c中,将#define USB_HS_MAX_PACKET_SIZE 512更改为256
  4. 在文件usbd_cdc.c中,将#define CDC_DATA_HS_MAX_PACKET_SIZE 512更改为256
  5. 执行此操作后,黄色警告从设备管理器中消失,我可以在使用PuTTY时在CDC_Receive_FS函数(在usbd_cdc_if.c文件中)接收数据。请注意,每次STM32Cube生成代码时,这些定义都会返回不正确的值,而我还没有找到解决方法。

    我希望这会有所帮助。

答案 2 :(得分:4)

iChal's fix努力删除黄色警告标记。

我想提一下USB_HS_MAX_PACKET_SIZE现在在usbd_def.h中,而CDC_DATA_HS_MAX_PACKET_SIZE在usbd_cdc.h中

我正在使用STM32CubeMX v4.11.0 STM32Cube v1.0和STM32F401C-DISCO。

在进一步的工作中,我现在只需要将堆大小设置为更大的值。 我将其设置为0x600,因为我也启用了FreeRTOS。我正在使用IAR EWARM,因此更改是在链接描述文件stm32f401xc_flash.icf中进行的。