TeenyUSB MSC U盘开发指南:用FatFs打造你自己的闪存U盘设备
TeenyUSB MSC U盘开发指南用FatFs打造你自己的闪存U盘设备【免费下载链接】TeenyUSBLightweight USB device and host stack for STM32 and other MCUs. Ready for USB 3.0 device.项目地址: https://gitcode.com/gh_mirrors/te/TeenyUSBTeenyUSB 是一个轻量级单片机 USB 协议栈支持 STM32、CH565W 等主流 MCU 的 USB 设备与主机模式。本指南带你用 TeenyUSB 的 MSC大容量存储类功能把 MCU 做成一台电脑即插即用的 U 盘并配合项目内置的 FatFs 文件系统直接在 U 盘上读写文件——无需任何驱动Windows/macOS/Linux 全平台免驱识别。1. 三分钟了解 MSC 设备架构 把 MCU 变成 U 盘本质上就是让单片机应答标准的 SCSI 命令。TeenyUSB 在class/msc/目录下提供了完整的 MSC BOTBulk-Only Transport协议实现模块路径作用MSC 设备类tusbd_msc.cBOT 协议状态机、SCSI 命令解析MSC 设备接口tusbd_msc.htusb_msc_device_t结构与回调定义BOT 协议定义tusb_msc.hCBW/CSW 包格式SCSI 命令定义tusb_scsi.hINQUIRY、READ(10)、WRITE(10) 等命令复合设备示例composite_device.c含 MSC U 盘的完整可编译例程USB 传输由底层 API 与中断回调完成而应用层只需要关心三件事写三个块级回调函数get_cap容量、block_read读块、block_write写块填一个结构体把回调挂到tusb_msc_device_t上在主循环里调用tusb_msc_device_loop()处理命令。这就是 TeenyUSB teeny迷你的精髓——MSC 设备类代码只有几百行却能让电脑把你的 MCU 识别成标准可移动磁盘。2. 用 TeenyDT 生成带 MSC 接口的描述符USB 描述符不需要手写项目自带基于 Lua 的描述符生成工具TeenyDT源码见 TeenyDT/。在 composite_desc.lua 中MSC 接口只需 6 行配置Interface{ bInterfaceClass 0x08, -- MSC bInterfaceSubClass 0x06, -- SCSI bInterfaceProtocol 0x50, -- BOT EndPoint(IN(4), BulkDouble, 64), EndPoint(OUT(4), BulkDouble, 64), }生成后的teeny_usb_desc.c/h由脚本自动产出其中BulkDouble表示按高速/全速自动调整端点包长。三个值0x08 / 0x06 / 0x50是 U 盘识别的身份证操作系统看到它们就会加载大容量存储驱动。3. 实现块设备回调告诉协议栈数据存哪里MSC 层只操作 512 字节的块存储介质可以是 RAM、NOR Flash、SD 卡甚至 NAND。以 composite_device.c 中的 RAM 盘为例tusb_msc_device_t msc_dev { .backend msc_device_backend, .ep_in 4, .ep_out 4, .max_lun 0, // 1个逻辑单元 .get_cap msc_get_cap, // 返回块数/块大小 .block_read msc_block_read, .block_write msc_block_write, };RAM 盘示例代码 L233-L272START_ADDR指向 RAM 尾部的空闲区域BLOCK_COUNT按芯片 RAM 计算读写就是memcpy速度最快适合功能演示Flash 盘示例代码 L275-L297START_ADDR从 Flash 偏移 20KB 处开始块大小取 Flash 扇区大小写入调用flash_write()适合做真正的闪存 U 盘但注意 Flash 擦写寿命有限。两个回调的返回值约定很清晰返回实际读写的字节数出错返回 -1协议栈会自动填充相应的 SCSI Sense 错误码如MEDIUM_ERROR、WRITE_FAULT宿主机就能看到读写失败提示。⚠️常见坑MSC_DATA_PACKET_LENGTH数据缓冲区必须 ≥ 512否则 composite_device.c 末尾的编译期检查会直接报错。配置好结构体后只需在主循环中周期性调用tusb_msc_device_loop(msc_dev);示例代码 L229电脑即可看到一块可移动磁盘。4. 用 FatFs 让 U 盘支持文件读写 裸盘只是一堆块数据接上 FatFs 后电脑才能看到.txt、.jpg这样的文件。项目已在 third_part/fatfs/ 内置完整的 FatFs 源码ff.c / ff.h文件系统核心FAT12/16/32 读写ffconf.h功能裁剪配置diskio.c底层磁盘适配胶水层FatFs 通过diskio.c与具体存储解耦其中预留了 RAM/MMC/USB 三种物理盘的定义。接入自己的存储只需实现四个胶水函数以 RAM 盘为例DRESULT RAM_disk_read(BYTE *buff, LBA_t sector, UINT count) { memcpy(buff, (void*)START_ADDR sector*512, count*512); return RES_OK; }然后挂载并验证f_mount(fs, , 1); // 挂载盘0 FRESULT res f_open(file, hello.txt, FA_READ); f_read(file, buf, sizeof(buf), bytes); // 读出U盘里的文件由于 TeenyUSB 的block_read/block_write回调与disk_read/disk_write参数几乎一致起始块地址 块数 缓冲区FatFs 层可以零拷贝地直接调用 MSC 的同一套存储函数一套介质驱动同时服务于USB 对外服务和自己读自己的盘两个方向。提示FAT 的根目录表、FAT 表会频繁改写。若介质是 Flash建议在diskio.c中加一层块缓存或把 FAT 表映射到 RAM可显著延长 Flash 寿命。5. 一键编译验证项目使用arm-none-eabi-gcc工具链编译MSC 已集成在 composite 复合设备示例中HID CDC WinUSB MSC 四合一git clone https://gitcode.com/gh_mirrors/te/TeenyUSB cd TeenyUSB git submodule update --init # 拉取mcu_lib的STM32库 cd sample make comp支持的验证板卡包括 STM32F072/F103/F107/F303/F407/F723/F767/H743 及 CH565WUSB 3.0 设备各板卡配置见 sample/boards/。烧录后插线到电脑设备管理器中应看到 TeenyUSB 厂商名的可移动磁盘SCSI INQUIRY 回复默认是TeenyUSB / MSC BOT DEMO可在 tusbd_msc.c 的msc_scsi_inquiry()中改成你自己的品牌名。6. 常见问题排查清单 ✅现象原因与对策电脑识别为未知设备描述符 MSC 三字节不对确认0x08/0x06/0x50并用 TeenyDT 重新生成磁盘容量为 0 或异常get_cap返回的block_num计算错误注意减去程序与栈占用的空间读写偶发失败block_read/block_write返回了 -1检查地址越界与 Flash 扇区对齐FatFs 挂载失败FR_NO_FILESYSTEM裸盘无 FAT 表先用电脑格式化一次或调用f_mkfs()初始化编译报错 buffer 太小把MSC_DATA_PACKET_LENGTH提到 ≥ 512进阶方向tusb_msc_device_t支持max_lun多逻辑单元和可选的scsi_opsis_ready、loadEject、inquiry可以实现可弹出语义和自定义 INQUIRY 品牌信息主机侧的 tusbh.c 同样实现了 MSC Host 类同一块板还能反过来读取插入的 U 盘——设备与主机双角色这正是 TeenyUSB 相比同类轻量栈的优势所在。祝你的第一块MCU 自制 U 盘点亮成功【免费下载链接】TeenyUSBLightweight USB device and host stack for STM32 and other MCUs. Ready for USB 3.0 device.项目地址: https://gitcode.com/gh_mirrors/te/TeenyUSB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026届注意:你的第一份工作可能被AI取代?这些测试岗反而在逆势扩招

2026届注意:你的第一份工作可能被AI取代?这些测试岗反而在逆势扩招

关注 「软件测试就业联盟」公众号,陪你走好校招求职的每一步 当别人还在担心被AI取代的时候,聪明人已经拿到了月薪6万的Offer 01 一个让我失眠的对话 上周,一个985院校的应届生给我发了条私信: “老师,我投了80多份测试…

2026/8/28 15:25:33 阅读更多 →
OpenOSINT在赏金漏洞挖掘中的实战:一次完整的Web资产侦察工作流

OpenOSINT在赏金漏洞挖掘中的实战:一次完整的Web资产侦察工作流

OpenOSINT在赏金漏洞挖掘中的实战:一次完整的Web资产侦察工作流 【免费下载链接】OpenOSINT AI-powered OSINT agent with interactive REPL, MCP server, and CLI. 19 tools. Works with Claude, GPT-4, or local models. For authorized security research only. …

2026/8/28 15:31:28 阅读更多 →
zbus信号机制完全指南:MatchRule订阅与SignalEmitter发射D-Bus信号

zbus信号机制完全指南:MatchRule订阅与SignalEmitter发射D-Bus信号

zbus信号机制完全指南:MatchRule订阅与SignalEmitter发射D-Bus信号 【免费下载链接】zbus Rust D-Bus crate. 项目地址: https://gitcode.com/gh_mirrors/zb/zbus zbus 是 Rust 生态中功能最完善的 D-Bus 通信 crate,它的信号机制由两对核心 API …

2026/8/28 15:16:58 阅读更多 →

最新新闻

录屏自动缩放事件同步工具:从输入校验到离线报告的完整实现

录屏自动缩放事件同步工具:从输入校验到离线报告的完整实现

录屏自动缩放事件同步工具:从输入校验到离线报告的完整实现 项目编号:20260829-010。本文代码、测试、文档、示例数据和效果图均为独立编写,不包含热点产品或开源项目源码、品牌素材与官方截图。 问题与目标 对齐鼠标点击、焦点变化、缩放开…

2026/8/29 20:49:09 阅读更多 →
工业数据采集设备开发实战:从电压频率测量到嵌入式系统设计

工业数据采集设备开发实战:从电压频率测量到嵌入式系统设计

1. 项目概述:从“采集”到“洞察”的工业感知之旅“蓝桥杯第七届国赛:电压、频率采集设备”这个题目,乍一看可能觉得就是个简单的数据测量任务,无非是做个万用表或者频率计。但如果你真这么想,那可能就错过了这个赛题背…

2026/8/29 20:49:09 阅读更多 →
电脑录制脱敏区域工具:从输入校验到离线报告的完整实现

电脑录制脱敏区域工具:从输入校验到离线报告的完整实现

电脑录制脱敏区域工具:从输入校验到离线报告的完整实现 项目编号:20260829-009。本文代码、测试、文档、示例数据和效果图均为独立编写,不包含热点产品或开源项目源码、品牌素材与官方截图。 问题与目标 记录窗口、屏幕区域、应用类别、敏感…

2026/8/29 20:49:09 阅读更多 →
基于STM32的工控电压频率采集设备设计实战:从方案到调试

基于STM32的工控电压频率采集设备设计实战:从方案到调试

1. 从零到一:一个工控老兵的电压频率采集设备构建实录最近在整理过往的项目资料,翻到了几年前为参加一个国家级技能竞赛而设计制作的一套电压、频率采集设备。这个项目虽然源于比赛,但其核心——如何稳定、精确地采集工业现场或实验室中的电压…

2026/8/29 20:49:09 阅读更多 →
软件工程保研全攻略:从自我定位到offer选择的系统工程实践

软件工程保研全攻略:从自我定位到offer选择的系统工程实践

1. 项目概述:一场关于选择与准备的“系统工程”又到了一年一度保研季的尾声,看着学弟学妹们开始新一轮的焦虑与准备,我想是时候把自己去年(2021年)那段兵荒马乱的软件工程保研经历系统地梳理一下了。这绝不仅仅是一份“…

2026/8/29 20:49:09 阅读更多 →
K210与STM32双核架构在智能垃圾桶项目中的实战应用与调试经验

K210与STM32双核架构在智能垃圾桶项目中的实战应用与调试经验

1. 项目概述:从“工训”到“智能”的实践跨越 “工训智能垃圾桶”这个项目,对于参加过工程训练竞赛或者相关课程的朋友来说,肯定不陌生。它本质上是一个典型的嵌入式综合应用项目,融合了传感器技术、图像识别、机械控制和无线通信…

2026/8/29 20:48:09 阅读更多 →

日新闻

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:00:24 阅读更多 →
【JavaScript】内存管理-垃圾回收机制-内存泄露

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:00:24 阅读更多 →
Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/29 0:00:24 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/29 18:08:35 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 23:05:07 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/28 19:47:53 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/29 4:34:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/28 17:43:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/29 2:05:18 阅读更多 →