STM32 USB组合设备 MSC CDC

STM32 USB组合设备 MSC CDC实现

教程

教程请看大佬niu_88
手把手教你使用USB的CDC+MSC复合设备(基于stm32f407)

大佬的教程很好,很详细,我调出来了,代码请见我绑定的资源

注意事项

值得注意的是:

1、

cubemx固件库存储位置是

C:\Users\你的用户名\STM32Cube\Repository\STM32Cube_FW_F4_V...(你的固件版本号)

STM32Cube_FW_F4_V1.28.1\Middlewares\ST\STM32_USB_Device_Library\Class

即可找到CompositeBuilder的例子文件

2、

注意一下,usbd_composite_builder.h中

一些宏定义

USBD_CMPSIT_ACTIVATE_MSC

USBD_CMPSIT_ACTIVATE_CDC

在#include的下面

应该移到上面去,否则编译时找不到

3、

usbd_composite_builder.h修改配置描述符数组长度,宏定义USBD_CMPST_MAX_CONFDESC_SZ改成106这里

文件里本来是300,它之后会存入uint8的数组里,300会变成44,所以要修改

4、

复合设备编译宏USE_USBD_COMPOSITE

可在编译器预处理宏定义里添加

5、

我这版本比较新,使用USE_USBD_COMPOSITE后

usbd_cdc.h中

cpp 复制代码
#ifdef USE_USBD_COMPOSITE
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,
                             uint32_t length, uint8_t ClassId);
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId);
#else
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,
                             uint32_t length);
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev);
#endif /* USE_USBD_COMPOSITE */

这两个函数会使用组合设备版本,多了个classId的参数。参考大佬的代码,使用时可以如下修改。

比如

cpp 复制代码
/**
  * @brief  CDC_Transmit_FS
  *         Data to send over USB IN endpoint are sent over CDC interface
  *         through this function.
  *         @note
  *
  *
  * @param  Buf: Buffer of data to be sent
  * @param  Len: Number of data to be sent (in bytes)
  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  USBD_HandleTypeDef *pdev = &hUsbDeviceFS;

  /* Get the class index relative to this endpoint */
  uint8_t idx = USBD_CoreFindEP(pdev, CDC_IN_EP);//获取classID

  My_usb_fs_cdc_transmited = false;

  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0){
    return USBD_BUSY;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len, idx);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS, idx);
  /* USER CODE END 7 */
  return result;
}

关于我的资源

最后成功截图

我的开发环境:vscode eide插件 工具链arm-gcc

使用的芯片是stm32f405rgt6,大容量设备是SD卡,调试用的串口是串口6

相关推荐
我不会JAVA!23 分钟前
【无标题】
嵌入式硬件·h.264
芯岭技术郦32 分钟前
OM6625A芯片 Timer 定时器计数模式使用说明
stm32·单片机·嵌入式硬件
Dr.kangder2 小时前
嵌入式面试总结(八)——大小端
嵌入式硬件·面试·职场和发展·架构·嵌入式
zlinear数据采集卡4 小时前
D223的SRAM硬件记录仪:外部触发与瞬态波形捕获方案
arm开发·嵌入式硬件·fpga开发·开源
zcmodeltech4 小时前
双碳沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的碳捕集-零碳园区-综合能源全场景联动方案
stm32·嵌入式硬件·能源·嵌入式实时数据库·多分类
LCG米4 小时前
STM32零基础入门教程:从环境搭建到实战项目(点亮LED + 串口打印 + 呼吸灯)
stm32·单片机·嵌入式硬件
云泽8084 小时前
深入浅出 STM32(十一):从寄存器映射到 HAL 库位操作源码详解
stm32·单片机·嵌入式硬件
哥不想学算法4 小时前
STM32零基础教程(六):ADC、I2C、SPI与DMA
stm32·单片机·嵌入式硬件
szxinmai主板定制专家5 小时前
基于 RK3588 + Xilinx Kintex-7 FPGA 异构工业主控板设计方案
arm开发·人工智能·嵌入式硬件·fpga开发·zynq
我是一棵无人问荆的小草5 小时前
LM393DT比较器输出
单片机·嵌入式硬件