STM32CubeMX-USB配置-实现U盘功能

张开发
2026/4/11 12:08:18 15 分钟阅读

分享文章

STM32CubeMX-USB配置-实现U盘功能
一、概述无论是新手还是大佬基于STM32单片机的开发使用STM32CubeMX都是可以极大提升开发效率的并且其界面化的开发也大大降低了新手对STM32单片机的开发门槛。本文主要讲述STM32芯片USB功能的配置及其相关知识。二、软件说明STM32CubeMX是ST官方出的一款针对ST的MCU/MPU跨平台的图形化工具支持在Linux、MacOS、Window系统下开发其对接的底层接口是HAL库另外习惯于寄存器开发的同学们也可以使用LL库。STM32CubeMX除了集成MCU/MPU的硬件抽象层另外还集成了像RTOS文件系统USB网络显示嵌入式AI等中间件这样开发者就能够很轻松的完成MCU/MPU的底层驱动的配置留出更多精力开发上层功能逻辑能够更进一步提高了嵌入式开发效率。演示版本 6.1.0三、USB功能简介1、顶部模块- Analog transceiver模拟收发器通过 DP 和 DM 引脚实现物理层信号的收发是 USB 与外部连接的接口。2、 绿色区域USB 时钟 48MHz 驱动Suspend timer挂起定时器用于管理 USB 的挂起状态。RX、TX、Control负责数据的接收RX与发送TX以及控制相关操作。Clock recovery时钟恢复模块从输入信号中恢复时钟。Endpoint selection端点选择模块用于选择不同的 USB 端点。这些模块连接到 Control registers and logic控制寄存器及逻辑和 Interrupt registers and logic中断寄存器及逻辑实现配置与中断管理同时连接到多个 Endpoint registers端点寄存器用于存储端点相关数据。Packet buffer interface数据包缓冲区接口负责与下方的缓冲区模块交互。3、灰色区域PCLK 驱动通过 APB1 总线通信Arbiter仲裁器管理总线访问优先级。Packet buffer memory数据包缓冲存储器存储 USB 数据。Register mapper寄存器映射将端点寄存器映射到系统地址空间。Interrupt mapper中断映射将 USB 中断路由到 NVIC嵌套向量中断控制器。APB1 wrapperAPB1 总线封装通过 APB1_bus 与系统连接PCLK1 提供时钟。整体上该框图展示了 USB 外设从物理信号收发、时钟处理、数据传输到系统接口APB1的完整流程以及寄存器配置、中断管理等功能模块的协作关系。四、USB配置及代码实现STM32CubeMX配置这是USB设备类选择的下拉菜单因为我们要实现一个U盘的功能所以这里我们选择Mass Storage Class简称MSC。Disable禁用表示不使用任何设备类功能。Audio Device Class音频设备类用于音频相关设备如声卡、耳机等音频输入输出设备。Communication Device Class (Virtual Port Com)通信设备类虚拟串口用于实现虚拟串口通信功能方便设备与计算机进行数据传输常应用于一些需要串口通信模拟的场景。Download Firmware Update Class (DFU)下载固件更新类用于设备固件的更新操作允许设备在运行过程中通过特定方式更新自身固件。Human Interface Device Class (HID)人机接口设备类像键盘、鼠标、游戏手柄等直接与用户交互的设备属于此类。Custom Human Interface Device Class (HID)自定义人机接口设备类是在标准 HID 基础上根据特定需求进行定制开发的人机交互设备类别。Mass Storage Class大容量存储类用于 U 盘、移动硬盘等存储设备使设备能像存储介质一样被计算机识别和读写数据。这部分是 USB 设备描述符相关的配置信息分为 Device Descriptor设备描述符 和 Device Descriptor FS全速设备描述符 两部分这些描述符信息是 USB 设备在与主机通信时用于向主机声明自身属性和功能的关键参数确保设备能被正确识别和驱动这部分不需要修改了解下其作用即可。Device DescriptorVID (Vendor Identifier)厂商标识符值为 1155用于唯一标识设备的生产厂LANGID_STRING (Language Identifier)语言标识符值为 English(United States)表示设备使用的语言为美国英语。MANUFACTURER_STRING (Manufacturer Identifier)制造商标识符值为 STMicroelectronics表明设备由意法半导体制造。Device Descriptor FSPID (Product Identifier)产品标识符值为 22314用于唯一标识该厂商下的具体产品。PRODUCT_STRING (Product Identifier)产品描述字符串值为 STM32 Mass Storage说明这是一个基于 STM32 的大容量存储设备如 U 盘、移动存储等。CONFIGURATION_STRING (Configuration Identifier)配置描述字符串值为 MSC Config表示设备的配置与大容量存储类Mass Storage Class, MSC相关。INTERFACE_STRING (Interface Identifier)接口描述字符串值为 MSC Interface表明设备使用的接口属于大容量存储类接口用于实现数据的存储读写功能。完整配置如下USB 协议规定时钟误差需≤±0.25%而STM32F103的内部 RC 振荡器HSI8MHz精度仅 ±1%无法满足要求所以这时必须使用外部晶振。时钟按CubeMX自己计算的即可一般是用48MHz。使用软件自己配置的时钟频率但是时钟频率比较低我们还可以自己配置自己配置时钟频率相关接口实现完成以上配置后生成工程为实现电脑对U盘的读写功能这里还需要实现usbd_storage_if.c文件下的STORAGE_Read_FS和STORAGE_Write_FS接口以完成电脑识别USB后对单片机内部Flash的操作同时可以修改一下STORAGE_GetCapacity_FS接口用来给电脑识别U盘设备的容量大小。如果需要使用外部Flash则在此处实现外部Flash的读写操作。/** defgroup USBD_STORAGE_Private_Defines * brief Private defines. * { */ #define STORAGE_LUN_NBR 1 #define STORAGE_BLK_NBR 44//0x10000 #define STORAGE_BLK_SIZ 0x400//0x200 /* USER CODE BEGIN PRIVATE_DEFINES */ #define FLASH_START_ADDR 0x08005000 /* USER CODE END PRIVATE_DEFINES */ /** * brief . * param lun: . * param block_num: . * param block_size: . * retval USBD_OK if all operations are OK else USBD_FAIL */ int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size) { /* USER CODE BEGIN 3 */ *block_num STORAGE_BLK_NBR; *block_size STORAGE_BLK_SIZ; return (USBD_OK); /* USER CODE END 3 */ } /** * brief . * param lun: . * retval USBD_OK if all operations are OK else USBD_FAIL */ int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 6 */ if (lun 0) { memcpy(buf, (uint8_t *)(FLASH_START_ADDR blk_addr * FLASH_PAGE_SIZE), blk_len * FLASH_PAGE_SIZE); } return (USBD_OK); /* USER CODE END 6 */ } /** * brief . * param lun: . * retval USBD_OK if all operations are OK else USBD_FAIL */ int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 7 */ if (lun 0) { FLASH_EraseInitTypeDef f; uint32_t err 0; uint16_t i; /* Flash解锁 */ HAL_FLASH_Unlock(); f.TypeErase FLASH_TYPEERASE_PAGES; f.PageAddress FLASH_START_ADDR blk_addr * FLASH_PAGE_SIZE; f.NbPages blk_len; f.Banks FLASH_BANK_1; /* Flash擦除 */ HAL_FLASHEx_Erase(f, err); for (i 0; i blk_len * FLASH_PAGE_SIZE; i 4) { /* Flash写入 */ HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_START_ADDR blk_addr * FLASH_PAGE_SIZE i, *(uint32_t *)(buf[i])); } /* Flash锁 */ HAL_FLASH_Lock(); } return (USBD_OK); /* USER CODE END 7 */ }五、效果通过USB接口将板子和电脑连接这个时候电脑就会弹出U盘接入的弹窗然后在电脑文件夹中可以看到这个磁盘然后可以在里面新建文件比如创建一个txt文件然后写入123等数据然后拔插一下USB还可以看到里面有这个txt文件六、注意事项1、如果是自己画的板子注意D口DP需要上拉个1.5k的电阻到3.3V。

更多文章