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

【工具使用】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功能简介

STM32F103C8T6的USB外设

  1. 顶部模块: - Analog transceiver:模拟收发器,通过 DP 和 DM 引脚实现物理层信号的收发,是 USB 与外部连接的接口。

  2. 绿色区域(USB 时钟 48MHz 驱动): - Suspend timer:挂起定时器,用于管理 USB 的挂起状态。 - RX - TX、Control S.I.E.:负责数据的接收(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 wrapper:APB1 总线封装,通过 APB1_bus 与系统连接,PCLK1 提供时钟。 整体上,该框图展示了 USB 外设从物理信号收发、时钟处理、数据传输到系统接口(APB1)的完整流程,以及寄存器配置、中断管理等功能模块的协作关系。

四、USB配置及代码实现

  • STM32CubeMX配置

USB设备类选择

    这是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设备相关参数

    这部分是 USB 设备相关的参数设置,分为 Basic Parameters(基本参数) 和 Class Parameters(类参数) 两部分,这些参数共同配置了 USB 设备的基本属性、调试行为以及大容量存储类的缓冲区设置,确保设备在特定场景下正常工作。

  1. Basic Parameters
    USBD_MAX_NUM_INTERFACES:表示 USB 设备支持的最大接口数量,图中设置为 1。接口用于区分设备的不同功能(如一个设备仅实现单一功能时,接口数为 1)。
    USBD_MAX_NUM_CONFIGURATION:最大配置数量,设为 1。USB 设备配置代表不同工作模式,此处表示仅有一种工作模式。
    USBD_MAX_STR_DESC_SIZE:USB 描述符字符串的最大长度,为 512 bytes,用于定义设备名称等描述信息的最大长度。
    USBD_SELF_POWERED:设备自供电状态,显示 Enabled,即设备采用自供电方式,而非依赖 USB 主机供电。
    USBD_DEBUG_LEVEL:调试级别为 0: No debug message,表示调试时不输出任何调试信息。

  2. Class Parameters
    MSC_MEDIA_PACKET:针对大容量存储类(Mass Storage Class, MSC),定义媒体输入 / 输出缓冲区大小为 512 bytes,用于数据传输时的缓冲处理。

USB设备描述符相关配置

    这部分是 USB 设备描述符相关的配置信息,分为 Device Descriptor(设备描述符) 和 Device Descriptor FS(全速设备描述符) 两部分,这些描述符信息是 USB 设备在与主机通信时,用于向主机声明自身属性和功能的关键参数,确保设备能被正确识别和驱动,这部分不需要修改,了解下其作用即可。

  1. Device Descriptor
    VID (Vendor Identifier):厂商标识符,值为 1155,用于唯一标识设备的生产厂商。
    LANGID_STRING (Language Identifier):语言标识符,值为 English(United States),表示设备使用的语言为美国英语。
    MANUFACTURER_STRING (Manufacturer Identifier):制造商标识符,值为 STMicroelectronics,表明设备由意法半导体制造。
  2. Device Descriptor FS
    PID (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 振荡器(HSI,8MHz)精度仅 ±1%,无法满足要求,所以这时必须使用外部晶振。时钟按CubeMX自己计算的即可,一般是用48MHz。
USB配置

  • 相关接口实现

    完成以上配置后生成工程,为实现电脑对U盘的读写功能,这里还需要实现usbd_storage_if.c文件下的STORAGE_Read_FSSTORAGE_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 */
}
  • 效果演示

效果演示

五、注意事项

1、如果是自己画的板子,注意D+口(DP)需要上拉个1.5k的电阻到3.3V。

六、相关链接

对于刚入门的小伙伴可以先看下STM32CubeMX的基础使用及Keil的基础使用。
【工具使用】STM32CubeMX-基础使用篇
【工具使用】Keil5软件使用-基础使用篇
【工具使用】STM32CubeMX-片内Flash读写操作

相关文章:

  • 【Vue篇】组件的武林绝学:状态风暴下的乾坤挪移术
  • 详解MySQL 的 binlog,redo log,undo log
  • FreeSWITCH 纯内网配置
  • 第10天-Python操作MySQL数据库全攻略:从基础连接到高级应用
  • Java中的集合详解
  • 跨境业务服务器部署实战 - 低延迟架构设计
  • 【SPIN】PROMELA数据与程序结构详解(SPIN学习系列--7)
  • GitHub 自动认证教程
  • ⼀个并发访问量⽐较⼤的key在某个时间过期,在redis中这个时间过期什么意思
  • thread 的mutex优化
  • 大数据相关操作
  • BPMN.js编辑器设计器与属性面板数据交互
  • Fluent Bit持久化配置指南:保障日志不丢失的关键策略
  • uthash是一个非常轻量级的库
  • 链表的面试题8之环形链表
  • SpringBoot 商城系统高并发引起的库存超卖库存问题 乐观锁 悲观锁 抢购 商品秒杀 高并发
  • kafka入门(二)
  • Golang的文件上传与下载
  • 【北邮通信系统建模与仿真simulink笔记】(1)主要用到的模块库介绍
  • Linux:面试题
  • 每日475.52元!最高检公布侵犯公民人身自由最新赔偿金标准
  • 中国需加强自主创新和国际合作,提升产业链供应链韧性
  • 技术派|台军首次试射“海马斯”火箭炮,如何压制这种武器?
  • 夜驾遇东北虎隔窗对视?延吉林业局:村里有牛被咬死,保险公司会理赔
  • 对谈|“大礼议”:嘉靖皇帝的礼法困境与权力博弈
  • 九江宜春领导干部任前公示,3人拟提名为县(市、区)长候选人