STM32cubemx usb不能识别

我自己使用STMCUBEMX 配置usb_otg_hs时候,第一次程序上传之后,会提示错误的usb,USB设备描述符请求失败(未知的usb设备),复位之后直接检测不到usb了,错误的usb都没有了。但是我使用别人的代码上传后,复位后能够识别到usb且回环测试,虽然有时候也会检测不到。

该回答通过自己思路及引用到各个渠道搜索综合及思考,得到内容具体如下:

这个问题可能涉及到多个方面,以下是一些可能的解决方案:

1. 确认USB硬件连接正常。检查USB线缆,确保它们连接到正确的端口,并且没有松动或损坏。

2. 检查USB OTG HS的时钟设置,确保它们正确。在STM32CubeMX中,打开“Clock Configuration”(时钟配置)选项卡,确保USB OTG HS的时钟源正确设置并且时钟频率符合规范。

3. 确认USB OTG HS的初始化代码正确。检查USB OTG HS的初始化代码,确保它们正确地配置了USB端点和传输参数。特别是,确保正确设置USB的传输速率,以避免传输速率错误导致USB无法识别。

4. 检查USB OTG HS的DMA设置。如果使用了DMA传输,则需要确保DMA传输设置正确,以避免数据传输中断或错误。

5. 使用外部USB HUB。尝试使用外部USB HUB来增强USB信号并解决USB识别问题。

6. 更新USB驱动程序。如果您的操作系统中的USB驱动程序已过时或不兼容,可能会导致USB无法识别。尝试更新或重新安装USB驱动程序。

7. 尝试使用不同的USB端口或计算机。如果USB无法识别,尝试使用不同的USB端口或计算机来确定是否存在硬件问题。

以上是一些可能的解决方案,但由于问题的复杂性和多样性,可能需要更详细的调试和排除才能找到解决方法。

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 建议你看下这篇博客👉 :用STM32CubeMX实现一个简易的USB通信接口
  • 除此之外, 这篇博客: stm32Cubemx USB虚拟串口中的 代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 编写连接情况查询函数:
    hUsbDeviceFS定义在usb_device.c中

    void VCP_Status(void)
    {
        static uint8_t old_status = 0;
     
        if(hUsbDeviceFS.dev_state != old_status)
        {
            if(hUsbDeviceFS.dev_state == USBD_STATE_CONFIGURED)
                printf("连接成功\r\n");
            else if (hUsbDeviceFS.dev_state == USBD_STATE_SUSPENDED)
                printf("断开成功\r\n");
            old_status = hUsbDeviceFS.dev_state;
        }    
    }
    

    编写USB发送函数usb_printf():放置于usbd_cdc_if.c文件的
    /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION /
    /
    USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */中,并在usbd_cdc_if.h声明

    #include <stdarg.h>
    void usb_printf(const char *format, ...)
    {
        va_list args;
        uint32_t length;
     
        va_start(args, format);
        length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);
        va_end(args);
        CDC_Transmit_FS(UserTxBufferFS, length);
    }
    

    在usbd_cdc_if.c文件的
    /* USER CODE BEGIN PRIVATE_VARIABLES /
    /
    USER CODE END PRIVATE_VARIABLES */位置添加结构体定义:用于接收

    typedef struct{
      uint32_t rxlen;
      uint32_t flag;
    }VcpRx_t;
     
    VcpRx_t temp = {
        .rxlen =0,
        .flag = 0
    };
    

    相同文件下,修改static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)函数,修改后为
    注:发送时每次发送必须以\r\n结尾

    static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
    {
      /* USER CODE BEGIN 6 */
        temp.rxlen = temp.rxlen + (*Len);
        
        if(temp.rxlen < APP_RX_DATA_SIZE && UserRxBufferFS[temp.rxlen - 2] != 0x0d  \
            &&  UserRxBufferFS[temp.rxlen - 1] != 0x0a)//***发送时每次发送必须以\r\n结尾***
        {
           //---继续接收---------------
           USBD_CDC_SetRxBuffer(&hUsbDeviceFS,UserRxBufferFS  + temp.rxlen); 
           USBD_CDC_ReceivePacket(&hUsbDeviceFS);
        }
        else 
        {
           temp.flag = 1;    //接收完成
           UserRxBufferFS[temp.rxlen] = 0;
        }
        return (USBD_OK);	
      /* USER CODE END 6 */
    }
    

    编写USB发送函数rxdata_printf():放置于usbd_cdc_if.c文件的
    /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION /
    /
    USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */中,并在usbd_cdc_if.h声明

    //接收完成后通过usb回发数据
    void rxdata_printf(void)
    {
      if(temp.flag)
      {
        usb_printf("%s\r\n", UserRxBufferFS);//若无需回发,屏蔽即可
        temp.flag = 0;
        temp.rxlen = 0;
        memset(UserRxBufferFS, 0, APP_RX_DATA_SIZE);
        USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); 
        USBD_CDC_ReceivePacket(&hUsbDeviceFS);
      }
    }