日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

电子工程师名片——FAT16文件系统

發布時間:2024/1/1 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 电子工程师名片——FAT16文件系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???????? 從8月8號開始,連續一個月利用每天下班時間和周末的時間終于初步完成了一個電子工程師的電路板名片,就像U盤一樣,不過這個FLASH只有64KB的大小,用的單片機是C8051F320,是一個USB型的單片機。

??????? 這次獲取的教訓是一開始想好要做什么事,無論如何要堅持下來,也許困難有很大,但是和困難磨磨突然會發現原來眼前的困難也是有解決的辦法的,突然的豁然開朗。

??????? 整體結構如下:


????????? 我打算把自己所做的按照我自己調試的過程寫下來,會連續發幾篇博客,歡迎關注我哦。FAT16文件系統是在最后才搞出來,趁熱打鐵,把它作為第一篇先記下來



電子工程師電路板名片之FAT16文件系統

??????

??????? FAT16文件系統的介紹在這篇博客介紹比較詳細:http://blog.csdn.net/menghnhhuan/article/details/4270168

??????? FAT16文件系統在U盤、MMC卡、SD卡、以及一些小型系統上用的比較多,我在MX25L512這個64KB的FLASH安裝的文件系統如下:

???????

注:第一個8*512中包含DBR區共一個512 Bytes,其余7個512 Bytes內容為0,但這8個512 Bytes都是保留扇區

一、DBR區(DOS BOOT RECORD):即操作系統引導區,本身只占512Bytes,但是從0地址開始有8個保留扇區(包括DBR區),所以FAT1的起始地址為8×512Bytes


注:BPB區記錄本分區的起始扇區,結束扇區,文件存儲格式,磁盤介質描述符,根目錄大小,FAT個數,分配單元大小等。

下面是我程序中具體去設置DBR的512個字節

code unsigned char DBR[512] = {0xeb,0x3c,0x90, //跳轉指令,跳轉到0x3c+2的引導程序代碼處 0x4d,0x53,0x44, 0x4f, 0x53, 0x35, 0x2e, 0x30, //廠商標志和OS版本號//BPB(BIOS parameter block)0x00,0x02, //扇區字節數512(合法的有512,1024,4096),C8051F單片機是大端模式0x01, //每簇扇區數(合法的有1,2,4,8,16,32,64,128)0x08,0x00, //保留扇區數,這樣可以知道FAT1區起始地址,為8×5120x02, //FAT數目0x00,0x02, //根目錄數,典型為512個目錄,每個文件或文件夾名長度為32 bytes0x80,0x00, //小扇區數,(對于大于65536個扇區的分區,本字段為0,采用大扇區表示,)0xf8, //媒體描述符,0xf8表示硬盤,0xf0表示3.5寸軟盤0x08,0x00, //每個FAT占用的扇區數0x3F,0x00, //每道扇區數0xFF,0x00, //磁頭數0x00,0x00,0x00,0x00, //隱藏扇區數0x00,0x00,0x00,0x00, //大扇區數,如果小扇區字段為0,本字段就包含了FAT16中的總扇區數//如果小扇區字段不為0,那么本字段為0//BPB擴展字段0x80, //物理驅動器,硬盤被標志為0x80,軟盤驅動器被標志為0x000x00, //保留字段0x29, //擴展引導標簽,要有能被windows 2000所識別的0x28或0x290xA8, 0x8B, 0x36, 0x52, //卷序號,在格式化磁盤時所產生的一個隨機號,助于區分磁盤0x4E, 0x4F, 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x20, 0x20, 0x20, 0x20, //卷標0x46, 0x41, 0x54, 0x31, 0x36, 0x20, 0x20, 0x20, //文件系統類型FAT16//操作系統引導代碼 0xf1, 0x7d,0xfa, 0x33, 0xc9, 0x8e, 0xd1, 0xbc, 0xfc, 0x7b, 0x16, 0x07, 0xbd, 0x78, 0x00, 0xc5, 0x76, 0x00,0x1e, 0x56, 0x16, 0x55, 0xbf, 0x22, 0x05, 0x89, 0x7e, 0x00, 0x89, 0x4e, 0x02, 0xb1, 0x0b, 0xfc,0xf3, 0xa4, 0x06, 0x1f, 0xbd, 0x00, 0x7c, 0xc6, 0x45, 0xfe, 0x0f, 0x8b, 0x46, 0x18, 0x88, 0x45,0xf9, 0xfb, 0x38, 0x66, 0x24, 0x7c, 0x04, 0xcd, 0x13, 0x72, 0x3c, 0x8a, 0x46, 0x10, 0x98, 0xf7,0x66, 0x16, 0x03, 0x46, 0x1c, 0x13, 0x56, 0x1e, 0x03, 0x46, 0x0e, 0x13, 0xd1, 0x50, 0x52, 0x89,0x46, 0xfc, 0x89, 0x56, 0xfe, 0xb8, 0x20, 0x00, 0x8b, 0x76, 0x11, 0xf7, 0xe6, 0x8b, 0x5e, 0x0b,0x03, 0xc3, 0x48, 0xf7, 0xf3, 0x01, 0x46, 0xfc, 0x11, 0x4e, 0xfe, 0x5a, 0x58, 0xbb, 0x00, 0x07,0x8b, 0xfb, 0xb1, 0x01, 0xe8, 0x94, 0x00, 0x72, 0x47, 0x38, 0x2d, 0x74, 0x19, 0xb1, 0x0b, 0x56,0x8b, 0x76, 0x3e, 0xf3, 0xa6, 0x5e, 0x74, 0x4a, 0x4e, 0x74, 0x0b, 0x03, 0xf9, 0x83, 0xc7, 0x15,0x3b, 0xfb, 0x72, 0xe5, 0xeb, 0xd7, 0x2b, 0xc9, 0xb8, 0xd8, 0x7d, 0x87, 0x46, 0x3e, 0x3c, 0xd8,0x75, 0x99, 0xbe, 0x80, 0x7d, 0xac, 0x98, 0x03, 0xf0, 0xac, 0x84, 0xc0, 0x74, 0x17, 0x3c, 0xff,0x74, 0x09, 0xb4, 0x0e, 0xbb, 0x07, 0x00, 0xcd, 0x10, 0xeb, 0xee, 0xbe, 0x83, 0x7d, 0xeb, 0xe5,0xbe, 0x81, 0x7d, 0xeb, 0xe0, 0x33, 0xc0, 0xcd, 0x16, 0x5e, 0x1f, 0x8f, 0x04, 0x8f, 0x44, 0x02,0xcd, 0x19, 0xbe, 0x82, 0x7d, 0x8b, 0x7d, 0x0f, 0x83, 0xff, 0x02, 0x72, 0xc8, 0x8b, 0xc7, 0x48,0x48, 0x8a, 0x4e, 0x0d, 0xf7, 0xe1, 0x03, 0x46, 0xfc, 0x13, 0x56, 0xfe, 0xbb, 0x00, 0x07, 0x53,0xb1, 0x04, 0xe8, 0x16, 0x00, 0x5b, 0x72, 0xc8, 0x81, 0x3f, 0x4d, 0x5a, 0x75, 0xa7, 0x81, 0xbf,0x00, 0x02, 0x42, 0x4a, 0x75, 0x9f, 0xea, 0x00, 0x02, 0x70, 0x00, 0x50, 0x52, 0x51, 0x91, 0x92,0x33, 0xd2, 0xf7, 0x76, 0x18, 0x91, 0xf7, 0x76, 0x18, 0x42, 0x87, 0xca, 0xf7, 0x76, 0x1a, 0x8a,0xf2, 0x8a, 0x56, 0x24, 0x8a, 0xe8, 0xd0, 0xcc, 0xd0, 0xcc, 0x0a, 0xcc, 0xb8, 0x01, 0x02, 0xcd,0x13, 0x59, 0x5a, 0x58, 0x72, 0x09, 0x40, 0x75, 0x01, 0x42, 0x03, 0x5e, 0x0b, 0xe2, 0xcc, 0xc3,0x03, 0x18, 0x01, 0x27, 0x0d, 0x0a, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x79,0x73, 0x74, 0x65, 0x6d, 0x20, 0x64, 0x69, 0x73, 0x6b, 0xff, 0x0d, 0x0a, 0x44, 0x69, 0x73, 0x6b,0x20, 0x49, 0x2f, 0x4f, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xff, 0x0d, 0x0a, 0x52, 0x65, 0x70,0x6c, 0x61, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x2c, 0x20, 0x61,0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e,0x79, 0x20, 0x6b, 0x65, 0x79, 0x0d, 0x0a, 0x00, 0x49, 0x4f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,0x53, 0x59, 0x53, 0x4d, 0x53, 0x44, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x53, 0x59, 0x53, 0x80, 0x01,0x00, 0x57, 0x49, 0x4e, 0x42, 0x4f, 0x4f, 0x54, 0x20, 0x53, 0x59, 0x53, 0x00, 0x00,//扇區結束標志0x55, 0xaa };

二、FAT16文件系統

??? FAT(File Allocation Table)文件分配表,是微軟在FAT文件系統中用于磁盤數據文件索引和定位引進的一種鏈式結構,有兩個,另一個是備份。FAT文件系統之所以有12、16、32不同的版本之分,其根本在于FAT表用來記錄任意一簇鏈接的二進制位數。以FAT16為例,每一簇在FAT表中占據兩個字節(二進制16位)。所以,FAT16最大可以表示的簇號為0xFFFF,以32K為一簇的大小,FAT16可以管理的最大磁盤空間為:32KB×65536=2048B,所以FAT16最大支持2GB的分區。

??? 因此FAT表以2個字節為一個記錄項,通常第1、2個記錄項用作介質描述(0xF8、0xFF、0xFF、0xFF),從第3個記錄項開始記錄除根目錄外的其他文件夾的簇鏈情況。具體FAT16表如何用很多個簇號鏈接表示見 http://bbs.ednchina.com/BLOG_ARTICLE_226477.HTM,一個文件結尾的簇號為0xFFFF。


三、文件目錄

??? 跟目錄的位置緊隨FAT2表之后,系統以32個字節為單位進行目錄文件所占簇的分配,文件目錄必須占據32個扇區


0x1A~0x1B為文件開始簇號,例如簇號為02 00,因為是使用小端模式,轉化后簇號為00 02,根據這個可以找到文件第一個簇號在FAT1中的位置,0x1000H+02H*02H=1004H,因此可以計算文件第一簇數據存放地址為56×512(用戶數據起始地址)+(02H-02H)×512(1簇占1個扇區),而在FAT1表1004H的地址上的數據為03 00,轉換后為00 03,那么可以計算第二簇的數據存放地址為56×512(用戶數據起始地址)+(03H-02H)×512(1簇占1個扇區),一直到FAT1表的某兩個字節為FF FF時代表文件結束。


四、處理PC端發來的讀寫文件系統的固件程序

U盤固件提供的功能:當主機要求讀取某個扇區,定位到該扇區,從扇區里面讀出內容,并輸出給主機,他不需知道U盤是什么文件,只需把數據讀出來,主機通過讀取的扇區的內容來判斷是什么文件系統。

FLASH知識:

64kB的flash本身的sector為4kB,Page為256Byte

Page為寫入數據的最小單位,sector為數據擦除的最小單位。

而現在作為文件系統,我已經修改為:LBA(Logical BlockAddress)128個,每個Block的大小為512Byte,128*512B=65536B=64kB。

處理好LBA和Pagenum的關系

LBA指起始邏輯塊地址,即flash中的第幾個Block(512Byte)

Pagenum為有多少個邏輯塊地址,最大為上面計算的128個Block。

因為現在文件系統Block的大小為512Bytes,而flash的page大小為256,所以每次寫512字節要分兩次來寫。

SPI_Write_Page(buff,0,2*(LBA+Pagenum)-2);

SPI_Write_Page(buff,0,2*(LBA+Pagenum)-1);

case Read_10://回發MBR主引導扇區數據//sector:擦除數據的最小單位//page讀寫數據的最小單位// LBA:logical block address// PageNum:number of LBA// 16 sectors 1 sector=16 page 1 page=256 byteif(PageNum>0){for(i=1;i<=PageNum;i++){PageNumL=2*(LBA+i-1);SPI_READ_Page(0, PageNumL);for(t=0;t<4;t++){FIFO_Write(buff + t*MaxSize, FIFO1, MaxSize);SFR_Write(EINCSRL,0x01);while(SFR_Read(EINCSRL) & 0x01);}PageNumH=2*(LBA+i-1)+1;SPI_READ_Page(0, PageNumH);for(t=0;t<4;t++){FIFO_Write(buff + t*MaxSize, FIFO1, MaxSize);SFR_Write(EINCSRL,0x01);while(SFR_Read(EINCSRL) & 0x01);}}}csw=1;sendDebug(Read_10);sendDebug(LBA);sendDebug(PageNum); break; case Write_10://host向slave發數據并寫在U 盤里面if(PageNum>0){SPI_SECTOR_ERASE(LBA/8);for(i=1;i<=PageNum;i++){for(j=0;j<4;j++){for(t=0;t<64;t++)buff[64*j+t]=SFR_Read(FIFO1);SFR_Write(EOUTCRSL,0x00);}PageNumL=2*(LBA+i-1);SPI_WRITE_Page(buff, 0, PageNumL);for(j=0;j<4;j++){for(t=0;t<64;t++)buff[64*j+t]=SFR_Read(FIFO1);SFR_Write(EOUTCRSL,0x00);}PageNumH=2*(LBA+i-1)+1;SPI_WRITE_Page(buff, 0, PageNumH);}}flags.epin1=1;csw=1;sendDebug(Write_10);sendDebug(LBA);sendDebug(PageNum); break;


總結

以上是生活随笔為你收集整理的电子工程师名片——FAT16文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。