我自己使用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端口或计算机来确定是否存在硬件问题。
以上是一些可能的解决方案,但由于问题的复杂性和多样性,可能需要更详细的调试和排除才能找到解决方法。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
编写连接情况查询函数:
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);
}
}