用单片机的RAM虚拟U盘(文件系统:Fat16)

stm32 模拟U盘IAP升级 与 FAT16文件系统 如果用的MCU有USB接口,那么使用模拟U盘升级程序,不失为一个好办法,因为 第1,模拟U盘,不需要驱动,也不需要上位机,现场操作非常方便, 第2,USB传输速度快,升级过程耗时少,且可靠。 这项技术的难点在于FAT16文件系统,因为STM32并没有真正的实现一个FAT文件系统,一切都是模拟的,这要求研发者对FAT16文件系统认识的非常深刻。下面为FAT16系统的简易结构图: 首先是DBR引导扇区,这里面保存着很多参数,这个不要求 每个参数都弄懂,这个数据也可以直接从一个小U盘中用winhex软 阅读详情

操作系统:rt-thread
文件系统:Fat16
硬件平台:stm32f103c8

描述:利用mcu的ram虚拟一个U盘,用于存储即时小数据,通过usb以u盘的方式供上位机读取。

一:硬盘篇

1、硬盘物理结构:

    盘片(platter):硬盘由很多盘片组成,每个盘片的每个面都有一个读写磁头(heads)。N个盘片,就有2N个面,对应2N个磁头,从0、1、2……开始编号;

    磁道:同一个盘片不同半径的同心圆为磁道(注意,是指圆周线或圆环);

    柱面(cylinders):不同盘片相同的磁道,构成柱面,由外至里编号0、1、2……

    扇区(sector):每道磁道被划分成几十个扇区,通常,一个扇区容量为512B,并按照一定规则编号1、2、3……
 

    簇:另外,由于扇区实在太多了,文件分配表没办法一一描述,所以,就把一定数量的扇区分为一个簇。所以文件系统是以一簇为最小单位的。

注意:磁头和柱面都是从0开始编号的,扇区搞毛特殊从1开始。

    总扇区数量=柱面数×磁头数×每道扇区

 2、磁盘引导:

        下图是一个4个分区的硬盘,开头的主引导记录就是上面介绍的MBR,其中4个分区表分别指出了4个分区的位置,上位机获取MBR之后,就知道了硬盘的总体结构,包括硬盘的大小、每个分区的位置、每个分区的大小等等。



 

        
 

        隐藏区(hidden sector):在分区之前的部分,而下面介绍的MBR就是隐藏区的第一个扇区。隐藏区不是必须的,它和系统启动有关,如果仅仅是作为存储,那么隐藏区可以没有。比如,标题说的用RAM虚拟的U盘。
 

        注意:在我理解中,严格地说,隐藏区应该是指每个分区之内,位于保留区之前的扇区,也就是说,每个分区都有一套隐藏区+保留区。只是在唯一存储介质的第一个分区的隐藏区才是必须的,因为它需要用于系统的启动。而其他分区的隐藏区则一般被省略。如果不被省略,比如SD的开头就有一部分隐藏区,这时,引导代码部分是空的(因为不需要它来做系统启动),只有DPT分区表才有意义,用于划分SD的分区情况。
 

    MBR(master boot record)扇区:即主引导记录,有时也叫主引导扇区,位于硬盘的0柱面0磁头1扇区,也就是所谓是第0扇区,也是整个存储介质的首个扇区。其中前446字节为引导程序,紧跟着的是64字节的硬盘分区表DPT,最后2个字节是“0x55 0xAA”,为磁盘有效结尾标志。

        MBR 是不随操作系统的不同而不同的,具有公共引导特性。(在双系统中,一般先装Windows再装linux,原因是,linux会修改这段代码,让用户可以选择进去哪个系统,但Windows却是没有,如果后装Windows,那么linux的引导就会被忽略??)

    (1)0x000-0x1bd:mbr引导代码(有些地方也叫MBR??),446字节,pc的bios执行完自举之后,会将cpu控制权交给此间的446个字节的loader程序;

    (2)0x1be-0x1fd:DPT分区表,64字节,每16字节描述一个分区,所以硬盘的主分区+扩展分区不能大于4个,另外扩展分区数不能大于1。(现实中,不止4个,其实是扩展分区里面分出来的逻辑分区,对于逻辑分区的问题上面的链接也有提到,可以参考。)

    0x1fe-0xff:0x55 0xAA。

主引导记录部分如下表:

偏移(字节)长度(字节)说明
0x003跳转指令(跳过开头一段区域)
0x038OEM名称(空格补齐)。MS-DOS检查这个区域以确定使用启动记录中的哪一部分数据 [3] 。常见值是IBM 3.3(在“IBM”和“3.3”之间有两个空格)和MSDOS5.0.
0x0b2每个扇区的字节数。基本输入输出系统参数块从这里开始。
0x0d1每簇扇区数
0x0e2保留扇区数(包括启动扇区)
0x101文档分配表数目
0x112最大根目录条目个数
0x132总扇区数(如果是0,就使用偏移0x20处的4字节值)
0x151介质描述
0xF8单面、每面80磁道、每磁道9扇区
0xF9双面、每面80磁道、每磁道9扇区
0xFA单面、每面80磁道、每磁道8扇区
0xFB双面、每面80磁道、每磁道8扇区
0xFC单面、每面40磁道、每磁道9扇区
0xFD双面、每面40磁道、每磁道9扇区
0xFE单面、每面40磁道、每磁道8扇区
0xFF双面、每面40磁道、每磁道8扇区

同样的介质描述必须在重复复制到每份FAT的第一个字节。有些操作系统(MSX-DOS 1.0版)全部忽略启动扇区参数,而仅仅使用FAT的第一个字节的介质描述确定文件系统参数。

0x162每个文档分配表的扇区(FAT16)
0x182每磁道的扇区
0x1a2磁头数
0x1c4隐藏扇区
0x204总扇区数(如果超过65535,参见偏移0x13)
0x244每个文档分配表的扇区(FAT32)。扩展基本输入输出系统参数块从这里开始。
0x241物理驱动器个数(FAT16)
0x251当前磁头(FAT16)
0x261签名(FAT16)
0x274ID(FAT16)
0x282Flags(FAT32)
0x2a2版本号(FAT32)
0x2c4根目录启始簇(FAT32)
0x2b11卷标(非FAT32)
0x302FSInfo扇区(FAT32)
0x322启动扇区备份(FAT32)
0x3412保留未使用(FAT32)
0x368FAT文件系统类型(如FAT、FAT12、FAT16)
0x3e2操作系统自引导代码
0x401BIOS设备代号(FAT32)
0x411未使用(FAT32)
0x421标记(FAT32)
0x434卷序号(FAT32)
0x4711卷标(FAT32)
0x528FAT文件系统类型(FAT32)
0x1FE2扇区结束符(0x55 0xAA)

DPT分区表:

表1  图2分区表第一字段
字节位移字段长度值字段名和定义
0x01BEBYTE0x80   引导指示符(Boot Indicator)   指明该分区是否是活动分区。
0x01BFBYTE0x01开始磁头(Starting Head)
0x01C06位0x01开始扇区(Starting Sector) 只用了0~5位。后面的两位(第6位和第7位)被开始柱面字段所使用
0x01C110位0x00开始柱面(Starting Cylinder)   除了开始扇区字段的最后两位外,还使用了1位来组成该柱面值。开始柱面是一个10位数,最大值为1023
0x01C2BYTE0x07系统ID(System ID) 定义了分区的类型,详细定义,请参阅图4
0x01C3BYTE0xFE结束磁头(Ending Head)
0x01C46位0xFF结束扇区(Ending Sector)     只使用了0~5位。最后两位(第6、7位)被结束柱面字段所使用
0x01C510位0x7B结束柱面(Ending Cylinder) 除了结束扇区字段最后的两位外,还使用了1位,以组成该柱面值。结束柱面是一个10位的数,最大值为1023
0x01C6DWORD0x0000003F相对扇区数(Relative Sectors) 从该磁盘的开始到该分区的开始的位移量,以扇区来计算
0x01CADWORD0x00DAA83D总扇区数(Total Sectors) 该分区中的扇区总数


 

        

3、FAT分区原理:
 


 

        下面终于开始说FAT。

        对于一个存储介质,隐藏区之后,才是文件系统的起始部分,以保留区开头。

        FAT文件系统的结构是按照这个方式排列的:保留区、FAT区、副FAT区、根目录区、数据区。

(1)、保留区(Reserved Region)

        保留区就是分区的开始扇区到FAT表之前的扇区,注意,保留区是位于分区之内,每个分区的开头都会有一个保留区。而保留区的第一个扇区必须是BPB。如果隐藏区为0,那么BPB将位于第0扇区。

        DBR(Dos Boot Record):即操作系统引导记录,通常位于分区的第0个扇区,共512个字节(特殊情况也要占用其它保留扇区)。在这512个字节中,其实又是由跳转指令,厂商标志和操作系统版本号,BPB(BIOS Parameter Block),扩展BPB,os引导程序,结束标志几部分组成。 以用的最多的FAT32为例说明分区DBR各字节的含义。见图:

    

对应解释见下表:
 

    表3   FAT32分区上DBR中各部分的位置划分   
字节位移字段长度字段名对应图8颜色
0x003个字节跳转指令 
0x038个字节厂商标志和os版本号 
0x0B53个字节BPB 
0x4026个字节扩展BPB 
0x5A420个字节引导程序代码 
0x01FE2个字节有效结束标志 


        其实,图中,除了黑色部分,其他部分同MBR是一样的,可以直接查看上面对MBR内容的分析表格。

        需要注意的是:

        1)跳转指令:EB xx 90,也就说第0和第2为分别是EB和90,至于具体意义,没有暂时没有深究;

        2)对应MBR,最大的区别是,DBR没有分区表DPT!
 


 

(2)、FAT区

        即文件分配表,有两份,第二份是第一份的备份。文件分配表每项代表一个簇,由于fat16使用两字节即16位来描述一个簇,所以最多只能管理65536个簇,又由于每簇最大只有32kB,所以使用fat16的时候,每个分区最大容量是2G。分区表的大小可以在DBR里设置。
 

(3)、根目录区:

        第二个FAT表(即备份FAT)后面紧接着的下一个扇区,就是根目录区的开始。存放目录项,每个目录下为32个字节,记录一个文件或目录的信息(长文件名例外)。目录项所占的扇区与可以容纳的目录项有关,一般为512项,将占“512(目录项数)×32/512(扇区大小)”个扇区。但是目录项×32一定是扇区大小512的整数倍。
 

32字节目录项内容如下表:

字节偏移长度描述
0x008DOS文件名(附加空格)

第一个字节可以是下面的特殊数值:

0x00这个条目有用并且后面没有被占用条目
0x05最初字符确实是0xE5
0x2E'点'条目;'.'或者'..'
0xE5这个条目曾经被删除不再有用。取消删除文档工具作为取消删除的一步必须使用一个正常的字符取代它。
0x083DOS文件扩展名(空格补齐)
0x0b1文档属性

第一个字节可以是下面一些特殊值:

位掩码描述
00x01只读
10x02隐藏
20x04系统
30x08卷标
40x10子目录
50x20档案
60x40设备(内部使用,磁盘上看不到)
70x80没有使用

属性值0x0F用来表示长文件名条目。

0x0c1保留,NT使用(参见后面)
0x0d1创建时间,最小时间分辨率:10ms单位,数值从0到199。
0x0e2创建时间。小时、分钟和秒根据后面的图示描述进行编码:
位描述
15-11小时(0-23)
10-5分钟(0-59)
4-0秒/2(0-29)

注意秒只保存了2秒的分辨率。更细分辨率的文档创建时间在偏移0x0d处。

0x102创建日期。年、月和日根据后面的图示编码:
位描述
15-9年(0 = 1980, 127 = 2107)
8-5月(1 = 1月,12 = 12月)
4-0日(1 - 31)
0x122最近访问时间;参见偏移0x0e处的描述。
0x142FAT12和FAT16中的EA-Index(OS/2和NT使用),FAT32中第一个簇的两个高字节
0x162最后更改时间;参见偏移0x0e处的描述。
0x182最后更改日期; 参见偏移0x10处的描述。
0x1a2FAT12和FAT16中的第一个簇。FAT32中第一个簇的两个低字节。
0x1c4文档大小

(4)、文件和目录数据区

    目录项接着的第一个扇区就是真正存放文件数据或是目录的位置了。
 


 

二:FAT16

    维基百科:http://en.wikipedia.org/wiki/Fat16
 

    其实和上面的介绍差不多。不过这是从文件系统逻辑概念来解释,而前面更偏于物理位置。

保留区文档
分配表#1
文档
分配表#2
根目录其他所有数据...
剩下磁盘空间
  1. 保留扇区,位于最开始的位置。第一个保留扇区是引导区DBR(分区启动记录)。它包括一个称为基本输入输出参数块的区域(包括一些基本的文件系统信息尤其是它的类型和其它指向其它扇区的指针),通常包括操作系统的启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。引导扇区中的重要信息可以被DOS和OS/2中称为驱动器参数块的操作系统结构访问。
  2. FAT区域。它包含有两份文档分配表,这是出于系统冗余考虑,尽管它很少使用,即使是磁盘修复工具也很少使用它。它是分区信息的映射表,指示簇是如何存储的。
  3. 根目录区域。它是在根目录中存储文档和目录信息的目录表。在FAT32下它可以存在分区中的任何位置,但是在早期的版本中它永远紧随FAT区域之后。
  4. 数据区域。这是实际的文档和目录数据存储的区域,它占据了分区的绝大部分。通过简单地在FAT中添加文档链接的个数可以任意增加文档大小和子目录个数(只要有空簇存在)。然而需要注意的是每个簇只能被一个文档占有,这样的话如果在32KB大小的簇中有一个1KB大小的文档,那么31KB的空间就浪费掉了。


    总结:拿SD卡来讲吧,给xp格式化之后的SD卡物理结构如下:隐藏区+保留区+FAT+副FAT+根目录区+数据区 1、隐藏区:包括MBR(主引导记录)和DPT(分区表),不过这里的MBR是空的,因为不需要它的系统启动。上位机首先读取这个512字节,根据DPT,知道分区情况,根据这些接着直接跳到第一分区的位置读取第一个分区; 2、保留区和FAT:这是上位机读取分区的第一部分内容,从而知道分区的情况,根据BDR知道根目录的位置;然后去读根目录。 3、根目录区:读取分区的根目录,可以知道分区的文件结构,然后根据对应的FAT,读到一个文件的内容。注意,在根目录里记录了文件的开始扇区,而这个逻辑开始扇区,是以2开头的,估计0和1已经被保留所用。

        前面说了一大堆关于FAT16和硬盘的东西,其实是为下面做准备的。因为我觉得用RAM虚拟U盘,一要熟悉fat,二要熟悉USB协议。

        前面介绍fat,下面应该就说USB了,但我对USB的了解非常肤浅,没办法从协议的角度来记录,只能简单的针对这次开发记录一下,以备后用吧。
 

        1、要了解USB的设备、配置、接口、端点等知识点,和对应的各种描述符;

        2、然后了解枚举的过程,数据线D+,D-,差分数据传输,NRZI编码,还有一些数据包;
 

        3、一个很好用的总线监控软件,可以用它来监控USB的通信过程,对开发很有用:Bus Hound;
 

        4、USB设备分类:显示器Monitors, 通讯设备Communication device, 音频设备Audio, 人机输入Human input, 海量存储Mass storage。而这次我们用的应该就是Mass storage;
 

    ……
 

        本程序是从一个MSD卡程序中改过来的,准确来说应该是奋斗版的U盘程序修改过来的。
 

        关键点:

1、建立DBR数组(操作系统引导记录):

        扇区大小:512;

        每簇扇区数:1;

        保留扇区数:1;
 

        根目录项:16,因为16×32,刚好一个扇区;
 

        小扇区数:8,因为用RAM虚拟的U盘,自然很小,其实我只用到5个扇区;
 

        每FAT扇区数:1;
 

        隐藏扇区数:0,因为不需要MBR,主引导记录;
 

        大扇区数:0,fat16小容量没有用到;
 

2、FAT数组

        FAT表以“F8 FF FF FF”开头,为介质描述单元。接着每2字节代表一簇,不过簇的标号是从2开始的,也就是说FAT表的4、5字节代表第2簇(顺序其实就是首簇),6、7字节代表第3簇,以此类推;
 

        我现在fat表如下:
 

        F8 FF FF FF  FF FF 00 00 ……
 

    绿色就是代表第2簇,它的值代表文件的占用的下一个簇的簇号,ffff表示这是文件的最后一个簇。因为我们是一个小文件,一个文件只用一个簇,所以这个就是FFFF。0000表示此簇没有被分配。

    例如,如果这里不是FFFF,而是0500(低位在前),则表示,文件的下一个簇的簇号是5,系统就会查询fat的第5簇的位置,重复上面的动作,知道遇到FFFF,表示这里是文件的最后一簇。

    

3、根目录数组

    这里根据前一篇根目录的格式,建立一个盘符根目录(就是插入电脑的时候盘符的名字),接着是一个文件目录(因为这里只需要一个文件),起始簇为2;

4、数据数组

    用于存文件的数据。

 

RAM虚拟的U盘结构是这样的:

DBR(1扇)-|-  FAT(1扇)-| -副FAT(1扇)-|- 根目录(1扇)-|- 数据(4扇,其实只用1扇的一点而已,小文件嘛)

pc上显示的空间大小是2k,原因是8个扇区中,数据占了4扇,而扇区的大小为512字节,所以大小是2k。


 

        只需修改读写函数。读函数这样修改,当读的index为512×0是,发送DBR表;当为512×1时,发FAT,当为512×3时,发送根目录;当为512×4时,发送数据。其他用00 00 00 00 ……来填充。

        写函数的修改:只允许写修改数据和根目录部分,其他时候直接返回失败标志。

        需要注意的是,为了节省RAM,DBR、FAT、都可以用const定义,但根目录和数据数组最好用非const全局定义,原因是上位机在读取文件的时候,会修改根目录的“最近访问时间”。
 

        另外,如果在pc机上把文件删掉,再重新建立的时候,根目录可不是简单的覆盖,而且还有清空FAT的对应标志。所以,我这里实现,可以删除文件,但再重新新建的时候,这个文件是没有被成功记录到虚拟的U盘的,估计,把FAT也改成可修改状态就可以实现,但是,这次项目不需要用到这点,所以没有去试。
 

        这次实现存入janho程序库“Mass_Storage(用ram虚拟u盘fat16)”中,备用。
 

基于stm32的USB虚拟U盘+FATFS+W25Q64 本文主要结合自己的编程经验有了这篇文章,能够实现简单的USB模拟U盘的实验。在本次实验中,将使用STM32作为从设备使用USB的MSC类,在W25Q64存储ic上移植FATFS。 阅读详情

相关推荐

stm32USB之模拟U盘

STM32U盘 STMF0+W25Q32模拟U盘 1.第一次写博客,如有错误,请及时指正,如有表达不通顺的地方,敬请谅解。 2.本篇文章主要描述如何使用STM32cube配置USB,使用的主控为STM32F072,Flash为W25Q32,使用的主控RAM只有16K,所以不使用太多外设,也没有使用文件系统。 3.此段说明制作U盘的目的,不感兴趣可以忽略。由于主控ROM只有128K(项目需要,不可更换),需要将图片、字库等内容存储在W25Q32中,仅有一个串口,还被WiFi模块占用。因此上网查询资料,查询到了

qq_38420206的博客 8710

基于本地硬盘无损制作虚拟U盘,无U盘使用本地硬盘分区安装操作系统(Windows、Linux系统安装启动盘)

实验环境文中工具下载链接: https://download.youkuaiyun.com/download/xzzteach/89263714 选择一个空闲空间>10GB的分区,右键:压缩卷 将待安装有启动盘ISO镜像文件解压至虚拟U盘分区 这是尽量直接解压到目标分区(考虑隐藏文件) 使用Hasleo EasyUEFI编辑启动项 重启电脑选择虚拟U盘启动 一般电脑是按F12或Ctrl+F12进入启动项

xzzteach的博客 5773

znFAT:面向MCU的轻量级FAT32嵌入式文件系统

FAT32是一种广泛应用于嵌入式存储设备的标准文件系统格式,其核心原理在于通过文件分配表(FAT)管理簇链、结合目录项实现文件逻辑组织与物理地址映射。该机制具备结构简单、跨平台兼容性强、无需复杂驱动栈等技术价值,特别适用于SD卡、SPI Flash等块设备的本地数据存取场景。在资源受限的微控制器(MCU)环境中,传统FAT实现常因内存占用高、抽象层冗余而难以部署;znFAT正是针对这一痛点设计的轻量级实现,严格遵循FAT32物理结构规范,支持标准短文件名与可选长文件名(LFN),并在STM32、GD32等主

weixin_36059856的博客 178

stm32 FAT16文件系统和USB MSC结合映射成U盘模式

(1)CubexMax生成FAT16文件系统和USB MSC的代码 首先配置USB MSC将USB配置成Device模式 然后在将Device配置成MSC 这个时候会出现如下图所示的界面 这个时候需要配置RCC 然后在配置FAT (2)设计思想 在这个过程用RAM的256K空间模拟磁盘空间 (3)关键代码 #define STORAGE_LUN_NBR ...

weixin_37747603的博客 2625

STM32 USB_HOST读写U盘全流程:CubeMX配置、FatFs挂载与避坑指南

在嵌入式系统中,U盘读写是一项常见的存储扩展需求,其背后涉及USB协议栈、Mass Storage类驱动与文件系统三层协作。理解从物理传输到文件操作的数据链路,是快速定位枚举失败、挂载异常等问题的关键。基于STM32CubeMX与HAL库,开发者可通过中间件快速搭建USB_HOST功能,结合FatFs实现文件级读写。该方案适用于离线日志采集、配置导入、固件升级包读取等中小容量数据交互场景。实际工程中,时钟配置、VBUS检测、文件系统格式与缓冲区对齐往往是隐性陷阱,直接影响系统稳定性。本文以STM32F407

weixin_34204722的博客 375

RT-Thread文件系统实战:从FatFs到LittleFS的嵌入式存储管理

文件系统是计算机科学中管理存储设备数据组织的核心机制,它通过目录树和文件抽象,将原始存储介质转化为可高效访问的结构化空间。其基本原理包括数据块管理、元数据索引和缓存策略,为上层应用提供统一的读写接口。在嵌入式开发领域,文件系统的技术价值尤为突出,它解决了在资源受限的MCU上实现可靠数据存储、固件升级和配置管理的难题,显著提升了开发效率和系统可维护性。典型应用场景包括物联网设备的数据日志记录、车载系统的固件OTA更新以及工业控制器的参数存储。针对嵌入式设备对**掉电安全**和**磨损均衡**的严苛要求,专为F

weixin_42520573的博客 331

【FatFs】手动移植FatFs,将SRAM虚拟U盘

FatFs(通用FAT文件系统模块)本身做到了和硬件分离,只要捋清楚逻辑,任何可以读写的存储器内能够使用其管理

林愿留的博客 1691

STM32F103实现U盘读写文件:CH376方案详解与工程实践

在嵌入式开发中,USB Host协议栈复杂且移植门槛高,许多工程师在给单片机增加U盘读写功能时常常受阻。文件系统与USB Mass Storage协议是理解数据存储与传输的关键,FAT32作为通用文件格式,让设备导出的数据可直接被电脑识别。STM32F103作为经典主控,通过外挂CH376协议芯片,可低成本实现U盘文件的打开、读取、写入与关闭,无需主控参与底层USB协议解析。该方案广泛应用于数据记录仪、工业参数导入导出、离线固件升级及设备日志存储等场景。本文从USB主从架构与FAT盘区布局入手,剖析CH37

499

简单实现stm32f103芯片usb模拟U盘进行IAP更新用户程序

更新单片机内的用户程序,方式一般都是仿真器,串口,网络口,usb DFU,另类一点CAN也行,但是这些方式都有一个共同点,必须要有相应的上位机配合操作,还要教会别人使用,那么能不能有更简单傻瓜化的升级方式呢? 今天二逼程序猿就来说说另类一点的USB模拟U盘进行IAP更新升级用户程序的方法!USB模拟U盘,顾名思义就是用STM32的usb device接口,根据usb massstorage大容量存

听我瞎扯淡的博客 4万+

STM32F103读写U盘文件方案解析:CH376从硬件到代码实战

嵌入式系统中,U盘是一种常见的可移动存储介质,常用于数据记录、参数配置和固件升级。但STM32F103内置的USB控制器仅支持设备模式,无法直接作为主机访问U盘,这需要借助USB Host控制器和文件系统相关知识来解决。CH376作为一款集成USB Host和FAT文件系统的桥接芯片,通过SPI/UART接口与单片机通信,将底层的USB枚举、Mass Storage协议和FAT32文件管理封装成文件级命令,大幅简化了开发流程。本文围绕该方案,从硬件连接、SPI初始化、U盘挂载、文件读写到常见问题排查,系统讲

weixin_34294649的博客 358

内部Flash模拟U盘升级固件:分区设计、FAT实现与掉电恢复

USB大容量存储类(MSC)协议使嵌入式设备能以虚拟U盘形式与主机通信,无需厂商驱动,这一特性为固件升级提供了极佳的交互方式。利用MCU内部Flash模拟U盘,用户仅需拖入bin文件即可完成固件替换,显著降低返修与现场升级成本。实现该方案的核心挑战在于Flash分区规划、FAT16文件系统的虚拟化,以及异常掉电时的数据恢复。文章系统性地介绍三段式分区(Bootloader/应用区/暂存区)的设计逻辑,展示虚拟FAT映射与扇区读写擦写策略的落地代码,并针对枚举失败、写入超时、断电变砖等高频问题给出定位与解决方

weixin_30175731的博客 243

STM32单片机,通过Flash模拟U盘运用FATFS管理文件

这三个已经可以实现了一个完整的功能,就是单片机通过某种协议比如下面会使用的SPI通讯协议对Flash进行读写数据,而为了便于操作我们在单片机上面移植了FATFS文件管理系统,对于数据的管理更加的便携。现在你已经实现了单片机上的数据管理,但是现在你想把数据在电脑上显示,于是有一个叫虚拟U盘这个东西出现,它通过数据线将电脑与单片机连接起来,希望单片机可以像U盘一样把数据显示在电脑端,所以这个便叫虚拟U盘(自己瞎比喻的)。不同系列第1步可能不一样,没有关系,现在这个一个是低速一个是高速,我选择的是高速模式。

qq_62329822的博客 218

STM32F103实现纯硬件U盘:Mass Storage Class嵌入式实践

USB Mass Storage Class(MSC)是嵌入式设备实现即插即用存储功能的核心标准,其本质是通过标准SCSI命令集(如READ10/WRITE10)与主机交互,依赖严格的USB描述符定义、CBW/CSW传输协议及LUN逻辑管理。该技术无需上位机驱动或虚拟串口桥接,直接在裸机层完成USB PHY配置、端点调度与Flash块擦写对齐,具备跨平台兼容性与工业级可靠性。典型应用场景包括固件升级接口、边缘数据缓存、教学实验平台等。本文基于STM32F103RC与W25Q64的资源约束组合,详解MSC协议

weixin_29190169的博客 118

STM32 UART驱动与U盘数据交换协议设计

UART(通用异步收发器)是嵌入式系统中最基础的串行通信机制,其核心在于将并行数据按帧格式(起始位、数据位、校验位、停止位)转换为TTL电平串行流;而RS232实为UART在物理层的电平标准延伸,需通过MAX3232或CH340等桥接芯片实现跨设备互通。该技术的价值在于构建一条低依赖、高可控的‘透明数据通道’,支撑上位机对MCU内部状态、Flash及外设(如U盘)的结构化访问。典型应用场景包括工业参数配置、固件升级、传感器日志导出等。本文聚焦STM32平台下基于UART的可靠U盘数据交换实现,深度融合硬件驱

weixin_30598047的博客 78

昇腾910B多卡环境下hccl-test性能调优实战

本文详细介绍了昇腾910B多卡环境下hccl-test性能调优的实战经验,包括环境搭建、CANN工具链配置、性能测试与高级调优技巧。通过优化缓冲区、PCIe拓扑和中断亲和性设置,显著提升多卡通信效率,为AI训练提供稳定高效的计算支持。

weixin_29216049的博客 843

逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证?

本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。

weixin_27697385的博客 222

STM32虚拟U盘实战:USB MSC+FATFS+W25Q64实现即插即用存储

在嵌入式产品开发中,设备数据导出与参数配置常受限于串口协议复杂、上位机维护成本高等问题。借助USB Mass Storage类设备协议,可以将微控制器模拟成标准U盘,实现即插即用的文件交换体验。其核心思路是以SPI NOR Flash作为存储介质,通过文件系统层对其读写进行抽象管理,再经USB MSC底层接口与上位机通信。本文从存储介质选型、文件系统移植、磁盘抽象层适配到USB描述符配置,梳理了基于STM32F103实现虚拟U盘的完整技术链路,重点剖析了W25Q64在512字节扇区与4KB擦除块间的读改写策

weixin_34185320的博客 360

紫光同创FPGA中ADF网表文件的黑匣子封装与PDS环境实战指南

本文详细介绍了在紫光同创FPGA开发环境中使用ADF网表文件进行黑匣子封装的实战指南。通过PDS环境配置、加密ADF生成、黑匣子集成及验证调试等步骤,帮助开发者实现核心IP保护,同时保持设计性能。特别适用于需要模块级代码保护的企业级FPGA开发场景。

weixin_33725239的博客 341

ESP32-S3 + TinyUSB:五分钟实现免驱U盘设备开发

USB设备开发常因底层寄存器配置、端点调度、描述符结构而令人望而却步,传统方案如CH340、FT232RL等USB转串口芯片虽然简单,但功能固定,无法灵活实现自定义设备。TinyUSB作为开源USB协议栈,封装了枚举、传输调度与各类类协议,极大降低了开发门槛。结合ESP32-S3自带的USB OTG外设,开发者无需外挂转换芯片,即可快速实现符合MSC规范的U盘设备。这种方案不仅适用于数据采集存储、产品原型验证,还能通过TinyUSB的复合设备机制,实现U盘与串口共存,甚至扩展为无线U盘或USB音频设备。本文

weixin_33965305的博客 300

KNX智能家居工程设计应用

KNX,是一个起源于欧洲的总线标准,主要应用于家居和楼宇中,对末端电气设备进行总线式的控制,比如照明、空调、地暖、电动窗帘和遮阳设备等等。根据2017年英国著名咨询公司BSRIA的数据报告显示,在中国的智能家居和灯光控制市场,KNX产品的市场份额为各类产品中排名第一,占据了42%的市场份额,远远领先于其他的标准协议。设备中一个继电器表示一路输出,某些功能可能需要用到多个输出,比如1个窗帘AC输出需要占用两路继电器输出,一个继电器用于控制正转,一个用于控制反转,而普通开关输出则需要占用一路继电器输出即可。

hhhh5555666的博客 934

无人机上下通信信号解析程序和代码

总的来说,无人机上下行信号解析是无人机系统中非常重要的一部分,它关系到无人机的飞行控制和图像传输能力,对于保障无人机的飞行安全和数据传输质量具有重要作用。3. 读取和解析地面控制中心发送的命令和数据:程序还需要能够读取地面控制中心发送给无人机的命令和数据。1. 读取和解析无人机发送的命令和数据:程序需要能够读取无人机发送的信号,并解析其中的命令和数据。4. 将解析结果传递给无人机:解析地面控制中心发送的命令和数据后,程序需要将解析结果传递给无人机。具体的实现方式可以根据无人机的通信协议和硬件设备来确定。

2401_84824274的博客 2189

Linux驱动--uboot使用

一.一些概念 1.BootLoader BootLoader不属于操作系统,采用汇编语言和C开发 2.BootLoader两种模式 交互模式:命令接口API 自启动模式:芯片上电后从固态固件加载操作系统到RAM。整个过程没有用户介入 3.核内寄存器: CPU内部寄存器,没有地址只能通过汇编访问 arm有37个寄存器,有ARM七种模式,包括系统模式(SYS)、管理模式(SVC)、用户模式、快速中断模式(FIQ)、普通中断模式(IRQ)、数据访问中只模式、未定义指令模式 不论ARM处于那种工作

qq_45604814的博客 697

Ubuntu单系统安装全攻略:从删除Windows到UEFI引导设置(避坑指南)

本文提供Ubuntu单系统安装的完整指南,涵盖从安全删除Windows系统到UEFI引导设置的详细步骤。通过专业工具准备、分区方案设计、引导加载器配置等关键环节,帮助用户避免常见安装问题,实现纯净高效的Ubuntu单系统环境。特别强调UEFI引导的深度配置与安装后的性能优化,适合希望彻底转向Linux的用户。

weixin_29210727的博客 409
上一篇: USB与SCSI
下一篇: STM32Fatfs遍历文件(C语言实现)
oshan2012
博客等级 码龄15年 300粉丝 91原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值