电子财产一站式办事
0
问答果博东方 最新题目 热点题目 期待回覆标签广场
我要发问

手艺交换单片机

振南的znFAT-单片机上的FAT32文件体系 研发手记

#1楼主:znFAT--单片机上的FAT32文件体系 之研发手记文章颁发于:2009-12-05 22:04

  

znFAT--单片机上的FAT32文件体系  之研发手记

两年前,我起头进修DIY MP3,刚起头我只是间接把MP3文件的数据放在单片机的FLASH中,读取播放。但如许受限于单片机FLASH的容量,使得底子装不下整首的MP3数据,顶多能播放7、8秒钟。这就须要一种大容量的存储器,你能够会说:“用大容量的FLASH ROM芯片就能够了”。不错,用诸如K9F、45DB系列的FLASHROM芯片容量是够大了,但此时也许你也跟我一样碰着了一个题目,MP3文件如何放入到FLASH芯片中?你能够会说“用烧录器就能够了!”。我要问的话,你见过阛阓里哪款MP3播放器是须要烧录器的?根基都是经由进程USB间接拷的,或是能够扩大存储卡,如SD卡、CF卡,甚至U盘。要用USB把FLASH芯片作成U盘,能够用PDIUSBD12来完成(若是您对这个感兴趣能够看看computer00的USB),对USB有必然领会的,城市晓得想把U盘作出来,仍是很是错乱的。以是最简略的体例便是利用存储卡,一方面能够利用读卡器,间接在操纵体系中把MP3拷入此中,另外一方面单片机驱动SD卡的相干材料也比拟全,便于研讨。

    文件体系的引出就由此而生!!题目是如许的,将MP3文件拷入到SD卡中今后,下面咱们要作的便是用单片机来读取SD卡上的数据,以便于播放,拷入的MP3文件数据在SD卡的那里啊?到哪一个扇区中去读啊?咱们利用U盘或SD卡等存储装备拷贝片子啊,歌曲啊,都是最泛泛的任务,你想过不,这些文件的数据存在SD卡上的甚么处所吗?它为甚么要存在阿谁处所?

    为了找到SD卡上的MP3数据,我起头研讨相干内容,这些便是FAT32文件体系。研讨起来今后,发明已有良多现成的在单片机上或在ARM等芯片上用的FAT文件体系计划,比方FATFS(这个是最为闻名的一个,用得也最多)等等,国际也有几个,比方沁恒的文件体系库(不过他不开源,是贸易的工具)、ZLG/FS(他供给的仍是利用于ARM上的,在单片机利用的少)等。我也曾向单片机(我刚起头用的是STC89C58,厥后起头用STC12C5A60S2,不过这也是本年才起头用)上去移植这些现成的计划,但移植并不顺遂。最初我筹算不再用任何现有计划,自身研讨自身写。

    因而我起头脱手写了一个最原始的计划,这个最原始的计划仅仅能够完成读取根目次下的某个文件,还很是不成熟,同时我在网上发了一篇文章《FAT32文件体系的存储机制及其在单片机上的完成》(感兴趣的话能够在网上找一下,不过这篇文章里讲的很是浮浅)。我将这个文件体系计划的雏形用于MP3播放尝试,完成了读SD卡MP3文件播放的功效。与此同时,我录制了《51单片机完成FAT32文件体系》视频教程(长达500分钟),但愿经由进程浅显周全的讲授,让泛博电子喜好者对文件体系有一个初频的领会(不过,此刻回忆起来,录制视频教程的时辰对文件体系的研讨依然还不算深切)。因为我发明良多人当然天天在用电脑,天天在听MP3,天天在看电子书,但从不晓得有文件体系这类工具存在,历来不疑惑存在扇区中的数据在咱们眼前如何就成了一个个的文件。

    我的SD卡MP3的根基功效当然完成了,但我又在想:“莫非国际就不能有一款开源的,好用的FAT32文件体系的计划吗?”。我在前期研讨的根本上,又起头停止更深切的研讨。也许你能够在1个月内,甚至1个礼拜,把文件体系的相干手艺手册通读N遍,也能够在现实上搞得很大白(当然须要较高的悟性),但这离终究的完成还相差甚远,或说只是方才起步。一些外洋的研讨文件体系的构造都是良多人一路倾泻很大精神在作的,像EFSL(比利时的开源名目)、FATFS(下面已提到,它是从多量的wince源代码中剥离出的fat文件体系源代码,微软的代码)等。它们会给咱们利用,但不会讲给咱们他们是如何完成的,更首要的一点是,它们普通用于AVR、ARM等芯片上,若是想要在51单片机上利用,不能说不能用,但因为硬件资本无限,以是用起来会有费事。以是,我才筹算在RAM唯一1K字节的STC国产51单片机上真正作一套功效完整,便利移植的,机能较高,完整从0首创的文件体系计划。

    利用说这项任务任务量很大,首要是我不想仅仅去完成根基的功效,还但愿能有功效上的立异。要完成的根基功效有:1、文件体系初始化 2、翻开文件 3、读取数据 4、文件重定名 5、复制文件 6、成立文件 7、增加数据 8、成立目次 9、封闭文件  10、获得残剩容量 11、获得总容量  怪异具备的功效:我称之为“多装备”(所谓的多装备功效,便是能够在运转的进程中静态的切换存储装备的驱动,说了然便是文件体系能够穿越于多种存储装备之间,你会问这有甚么用?我要说,这里所完成的每项功效都有很是现实的利用,多装备最典范的利用便是能够在多种装备间停止文件的拷贝,如将SD卡上的某一文件拷贝到CF卡、U盘或是另外一张SD卡上)

    最大的任务量并不在于写代码,而在于测试代码和改代码。就像读数据的功效,读从文件里读1000个字节,不题目,读10000字节呢?依然不会犯错吗?又如翻开文件这一功效,若是目次里有5个文件,要翻开此中某个文件不题目,那能保障目次里有10000个文件的时辰,翻开这个文件依然不题目吗?能翻开根目次下的文件不题目,翻开\A\B\C\D\E\F\G\H\IJ\K\K\K\K\L\A.TXT如许的深层目次下的文件,也会没题目吗?写入文件数据时,写入1个字节没题目,写入10K的数据也仍是不题目吗?............像这类近似的环境有良多。凭我一小我的气力是不够的,我找了良多网友,给他用我的代码,并将题目反映给我,我再加以点窜。另有一个很首要的路子是经由进程一些公司现实的工程名目,因为他们会有特地测试的环境,比方频仍读数据、长时候的运转等等。良多题目会在此时代裸露出来。在点窜代码的进程中,经常还会发明一些之前不看到的FAT32更深层的工具。到此刻为止,我的文件体系计划已较为完整,在不变性与准确性上获得了必然的保障。

    要侧重申明的是所完成的统统功效,仅仅用了约莫900字节的RAM,此中包含512字节的扇区数据缓冲。

    到前期,我的文件体系起头在网上开源,为了让大师能记着它,我给它起名为znFAT(意为振南的FAT32文件体系计划)。仅唯一znFAT代码是远远不够的,大师感兴趣仍是利用znFAT来作的一些尝试,比方读SD卡上的TXT文本文件,作电子书;读SD卡上的MP3文件作播放器;读SD卡上的BMP文件,作数码相框;在SD卡与CF卡之间停止文件的互拷;甚至我自身用51的串口作了一个Shell号令接口,来通超等终端敲入号令来完成响应的文件操纵(这便是我在网上起名为“仿DOS”的尝试)。令我欣喜的是,此刻已有人起头在用znFAT来作一些尝试了,申明znFAT真正被人们用起来了。当然还不像FATFS等计划那样风行,但它依然是完整MIC(Made In China)的。

    代码发布出来,并不象征着代码就很成熟,反而会裸露出一些题目。实在最典范的一个题目便是:我供给的znFAT的代码是基于51单片机的KEIL工程,但良多网友并不必51,而用像AVR、STM32、DSP、NIOSII等等。反映一些功效非常。这是对可移植性的很大磨练,可移植性请求在差别的硬件前提下,在代码点窜量不大的环境下,能够在其上运转,并且功效杰出。以是我半途又搞了一阵子STM32(它是一种ARM7核的MCU),终究发明是差别CPU的差别而形成的,说得更详细一些是因为差别CPU的巨细端题目。终究胜利移植到STM32上,并将代码在网上发布出来。与此同时,一个网友用LM的节制器也跑通了znFAT,并利用于名目,运转杰出。

    znFAT从起头作,到此刻已有1年多,这时代研讨不时深入,此刻的znFAT与此刻的雏形已有极大的成长。本来的视频教程与文档材料此刻已感受比拟浮浅,以是在筹算录制新的视频教程,以求更多的人晓得文件体系,晓得它的首要。我要说,存储装备的扇区读写好完成,而成立在扇区读写根本上的文件体系的完成,才是思惟真实的升华,对研发能力最大的磨练。

    为了更普遍的进步文件体系的相干常识,也为了知足良多对文件体系的须要和猎奇(您莫非不发明国际,甚至外洋,还不一本特地讲在嵌入式中构建和利用文件体系的书吗?),在极力撰写《振南的znFAT--单片机上的FAT32文件体系》一书。不地写书进程冗长而辛劳,极力早日出来。

   振南赠语

振吓四方博为旨,

南极斗极自来朝。

电挚江山独标新,

子聚吾来弄天狼。

原点动身终有始,

创业何达必亲为。

无尽峰端难攀缘,

限在你我掌傍边。

发问者:36切53 地址:- 阅读次数:5494 发问时候:10-22 16:55
我有更好的谜底
18条回覆
chunlan83768 08-04 18:37 回覆数: 被采取数:
呵呵,我用在MP3播放的文件体系参考了良多沁恒公司的思惟,只要512字节的扇区数据缓冲区,我感受51单片机最好用FAT16文件体系,FAT32用在8位的51下面,速率慢.只要低速读写的利用另当别论.
陕西友航电子科技无限公司 07-28 13:01 回覆数:0 被采取数:0
znFAT的利用绝不只限于51
blueshine 08-03 07:31 回覆数: 被采取数:
良多体系的焦点是文件体系,文件体系作好,良多工具就能够作了
60user159 07-26 22:00 回覆数:1 被采取数:0
您好,振南师长教师,我此刻在DSP2812上利用您的znFAT文件体系,成果很好,可是有一个题目,我不能像操纵Word一样随便的点窜或删除文件中的一局部,我此刻是做数据收罗,和存储,每次存储2048字节数据,当到达必然容量后再主动删除文件头局部的2048字节,可是2048字节小于一个簇4096字节,为了削减运转时候,我就间接点窜的FAT文件表,让首簇变为本来首簇的下一个簇,相称于停止了删簇操纵来削减4096字节,可是如许不是久长的处理体例啊,我能不能删除随便巨细随便地位的数据呐?
recoltd 08-02 01:17 回覆数:0 被采取数:0
感谢对znFAT的撑持
你的意义是把文件数据全体向前挪动2048字节吗?
据我所知现有的一切文件体系计划都不能完成这一功效
若是你删除文件某个地位的数据,阿谁地位就会呈现空余,要把前面的数据向前挪动,这是比拟费时候的。
你所用的体例也比拟好,只是你多删了2048字节
你能够用Disk Ginius这个软件把你的SD卡格局化为簇巨细为2048,如许你用你的这类体例就能够完成了

你点窜了FAT今后,有几点要注重
1、要把本来的首簇设置为0x0000,即空簇
2、在文件的文件项中首簇更新为今后的首簇
3、变动文件项中的文件巨细
4、变动FSINFO中的余暇簇数
5、变动FSINFO中的空簇参考值
胡涂忠1 08-04 03:09 回覆数: 被采取数:
你好,感谢振南师长教师的回覆,您的意义是我没法像Word一样操纵,那Word里的文件操纵,比方说删除一段后点封闭保管时如何的操纵呐?是吧文件内容完整读进内存,点窜完后而后再完整从头写出来吗?相称于向文件增加全数数据,文件实在偏移量为0?是吗
zhan81411 07-26 22:03 回覆数:0 被采取数:0
偶然我还想随便删除文件头部的肆意长度的数据,您看有不好的体例啊,实在我此刻是每收罗8192点数据停止存储,每个点数是16位整形,如许8192点共占16384字节,便是4个簇的空间,在文件长度到达85M时主动删除文件头部的4个簇。这类体例我也完成了,此刻是要在这8192点数据前加上时候信息,也便是说每次存储的数据恰好比16384多一点,我想到文件到达85M是主动删减这堆比16384多点的数据,让每次能在文件的开首处看到时候信息,如许能完成吗
60user20 08-01 17:41 回覆数:0 被采取数:0
在嵌入式中的文件操纵,是不能够像在PC上那样的,你若是要在文件头上增加数据,就会形成前面数据多量的后移,效力极低。
你所说的WORD中,确切是在RAM中停止操纵,最初再存入文件的,znFAT能够让你自在向文件追加数据,能够定位到文件的某个地位,间接去点窜数据,但你想完成在文件肆意地位增加数据,就比拟难,并且效力也很低。你能够事后把你要增加的数据事后留出来,今后能够到文件这个地位来改。
hzp_bbs1 08-05 00:14 回覆数: 被采取数:
另有,不要叫我振南师长教师,我自身此刻仍是先生,叫我振南就好,或叫ZN
净小空空 07-29 10:12 回覆数:0 被采取数:0
你好,振南,听了你的讲解,我清楚了,今天细心看了一下你说的这五点,前三项我是做了的,便是第四、五项,我不找见对于FSINFO的相干代码,还不会做
1、要把本来的首簇设置为0x0000,即空簇
2、在文件的文件项中首簇更新为今后的首簇
3、变动文件项中的文件巨细
4、变动FSINFO中的余暇簇数
5、变动FSINFO中的空簇参考值
这是我的法式,按找删除文件的函数改写的,不触及到FSINFO啊?
void DeletData(struct FileInfoStruct *pfi)
{long Cluster1,Cluster2,Cluster3,Cluster_New_Start;
struct direntry *prec;
FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);//获得头四个簇,而后将其清空
prec=(struct direntry *)(FAT32_Buffer+pfi->nRec);
Cluster1=FAT32_GetNextCluster(pfi->FileStartCluster);
Cluster2=FAT32_GetNextCluster(Cluster1);
Cluster3=FAT32_GetNextCluster(Cluster2);
Cluster_New_Start=FAT32_GetNextCluster(Cluster3);//找寻到新的首簇 Cluster_New_Start
FAT32_Modify_FAT(pfi->FileStartCluster,0x00000000);
FAT32_Modify_FAT(Cluster1,0x00000000);
FAT32_Modify_FAT(Cluster2,0x00000000);
FAT32_Modify_FAT(Cluster3,0x00000000);

pfi->FileStartCluster=Cluster_New_Start; //变动文件首簇到Cluster_New_Start
pfi->FileSize=pfi->FileCurOffset-16384;//变动改文件巨细
pfi->FileCurSector=SOC(pfi->FileCurCluster);
pfi->FileCurOffset=pfi->FileCurOffset-16384;
FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);//点窜FAT表首簇号
(prec->deHighClust)[0]=(Cluster_New_Start&0x00ff0000)>>16;
(prec->deHighClust)[1]=(Cluster_New_Start&0xff000000)>>24;
(prec->deLowCluster)[0]=(Cluster_New_Start&0x000000ff);
(prec->deLowCluster)[1]=(Cluster_New_Start&0x0000ff00)>>8;
   FAT32_WriteSector(pfi->Rec_Sec,FAT32_Buffer);

  FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);//点窜文件巨细
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[0]=((pfi->FileCurOffset)&0x000000ff);
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[1]=((pfi->FileCurOffset)&0x0000ff00)>>8;
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[2]=((pfi->FileCurOffset)&0x00ff0000)>>16;
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[3]=((pfi->FileCurOffset)&0xff000000)>>24;
  FAT32_WriteSector(pfi->Rec_Sec,FAT32_Buffer);
}
riverdj 07-28 15:52 回覆数: 被采取数:
FAT32与FAT16差别点之一便是FAT32有FSINFO,此中就能够间接读出来磁盘残剩容量和下一个能够用的余暇簇,当然FSINFO也须要法式来停止保护。

也许你有这类履历,利用CH375配套的沁恒文件体系库时,在获得U盘的残剩容量时,FAT32能够顿时获得成果,而FAT16就要等一段时候能力获得成果。便是因为FAT16不FSINFO,以是法式要由FAT表来统计容量,这时候就长了。

FSINFO是我研发文件体系前期才发明的一个地区。它的地位在DBR的后一个扇区
gwerwfe 08-01 22:50 回覆数:0 被采取数:0
呵呵,等你的书出了在看看先,  我看过你阿谁文件体系,   一团乱码,   也许是我功力不够吧,
朱振振振 08-01 10:50 回覆数:0 被采取数:0
因为文件体系自身的错乱性,若是不根本,看起来确切便是一团乱码
恰是因为文件体系代码有些错乱,以是才有了出版的念头,让带读者一路来分解
我极力让代码层次清楚一些,便利大师的进修和利用
感谢
qwer38 07-26 10:08 回覆数: 被采取数:
标记一下偶然候好好研讨一下
limisy 07-31 01:27 回覆数:0 被采取数:0
若是要做贸易利用,能够更多人会挑选至公司开辟的,比方ZLG,MICROCHIP,这是我领会到的。
wmc55555 07-28 12:11 回覆数: 被采取数:
若是你不筹算把这个FAT做到中国着名和于着名度婚配的完美,以便有更多的人能用于贸易利用,把这个时候抽出来做别的,你能够获得更周全的进步。
手艺员都有玩手艺的偏向,可是做产物开辟,却最怕手艺员玩手艺。而手艺员若是太喜好玩手艺,而不是更多斟酌产物和自身的成长,也是不大好。不过趁着仍是先生,多玩一下手艺是好的,毕业了,就没那末多时候了。加油。
ywujwerwx 07-27 04:17 回覆数:0 被采取数:0
znFAT刚起头源于兴趣,已作了1年多,中心履历有数次测试,包含屡次在工程上的利用。也裸露出有数的题目,都在发明后获得我改良和修复。从而保障其准确性与不变性。
znFAT的研发初志在于处理现实的题目,知足完成的须要。是但愿它能被更多人晓得,更多人用起来,我把代码全数开源的缘由也就在于此。
不光用起来,还让有兴趣的人能够无机会来研讨进修。这便是要出教程与书的缘由了。

先生确切是喜好玩手艺,把手艺当做是玩具来找兴趣。自身我此刻是研三的先生,此刻的时候确切未几了。
极力把自身研讨的工具作到完美。
当然但愿有更多的人来用我的znFAT,来感受它究竟如何样。
在EDNCHINA何处有小组我已发了10个利用实例,大师能够曩昔看看。
http://group.znmcu.cn/
loujie39 07-29 21:07 回覆数: 被采取数:
FATFS ZLGFS UCFS当然好,但它不会配上教程,配上书,告知你它是如何完成的,外部手艺有哪些,细节是如何的,若是要自身写文件体系计划,应当如何作。这是我研讨文件体系的初志。
撰写谜底
相干手艺交换
单片机软硬件复位的前提都有啥
电念头的单片机节制
mos管驱动理性负载的题目
有效过BTS6143D高边驱动开关作为理性负载的驱动的吗
断绝485通讯接口芯片ADM2483供电题目
相干单片机
具备调子节制的单片机平面声前置缩小器
用于单片机与电子装配中的开关电源
单片机软硬件复位的前提都有啥
电念头的单片机节制
带二线串行接口智能温度传感器TCN75与89C51单片机的接口电路图
Copyright ©2012-2020 hqpcb.com.All Rights Reserved 粤ICP备14022951号-4