usb - STM32CubeMX USB CDC VCP?

标签 usb stm32 stm32f4discovery

我发现了大量的例子,但没有关于如何从 STM32MXCube 中“正确地”做到这一点。

如何从 STM32CubeMX 为 USB CDC 虚拟 COM 端口通信创建骨架代码(如果可能,STM32F4 Discovery)?

最佳答案

带有 CDC 作为 USB 设备的 Discovery F4 的 STM32CubeMX 项目应该是开箱即用的。假设您使用最新的 STM32CubeMX 和库:

  • 启动STM32CubeMX
  • 选择板 Discovery F4
  • 仅启用外围 UBS_OTG_FS 设备(保留未选中的内容)
  • 启用中间件 USB_Device 通信 .. .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 数据就会开始显示在主机终端上。

    那个有效。我可以在终端上看到“hello”(您可能需要安装驱动程序, 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 */
    }
    

    关于usb - STM32CubeMX USB CDC VCP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549084/

    相关文章:

    android - 如果不通过 USB 连接我的手机,是否可以安装我在 Android Studio 上制作的应用程序?

    c - 我混淆的按位运算

    microcontroller - 使用STM F401RE Nucleo计算温度传感器的正确公式?

    c# - 串行端口 - 如何设置字符?

    usb - USB 控制传输是否保证交付?

    ubuntu - 在 Ubuntu 中连接 usb scale,cdc_acm 说 failed to set dtr/trs

    c - 为什么在访问 STM32 中的寄存器时这对于没有左值的 c 是合法的

    gdb - 如何使用 openOCD 和 gdb 对 STM32 flash 进行编程

    stm32 - 我可以在头文件(stm32)中定义 GPIO 引脚吗

    c - STM32F Discovery - 对arm_sin_f32的 undefined reference