0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍USB实现CDC和MSC复合设备的方法

嵌入式技术开发 来源:嵌入式技术开发 2023-04-14 16:55 次阅读

之前的文章中介绍过STM32USB应用,包括虚拟串口(CDC)和大容量存储设备(MSC)。今天来介绍USB实现CDC和MSC复合设备的方法。

1.准备两个工程

首先用STM32CubeMX分别生成CDC和MSC两个工程,测试正常。

2.拷贝到一个工程中

以其中一个工程为模板,将另一个工程中需要的文件拷贝过来。这里以MSC的工程为模板,将CDC工程中的下列文件/文件夹拷贝过来,并添加到工程中。

3c200aac-daa0-11ed-bfe3-dac502259ad0.png3c436254-daa0-11ed-bfe3-dac502259ad0.png

添加完成后的工程目录如下:

3c55befe-daa0-11ed-bfe3-dac502259ad0.png

复制过来的只有usbd_cdc_if.c和usbd_cdc.c及对应的.h文件,usbd_msccdc.c文件是需要自己实现的USB复合设备的代码。

3.修改程序

a)首先,原有的工程已经有USB复合设备的框架了,要使用的话需要添加一个宏定义:USE_USBD_COMPOSITE,直接在编译器里添加就行:

3c7f18d0-daa0-11ed-bfe3-dac502259ad0.png

b)然后编写usbd_msccdc.c和对应的.h文件。该文件主要是USB复合设备的描述符等,这里不详细介绍。

c)其次修改USB CDC和MSC的端点,在usbd_cdc.h和usbd_msc.h文件中:

CDC使用的是0x81 0x01 和0x82三个端点

#ifndefCDC_IN_EP
#defineCDC_IN_EP0x81U/*EP1fordataIN*/
#endif /* CDC_IN_EP */


#ifndefCDC_OUT_EP
#defineCDC_OUT_EP0x01U/*EP1fordataOUT*/
#endif /* CDC_OUT_EP */


#ifndefCDC_CMD_EP
#define CDC_CMD_EP                                  0x82U  /* EP2 for CDC commands */

MSC使用的是0x83和0x03端点

#ifndefMSC_EPIN_ADDR
#define MSC_EPIN_ADDR                0x83U


#ifndefMSC_EPOUT_ADDR
#define MSC_EPOUT_ADDR               0x03U
d)然后把usbd_conf.h文件中USBD_MAX_NUM_INTERFACES的值1修改为3

e)修改usbd_conf.c文件,如下:

3c96ecee-daa0-11ed-bfe3-dac502259ad0.png

f)修改usbd_msc.c和usbd_cdc.c文件如下:

3cc864ea-daa0-11ed-bfe3-dac502259ad0.png3cd80756-daa0-11ed-bfe3-dac502259ad0.png       

g)最后修改usb_device.c文件:

void MX_USB_DEVICE_Init(void)
{
/*USERCODEBEGINUSB_DEVICE_Init_PreTreatment*/
  /* USER CODE END USB_DEVICE_Init_PreTreatment */


  /* Init Device Library, add supported class and start the library. */
 if (USBD_Init(&hUsbDeviceFS, &usbCmpsitFS_Desc, DEVICE_FS) != USBD_OK)
  {
    Error_Handler();
  }
  /* if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_MSC) != USBD_OK)
  {
    Error_Handler();
  } */


  if(USBD_RegisterClassComposite(&hUsbDeviceFS, &USBD_CDC,CLASS_TYPE_CDC,0) != USBD_OK)
  {
    Error_Handler();
  }


  if(USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK)
  {
    Error_Handler();
  }
  if(USBD_RegisterClassComposite(&hUsbDeviceFS, &USBD_MSC,CLASS_TYPE_MSC,0) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_MSC_RegisterStorage(&hUsbDeviceFS, &USBD_Storage_Interface_fops_FS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_Start(&hUsbDeviceFS) != USBD_OK)
  {
    Error_Handler();
  }


  /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */


  /* USER CODE END USB_DEVICE_Init_PostTreatment */
}

最后,编译成功后下载程序测试。可以看到USB虚拟出了一个串口和1个U盘,这里的U盘是一张32G的TF卡。测试一下串口收发和U盘读写,都正常。

3cf68dd4-daa0-11ed-bfe3-dac502259ad0.png3d180fa4-daa0-11ed-bfe3-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • msc
    msc
    +关注

    关注

    0

    文章

    29

    浏览量

    20107
  • CDC
    CDC
    +关注

    关注

    0

    文章

    57

    浏览量

    17768
  • TF卡
    +关注

    关注

    2

    文章

    77

    浏览量

    12135
  • stm32cubemx
    +关注

    关注

    5

    文章

    280

    浏览量

    14746

原文标题:基于STM32CubeMx的USB CDC+MSC复合设备

文章出处:【微信号:嵌入式技术开发,微信公众号:嵌入式技术开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在Openharmony中实现USB复合设备

    如何让Openharmony设备HDC接口(OTG接口)作为一个复合设备实现HDC(HDC:鸿蒙设备连接器) +
    的头像 发表于 06-13 15:03 1375次阅读
    如何在Openharmony中<b class='flag-5'>实现</b><b class='flag-5'>USB</b><b class='flag-5'>复合</b><b class='flag-5'>设备</b>

    USB复合设备MSC+CDC,CDC_Transmit_FS函数发送不正常的原因?

    单独测试CDCMSC功能均正常,实现MSC+CDC复合设备后,均可正常识别到,但
    发表于 03-13 07:40

    stm32F446 USB复合CDCMSC,为什么只能识别一个出来?

    我现在做USB复合设备,参照网上了代码完成了复合设备代码的修改。但是现在遇到一个问题,就是CDC
    发表于 04-02 06:08

    ESP32S2使用单根USB线创建MSC+CDC与上位机通信,CDC异常的原因?

    芯片型号:ESP32S2 SDK版本:ESP-IDF 4.4.6 现在的环境是使用单根USB线创建MSC+CDC与上位机通信。当CDCMSC同时运行,且
    发表于 06-06 07:29

    USB复合设备MSC+CDCMSC异常影响CDC收发怎么解决?

    MSC读写物理存储设备的时候,如果返回一次错误(错误码:-1),不知道为什么会触发一个枚举中断(USB_OTG_GINTSTS_ENUMDNE0),会调用到reset_callback,也会把
    发表于 07-23 06:23

    灵动微课堂(第109讲) | MM32 USB功能学习笔记 —— USB复合设备

    ,在前面我们介绍了MM32 实现HID、WINUSB、CDCMSC功能,MM32系列MCU的USB功能有4个端点,所以我们可以自由组合上述
    发表于 03-04 17:23

    STM32 HAL库实现USB组合设备CDC+MSC 精选资料分享

    STM32 HAL库实现USB组合设备CDC+MSC目录STM32 HAL库实现USB组合
    发表于 08-05 07:54

    怎样去编写STM32 USB复合设备

    本实验是基于野火霸道开发板STM32F103ZET6目的完成一个CDC + MSC复合USB设备可以方便在
    发表于 08-20 07:28

    STM32 USB复合设备编写的目的是什么

    STM32 USB复合设备编写目的完成一个CDC + MSC复合
    发表于 08-20 07:10

    STM32 HAL库是如何去实现USB组合设备CDC+MSC

    STM32 HAL库是如何去实现USB组合设备CDC+MSC的?其基本步骤有哪些?
    发表于 10-27 06:05

    无法将工作中的USB复合设备应用程序从LPC54114移植到LPC11U68怎么解决?

    我无法将工作中的 USB 复合设备应用程序从 LPC54114 移植到 LPC11U68。问题背景:在此应用程序中,设备被枚举为仅 CDC
    发表于 04-14 06:34

    USB复合设备MSC+CDC,CDC_Transmit_FS函数发送不正常是怎么回事?

    单独测试CDCMSC功能均正常,实现MSC+CDC复合设备后,均可正常识别到,但
    发表于 08-08 07:32

    USB复合设备的概念及CDC MSC的讲解

    购买Hub的费用,而对于开发者则希望可以既不占用多接口,又可以实现多功能,来赢得消费者的关注。USB复合设备就在这样的市场需求下应运而生。
    发表于 09-07 06:11

    usb复合设备怎么实现cdc和键盘功能?

    请问一个usb实现cdc串口和hid键盘,用ch554怎么做,不用hub
    发表于 09-21 07:20

    STM32 USB如何配置多个CDC设备—5个CDC设备

    项需求,在STM32F072中需实现5个CDC设备,折腾了很久分享出来,希望能帮助别人少踩一些坑.USB2.0全速,该款单片机支持8个输出和8个输入端点,过程中参考了些大佬的贴子STM
    发表于 12-28 19:43 31次下载
    STM32 <b class='flag-5'>USB</b>如何配置多个<b class='flag-5'>CDC</b><b class='flag-5'>设备</b>—5个<b class='flag-5'>CDC</b><b class='flag-5'>设备</b>