当前位置: 首页 > article >正文

STM32CubeMx+HAL库实现USB CDC+MSC复合设备

之前的文章中介绍过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工程中的下列文件/文件夹拷贝过来,并添加到工程中。

         

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

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

3.修改程序

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

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               0x03U

d)然后把usbd_conf.h文件中USBD_MAX_NUM_INTERFACES的值1修改为3

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

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

        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盘读写,都正常。

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

提取码:r4zr


http://www.kler.cn/news/11754.html

相关文章:

  • 第三十三章 深度测试总结
  • 面试官:谈谈你对领域模型设计(DDD)的理解和心得
  • Mybatis(八)动态Sql的实现原理
  • 「MongoDB」时序数据库和MongoDB第二部分-模式设计最佳实践
  • 【NLP实战】基于Bert和双向LSTM的情感分类【下篇】
  • RGB与YUV
  • PageHelper的使用
  • 得物 API一站式协作平台的一些思考
  • 2023年阿里云新用户轻量应用服务器价格表(精准报价)
  • 【C语言数组部分】
  • 矿泉水为什么会溴酸盐超标
  • QT网络通信-服务器(一)
  • Dva.js(基础、简单例子解读)
  • Mysql 学习(五)InnDB 存储引擎-B+树索引的使用
  • 每日学术速递4.11
  • Ceph Ansible 和 Cephadm 之间的比较
  • Session、Cookie和Token
  • vue3 组件篇 Message
  • 人工智能动物农场的猪、牛和蟑螂
  • 《C++高并发服务器笔记——第四章》
  • node 服务发布后无法访问
  • 【Redis数据库】异地公网远程登录连接Redis教程
  • SpringBoot接口 - 如何实现接口限流之单实例
  • webgl-画三角形
  • vue+element-plus上传图片功能以及回显问题还有数量限制
  • 精通 NumPy 数值分析:6~10
  • c/c++:二维数组,数组的行数和列数求法sizeof,数组初始化不同形式,5个学生,3门功课,求学生总成绩和功课总成绩
  • Python操作MySQL就是这么简单
  • ROS开发之如何使用ICM20948 IMU模块?
  • Ubuntu20.04安装matlab2022b