[STM32F1] STM32F103C8单片机运行CubeMX生成的CDC虚拟串口的程序

[复制链接]
872|20
 楼主| 慢醇 发表于 2022-5-28 13:24 | 显示全部楼层 |阅读模式
【解决方案】STM32F103C8单片机运行CubeMX生成的CDC虚拟串口的程序,设备能枚举成功但不能启动的解决办法、这是因为USB的描述符出了问题。

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

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

455306291b20be14f7.png

评论

原文链接:https://blog.csdn.net/ZLK1214/article/details/106414976  发表于 2022-5-28 15:20
 楼主| 慢醇 发表于 2022-5-28 15:20 | 显示全部楼层
而在Windows 10下,由于采用的是Windows自带的虚拟串口的驱动程序,所以USBD_VID和USBD_PID可以为任意值,但是bDeviceClass和bDeviceSubClass都必须为0x02,不能为0,否则将无法匹配上Windows自带的驱动,导致设备无法启动,如下图所示。
 楼主| 慢醇 发表于 2022-5-28 15:23 | 显示全部楼层
 楼主| 慢醇 发表于 2022-5-28 15:24 | 显示全部楼层
所以,综上所述,USBD_VID应该为0x0483,USBD_PID应该为0x5740,bDeviceClass和bDeviceSubClass都应该为0x02。
 楼主| 慢醇 发表于 2022-5-28 15:25 | 显示全部楼层
  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. #define USBD_VID                      0x0483  // 由于Win7下虚拟串口必须要装ST驱动, 所以产品ID和设备ID必须是这两个值, 否则不能匹配上驱动
  4. #define USBD_PID                      0x5740
  5. #define USBD_LANGID_STRING            0x0409  // 英语
  6. #define USBD_MANUFACTURER_STRING      "Hello Manufacturer" /* Add your manufacturer string */
  7. #define USBD_PRODUCT_HS_STRING        "Hello Product HS" /* Add your product High Speed string */
  8. #define USBD_PRODUCT_FS_STRING        "Hello Product FS" /* Add your product Full Speed string */
  9. #define USBD_CONFIGURATION_HS_STRING  "Hello Configuration HS" /* Add your configuration High Speed string */
  10. #define USBD_INTERFACE_HS_STRING      "Hello Interface HS" /* Add your Interface High Speed string */
  11. #define USBD_CONFIGURATION_FS_STRING  "Hello Configuration FS" /* Add your configuration Full Speed string */
  12. #define USBD_INTERFACE_FS_STRING      "Hello Interface FS" /* Add your Interface Full Speed string */
 楼主| 慢醇 发表于 2022-5-28 15:26 | 显示全部楼层
  1. __ALIGN_BEGIN   uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  2. {
  3.   0x12,                       /* bLength */
  4.   USB_DESC_TYPE_DEVICE,       /* bDescriptorType */
  5.   0x00,                       /* bcdUSB */
  6.   0x02,
  7.   0x02,                       /* bDeviceClass */ // 这两个必须为0x02, 否则Win10下无法启动设备
  8.   0x02,                       /* bDeviceSubClass */
  9.   0x00,                       /* bDeviceProtocol */
  10.   USB_MAX_EP0_SIZE,           /* bMaxPacketSize */
  11.   LOBYTE(USBD_VID),           /* idVendor */
  12.   HIBYTE(USBD_VID),           /* idVendor */
  13.   LOBYTE(USBD_PID),           /* idVendor */
  14.   HIBYTE(USBD_PID),           /* idVendor */
  15.   0x00,                       /* bcdDevice rel. 2.00 */
  16.   0x02,
  17.   USBD_IDX_MFC_STR,           /* Index of manufacturer string */
  18.   USBD_IDX_PRODUCT_STR,       /* Index of product string */
  19.   USBD_IDX_SERIAL_STR,        /* Index of serial number string */
  20.   USBD_MAX_NUM_CONFIGURATION  /* bNumConfigurations */
  21. }; /* USB_DeviceDescriptor */
 楼主| 慢醇 发表于 2022-5-28 15:27 | 显示全部楼层
  1. __ALIGN_BEGIN   uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  2. {
  3.   0x12,                       /* bLength */
  4.   USB_DESC_TYPE_DEVICE,       /* bDescriptorType */
  5.   0x00,                       /* bcdUSB */
  6.   0x02,
  7.   0x02,                       /* bDeviceClass */ // 这两个必须为0x02, 否则Win10下无法启动设备
  8.   0x02,                       /* bDeviceSubClass */
  9.   0x00,                       /* bDeviceProtocol */
  10.   USB_MAX_EP0_SIZE,           /* bMaxPacketSize */
  11.   LOBYTE(USBD_VID),           /* idVendor */
  12.   HIBYTE(USBD_VID),           /* idVendor */
  13.   LOBYTE(USBD_PID),           /* idVendor */
  14.   HIBYTE(USBD_PID),           /* idVendor */
  15.   0x00,                       /* bcdDevice rel. 2.00 */
  16.   0x02,
  17.   USBD_IDX_MFC_STR,           /* Index of manufacturer string */
  18.   USBD_IDX_PRODUCT_STR,       /* Index of product string */
  19.   USBD_IDX_SERIAL_STR,        /* Index of serial number string */
  20.   USBD_MAX_NUM_CONFIGURATION  /* bNumConfigurations */
  21. }; /* USB_DeviceDescriptor */
 楼主| 慢醇 发表于 2022-5-28 15:28 | 显示全部楼层
另外,如果usbd_conf.h里面的内存分配函数选择的是malloc和free,那就需要保证USBD_CDC_Init里面的USBD_malloc能够成功分配内存,否则将无法启动设备。
 楼主| 慢醇 发表于 2022-5-28 15:28 | 显示全部楼层
  1. /* Memory management macros */
  2. #define USBD_malloc               malloc
  3. #define USBD_free                 free
 楼主| 慢醇 发表于 2022-5-28 15:29 | 显示全部楼层
由于USBD_CDC_HandleTypeDef里面的data成员大小为512字节,所以在启动文件startup_stm32f103xb.s中要将Heap_Size改大,默认的0x200(512字节)肯定是不行的。
 楼主| 慢醇 发表于 2022-5-28 15:30 | 显示全部楼层
CubeMX生成完工程后还要检查USB的中断函数是否存在,是否打开了USB中断。有的时候CubeMX生成的工程中不含USB中断的代码,导致USB设备插上去无法识别。
 楼主| 慢醇 发表于 2022-5-28 15:41 | 显示全部楼层
// 打开USB中断
HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
 楼主| 慢醇 发表于 2022-5-28 15:42 | 显示全部楼层
/* USB中断处理函数 */
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  HAL_PCD_IRQHandler(&hpcd);
}
Uriah 发表于 2022-10-5 13:30 | 显示全部楼层

让尽可能多的变量使用直接寻址,提高速度
Bblythe 发表于 2022-10-5 16:29 | 显示全部楼层

每个Strategy交由Spring管理,并在构造后注册
Pulitzer 发表于 2022-10-5 19:28 | 显示全部楼层

硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得
周半梅 发表于 2023-4-1 07:32 | 显示全部楼层

如果在编程时加密锁定位被使能/锁定,就无法用普通编程器直接读取单片机内的程序
童雨竹 发表于 2023-4-1 08:25 | 显示全部楼层

程序开发人员做项目版本管理时的首选
Wordsworth 发表于 2023-4-1 09:28 | 显示全部楼层

将整个表面铺上一层薄薄的铜箔,并且把多余的部份给消除
Clyde011 发表于 2023-4-1 10:31 | 显示全部楼层

51 单片机不使用线性编址
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

1382

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部