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

news2024/12/28 3:05:54

之前的文章中介绍过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.coloradmin.cn/o/426125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行内元素之间出现空白间隙及解决办法

这里的行内元素包括 display 为 inline 和 inline-block 的元素。 基本布局 <div class"container"><span class"item">1</span><span class"item">2</span><span class"item">3</span> …

15. unity官网资源商店的免费资源引入自己项目中

1. 说明 在unity开发中可以在官网引入一些免费的资源&#xff0c;免得自己找不到合适的素材 第一步&#xff1a; 首先进入Unity资源商店官网&#xff0c;https://assetstore.unity.com/&#xff0c;计入并登录自己的unity账号&#xff0c;如果没账号&#xff0c;可以注册一个…

什么是堆叠面积图?如何解读?

简介 在之前的文章中提到过&#xff0c;面积图&#xff08;Area Chart&#xff09;是在折线图的基础上&#xff0c;对折线以下区域进行颜色填充&#xff0c;主要是用于在连续间隔或时间跨度上展示数值。而今天我们要说的是堆叠面积图&#xff08;Stacked Area Chart&#xff0…

一切都是命中注定的!

“光锥之内就是命运”&#xff0c;这是刘慈欣的《三体黑暗森林》里一句话&#xff0c;如果我们看到一件事情正在发生&#xff0c;那么它早在过去无论是几秒前还是几千年前&#xff0c;就已经发生了&#xff0c;我们无法改变这个命运。 孔明叹曰&#xff1a;“谋事在人&#xf…

( “树” 之 DFS) 671. 二叉树中第二小的节点 ——【Leetcode每日一题】

671. 二叉树中第二小的节点 给定一个非空特殊的二叉树&#xff0c;每个节点都是正数&#xff0c;并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话&#xff0c;那么该节点的值等于两个子节点中较小的一个。 更正式地说&#xff0c;即 root.val min(roo…

VSCODE 配置MARKDOWN

参考博客 VSCode如何将Markdown转为PDF 一篇博客让你学会在vscode上编写markdown 1&#xff1a;VSCODE 上配置插件 Markdown All in OneMakrdown Preview EnhancedPaste ImageMarkdown Pdf 2&#xff1a;插件详解 1&#xff1a;Makrdown Preview Enhanced 用来进行MARK…

Harmony OS 开发指南——源码下载和编译

本文介绍了如何下载鸿蒙系统源码&#xff0c;如何一次性配置可以编译三个目标平台&#xff08;Hi3516&#xff0c;Hi3518和Hi3861&#xff09;的编译环境&#xff0c;以及如何将源码编译为三个目标平台的二进制文件。 坑点总结&#xff1a; 下载源码基本上没有太多坑&#xf…

Rocket MQ详解

Rocket MQ 一&#xff0c;是啥&#xff0c;从哪来 RocketMQ是一个开源的分布式消息中间件&#xff0c;最初由阿里巴巴集团开发。它的设计目标是为了在高并发、高吞吐量的场景下&#xff0c;实现可靠的消息传输&#xff0c;并且具有良好的可伸缩性和可扩展性。 RocketMQ支持多…

杨志丰:一文详解,什么是单机分布式一体化?

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 3 月 25 日&#xff0c;第一届 OceanBase 开发者大会在北京举行&#xff0c;OceanBase 首席架构师杨志丰&#xff08;花名&#xff1a;竹翁&#xff09;带来了 《OceanBase 的单机分布式一体化》 的…

【分享】如何移除PDF密码?

相信不少小伙伴在工作的时候&#xff0c;经常会为了保证PDF文档的安全和私密而给文件设置“打开密码”&#xff0c;但如果后续需要频繁使用该文件&#xff0c;每次打开都要查找输入密码&#xff0c;就会使得工作效率大大降低耽误工作时间。那后续不需要设置保护了&#xff0c;要…

【深度学习】nvidia-smi 各参数意义

文章目录前言1.重点概念解析2.限制GPU显卡功率前言 一个服务器遇到问题了&#xff0c;GPU Fan 和 Perf 两个都是err。之前没遇到这个问题&#xff0c;所以这次机会要搞搞清楚。每个参数都是在干事&#xff0c;能够收到哪些hint&#xff0c;如何查问题。 --------------------…

充电桩测试设备TK4860C交流充电桩检定装置

TK4860C是一款在交流充电桩充电过程中实时检测充电电量的充电桩测试标准仪器&#xff0c;仪器以新能源车为负载&#xff0c;结合宽动态范围测量技术、电能ms级高速刷新等技术&#xff0c;实现充电全过程的累积电能精准计量&#xff0c;相比于传统的预设检定点的稳态计量&#x…

攻防世界Web_php_include

php文件包含题 启动场景 进行代码审计&#xff1a; 对get类型参数进行循环过滤字符串php://&#xff0c;所以考虑其他伪协议&#xff0c;伪协议详见PHP伪协议详解_Snakin_ya的博客-CSDN博客 show_source() 函数 str_replace() 函数 strstr() 函数 方法一 使用data协议 da…

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透

文章目录前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面转载自远程内网穿透的文章&#xff1a;Linux使用宝塔面板搭建网站&#xff0c;并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#xf…

淘宝模拟登录 +淘宝商品详情数据、淘宝商品列表数据爬取

PYTHON环境&#xff1a; * requests库 * time库 * re库 实现思路&#xff1a; * 检查此账号需不需要验证&#xff08;滑动验证/验证码&#xff09; * 浏览器/工具 获取ua和加密后的密码(一劳永逸的方法) * post请求登录url获取st申请url * 根据获得的st申请地址获取st…

Session详解(重点)

类似于去服务器注册账号&#xff0c;只要服务器不停机&#xff0c;自己注册的账号一直会存在服务器。 什么是Session&#xff1a; 1.服务器会给每一个用户&#xff08;浏览器&#xff09;创建一个对象&#xff1b; 2.一个Session独占一个浏览器&#xff0c;只要浏览器没有关…

如何高效清洗数据?试试这款神器

在大数据时代&#xff0c;数据的来源具有多样性、复杂性。 针对数量庞大、渠道及格式多样的数据&#xff0c;数据清洗就成为刚需。 在数据分析中&#xff0c;数据清洗实际上是十分繁重且关键的一步。 Power Query作为数据清洗的工具&#xff0c;能将这些多源的数据集中并统一…

优化城市布局:地下管网解决方案的应用

城市地下管网是城市基础设施中非常重要的一部分&#xff0c;包括排水系统、供水系统、天然气管道、电缆管道等多种管网。然而&#xff0c;城市地下管网也是一个复杂而庞大的系统&#xff0c;由于年久失修和规划不当等原因&#xff0c;经常出现漏水、爆炸、停电等问题&#xff0…

【Unity入门】10.物体的运动

【Unity入门】物体的运动 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;用脚本驱动物体移动 &#xff08;1&#xff09;制作一台运动的小车 回顾上一篇文章&#xff0c;我们已经可以用脚本…

Allegro thermal relief热风焊盘

为了画个通孔焊盘&#xff0c;看了很久的 Thermal relief相关的内容&#xff0c;终于基本上理解了。记录一下。 这篇文章讲得非常清楚&#xff1a; 深入理解Allegro之Thermal Relief与Anti Pad - 百度文库 (baidu.com) 热风焊盘般用在内层&#xff0c;减少一些焊盘和铜皮的连…