电子产业一站式赋能平台

PCB联盟网

搜索
查看: 113|回复: 0
收起左侧

基于STM32CubeMx的USB CDC+MSC复合设备

[复制链接]

452

主题

452

帖子

2712

积分

三级会员

Rank: 3Rank: 3

积分
2712
发表于 2023-4-14 16:38:00 | 显示全部楼层 |阅读模式
之前的文章中介绍过STM32的USB应用,包括虚拟串口(CDC)和大容量存储设备(MSC)。今天来介绍USB实现CDC和MSC复合设备的方法。

硬件:STM32F407VET6
软件:STM32CubeMx v6.5+F4库v1.27.1
编译环境:MDK 5.30
1.准备两个工程
首先用STM32CubeMX分别生成CDC和MSC两个工程,测试正常。具体可参考之前的文章。
STM32实现USB转串口功能(含源码)

STM32&SD卡实现USB虚拟U盘(含源码)
2.拷贝到一个工程中
以其中一个工程为模板,将另一个工程中需要的文件拷贝过来。这里以MSC的工程为模板,将CDC工程中的下列文件/文件夹拷贝过来,并添加到工程中。
         

fm0q5e4a1eq6405179619.png

fm0q5e4a1eq6405179619.png

4jimath0rkr6405179719.png

4jimath0rkr6405179719.png

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

spwhylk4pkf6405179819.png

spwhylk4pkf6405179819.png

复制过来的只有usbd_cdc_if.c和usbd_cdc.c及对应的.h文件,usbd_msccdc.c文件是需要自己实现的USB复合设备的代码。
3.修改程序
a)首先,原有的工程已经有USB复合设备的框架了,要使用的话需要添加一个宏定义:USE_USBD_COMPOSITE,直接在编译器里添加就行:

latr3caripq6405179919.png

latr3caripq6405179919.png

b)然后编写usbd_msccdc.c和对应的.h文件。该文件主要是USB复合设备的描述符等,这里不详细介绍。文件内容见文章末尾链接。         
c)其次修改USB CDC和MSC的端点,在usbd_cdc.h和usbd_msc.h文件中:
CDC使用的是0x81  0x01 和0x82三个端点
  • #ifndef CDC_IN_EP#define CDC_IN_EP                                   0x81U  /* EP1 for data IN */#endif /* CDC_IN_EP */
    #ifndef CDC_OUT_EP#define CDC_OUT_EP                                  0x01U  /* EP1 for data OUT */#endif /* CDC_OUT_EP */
    #ifndef CDC_CMD_EP#define CDC_CMD_EP                                  0x82U  /* EP2 for CDC commands */MSC使用的是0x83和0x03端点
  • #ifndef MSC_EPIN_ADDR#define MSC_EPIN_ADDR                0x83U
    #ifndef MSC_EPOUT_ADDR#define MSC_EPOUT_ADDR               0x03Ud)然后把usbd_conf.h文件中USBD_MAX_NUM_INTERFACES的值1修改为3e)修改usbd_conf.c文件,如下:

    izepfvy1zbs6405180019.png

    izepfvy1zbs6405180019.png

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

    x35ryg0m0556405180120.png

    x35ryg0m0556405180120.png

    i5gfnasl0iw6405180220.png

    i5gfnasl0iw6405180220.png

            g) 最后修改usb_device.c文件:
  • void MX_USB_DEVICE_Init(void){  /* USER CODE BEGIN USB_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盘读写,都正常。

    5h0y5ci3ezx6405180320.png

    5h0y5ci3ezx6405180320.png

    b0uuoolkthz6405180420.png

    b0uuoolkthz6405180420.png

    链接:https://pan.baidu.com/s/1ZsH1C65ywMlmuznY7IrxRw?pwd=r4zr
    提取码:r4zr

    推荐阅读:STM32CubeMX之SDIO+FatFS读写SD卡
    SDIO读写SD卡速度有多快?
    Keil调试时设置断点的高级用法
    SPI方式读写SD卡速度有多快?
    【干货】STM32通过ADC模拟看门狗实现掉电保存

       欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表