【解决方案】STM32F103C8单片机运行CubeMX生成的CDC虚拟串口的程序,设备能枚举成功但不能启动的解决办法
发布日期:2021-06-29 10:17:00 浏览次数:3 分类:技术文章

本文共 3002 字,大约阅读时间需要 10 分钟。

这是因为USB的描述符出了问题。

Win10系统下不需要装任何驱动就能使用USB虚拟串口,但更低版本的系统比如Win7则必须要安装ST官方提供的VCP驱动:。

在Windows 7下,usbd_desc.c中的设备描述符USBD_DeviceDesc的bDeviceClass和bDeviceSubClass可以为0,但USBD_VID必须为0x0483,USBD_PID必须为0x5740,否则无法匹配上安装的VCP驱动,导致设备无法启动,如下图所示。

而在Windows 10下,由于采用的是Windows自带的虚拟串口的驱动程序,所以USBD_VID和USBD_PID可以为任意值,但是bDeviceClass和bDeviceSubClass都必须为0x02,不能为0,否则将无法匹配上Windows自带的驱动,导致设备无法启动,如下图所示。

所以,综上所述,USBD_VID应该为0x0483,USBD_PID应该为0x5740,bDeviceClass和bDeviceSubClass都应该为0x02。

/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*/#define USBD_VID                      0x0483  // 由于Win7下虚拟串口必须要装ST驱动, 所以产品ID和设备ID必须是这两个值, 否则不能匹配上驱动#define USBD_PID                      0x5740#define USBD_LANGID_STRING            0x0409  // 英语#define USBD_MANUFACTURER_STRING      "Hello Manufacturer" /* Add your manufacturer string */#define USBD_PRODUCT_HS_STRING        "Hello Product HS" /* Add your product High Speed string */#define USBD_PRODUCT_FS_STRING        "Hello Product FS" /* Add your product Full Speed string */#define USBD_CONFIGURATION_HS_STRING  "Hello Configuration HS" /* Add your configuration High Speed string */#define USBD_INTERFACE_HS_STRING      "Hello Interface HS" /* Add your Interface High Speed string */#define USBD_CONFIGURATION_FS_STRING  "Hello Configuration FS" /* Add your configuration Full Speed string */#define USBD_INTERFACE_FS_STRING      "Hello Interface FS" /* Add your Interface Full Speed string */
__ALIGN_BEGIN   uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END ={  0x12,                       /* bLength */  USB_DESC_TYPE_DEVICE,       /* bDescriptorType */  0x00,                       /* bcdUSB */  0x02,  0x02,                       /* bDeviceClass */ // 这两个必须为0x02, 否则Win10下无法启动设备  0x02,                       /* bDeviceSubClass */  0x00,                       /* bDeviceProtocol */  USB_MAX_EP0_SIZE,           /* bMaxPacketSize */  LOBYTE(USBD_VID),           /* idVendor */  HIBYTE(USBD_VID),           /* idVendor */  LOBYTE(USBD_PID),           /* idVendor */  HIBYTE(USBD_PID),           /* idVendor */  0x00,                       /* bcdDevice rel. 2.00 */  0x02,  USBD_IDX_MFC_STR,           /* Index of manufacturer string */  USBD_IDX_PRODUCT_STR,       /* Index of product string */  USBD_IDX_SERIAL_STR,        /* Index of serial number string */  USBD_MAX_NUM_CONFIGURATION  /* bNumConfigurations */}; /* USB_DeviceDescriptor */

另外,如果usbd_conf.h里面的内存分配函数选择的是malloc和free,那就需要保证USBD_CDC_Init里面的USBD_malloc能够成功分配内存,否则将无法启动设备。

/* Memory management macros */#define USBD_malloc               malloc#define USBD_free                 free

由于USBD_CDC_HandleTypeDef里面的data成员大小为512字节,所以在启动文件startup_stm32f103xb.s中要将Heap_Size改大,默认的0x200(512字节)肯定是不行的。

 

CubeMX生成完工程后还要检查USB的中断函数是否存在,是否打开了USB中断。有的时候CubeMX生成的工程中不含USB中断的代码,导致USB设备插上去无法识别。

// 打开USB中断HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
/* USB中断处理函数 */void USB_LP_CAN1_RX0_IRQHandler(void){  HAL_PCD_IRQHandler(&hpcd);}

 

转载地址:https://blog.csdn.net/ZLK1214/article/details/106414976 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【方法】关闭Visual Studio 2019的代码自动格式化功能
下一篇:【解决方案】STM32F107VC单片机下运行STM32CubeMX生成的USB_OTG Mass Storage工程,无法识别USB设备的解决办法

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月08日 07时14分08秒