【工具使用】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读写操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80671.shtml

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

相关文章

从ISO17025合规到信创适配 解密质检lims系统实验室的 AI 质检全链路实践

在北京某国家级质检中心的 CMA 复评审现场&#xff0c;审核专家通过系统后台调取近半年的检测记录&#xff0c;从样品登记时的电子签名到报告签发的 CA 签章&#xff0c;178 项合规指标全部自动校验通过 —— 这是白码质检 LIMS 系统创造的合规奇迹。 一、智能合规引擎&#xf…

【操作系统】进程同步问题——生产者-消费者问题

问题描述 生产者进程负责生产产品&#xff0c;并将产品存入缓冲池&#xff0c;消费者进程则从缓冲池中取出产品进行消费。为实现生产者和消费者的并发执行&#xff0c;系统在两者之间设置了一个包含n个缓冲区的缓冲池。生产者将产品放入缓冲区&#xff0c;消费者则从缓冲区中取…

SpringBoot-6-在IDEA中配置SpringBoot的Web开发测试环境

文章目录 1 环境配置1.1 JDK1.2 Maven安装配置1.2.1 安装1.2.2 配置1.3 Tomcat1.4 IDEA项目配置1.4.1 配置maven1.4.2 配置File Encodings1.4.3 配置Java Compiler1.4.4 配置Tomcat插件2 Web开发环境2.1 项目的POM文件2.2 项目的主启动类2.3 打包为jar或war2.4 访问测试3 附录3…

Vue3 父子组件传值, 跨组件传值,传函数

目录 1.父组件向子组件传值 1.1 步骤 1.2 格式 2. 子组件向父组件传值 1.1 步骤 1.2 格式 3. 跨组件传值 运行 4. 跨组件传函数 ​5. 总结 1. 父传子 2. 子传父 3. 跨组件传值(函数) 1.父组件向子组件传值 1.1 步骤 在父组件中引入子组件 在子组件标签中自定义属…

嵌入式学习笔记 - STM32 U(S)ART 模块HAL 库函数总结

一 串口发送方式&#xff1a; ①轮训方式发送&#xff0c;也就是主动发送&#xff0c;这个容易理解&#xff0c;使用如下函数&#xff1a; HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); ②中断方式发送&#xff…

AI无法解决的Bug系列(一)跨时区日期过滤问题

跨时区开发中&#xff0c;React Native如何处理新西兰的日期过滤问题 有些Bug&#xff0c;不是你写错代码&#xff0c;而是现实太魔幻。 比如我最近给新西兰客户开发一个React Native应用&#xff0c;功能非常朴素&#xff1a;用户选一个日期范围&#xff0c;系统返回该范围内…

基于天猫 API 的高效商品详情页实时数据接入方法解析

一、引言 在电商大数据分析、竞品监控及智能选品等场景中&#xff0c;实时获取天猫商品详情页数据是关键需求。本文将详细解析通过天猫开放平台 API 高效接入商品详情数据的技术方案&#xff0c;涵盖接口申请、数据获取逻辑及代码实现&#xff0c;帮助开发者快速构建实时数据采…

系分论文《论遗产系统演化》

系统分析师论文范文系列 摘要 2022年6月,某金融机构启动核心业务系统的技术升级项目,旨在对其运行超过十年的遗留系统进行演化改造。该系统承担着账户管理、支付结算等关键业务功能,但其技术架构陈旧、扩展性不足,难以适应数字化转型与业务快速增长的需求。作为系统分析师,…

Spark Core基础与源码剖析全景手册

Spark Core基础与源码剖析全景手册 Spark作为大数据领域的明星计算引擎&#xff0c;其核心原理、源码实现与调优方法一直是面试和实战中的高频考点。本文将系统梳理Spark Core与Hadoop生态的关系、经典案例、聚合与分区优化、算子底层原理、集群架构和源码剖析&#xff0c;结合…

人工智能赋能产业升级:AI在智能制造、智慧城市等领域的应用实践

人工智能赋能产业升级&#xff1a;AI在智能制造、智慧城市等领域的应用实践 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展为各行各业带来了深刻的变革。无论是制造业、城市管理&#xff0c;还是交通、医疗等领域&#xff0c;AI技术都展现出了强大的应用…

React Native打包报错: Task :react-native-picker:verifyReleaseResources FAILE

RN打包报错&#xff1a; Task :react-native-picker:verifyReleaseResources FAILED Execution failed for task :react-native-picker:verifyReleaseResources. 解决方法&#xff1a; 修改文件react-native-picker中的版本信息。 路径&#xff1a;node_modules/react-native-p…

虚拟网络编辑器

vmnet1 仅主机模式 hostonly 功能&#xff1a;虚拟机只能和宿主机通过vmnet1通信&#xff0c;不可连接其他网络&#xff08;包括互联网&#xff09; vmnet8 地址转换模式 NAT 功能&#xff1a;虚拟机可以和宿主通过vmnet8通信&#xff0c;并且可以连接其他网络&#xff0c;但是…

docker环境和dockerfile制作

docker 一、环境和安装 1、 docker安装 使用 root 权限登录 CentOS。确保 yum 包更新到最新sudo yum update卸载旧版本yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux …

[luogu12542] [APIO2025] 排列游戏 - 交互 - 博弈 - 分类讨论 - 构造

传送门&#xff1a;https://www.luogu.com.cn/problem/P12542 题目大意&#xff1a;给定一个长为 n n n 的排列和一张 m m m 个点 e e e 条边的简单连通图。每次你可以在图上每个点设置一个 0 ∼ n − 1 0\sim n-1 0∼n−1、两两不同的权值发给交互库&#xff0c;交互库会…

智能体agent概述

智能体概述 智能体是一个能够感知环境并在环境中自主行动以实现特定目标的系统。它具有以下几个关键特征&#xff1a; 自主性 - 智能体可以在没有直接人为干预的情况下运作&#xff0c;能够自行决策和行动。 响应性 - 能够感知环境并对环境变化做出及时响应。 主动性 - 不仅…

2:OpenCV—加载显示图像

加载和显示图像 从文件和显示加载图像 在本节中&#xff0c;我将向您展示如何使用 OpenCV 库函数从文件加载图像并在窗口中显示图像。 首先&#xff0c;打开C IDE并创建一个新项目。然后&#xff0c;必须为 OpenCV 配置新项目。 #include <iostream> #include <ope…

python训练 60天挑战-day31

知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 昨天我们已经介绍了如何在不同的文件中&#xff0c;导入其他目录的文件&#xff0c;核心在于了解导入方式和python解释器检索目录的方式。 搞清楚了这些&#xff0c;那我们就可以来看看&#x…

构建自动收集并总结互联网热门话题的网站

构建自动收集并总结互联网热门话题的网站的具体方案&#xff1a; 一、系统架构设计 数据采集层 • 使用Python的Scrapy或BeautifulSoup抓取新闻网站/社交媒体API # 示例&#xff1a;微博热点爬虫 import requests def fetch_weibo_hot():url "https://weibo.com/ajax/st…

pycharm无需科学上网工具下载插件的解决方案

以下是两种无需科学上网即可下载 PyCharm 插件的解决思路&#xff1a; 方法 1&#xff1a;设置 PyCharm 代理 打开 PyCharm选择菜单&#xff1a;File → Settings → Appearance & Behavior → System Settings → HTTP Proxy在代理设置中进行如下配置&#xff1a; 代理地…

机器学习自然语言处理

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词向量&#xff08;Word Embedding&#xff09;是将人类语言转化为计算机可理解形式的关键技术。它通过数学空间中的向量表示&#xff0c;捕捉词语的语义和语法信息&#xff0c;有效解决了传统离散表示的 “维数灾难…