我已经找到了很多示例,但是在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);
    }
    

    插入微型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/

    10-12 14:52