在移植文件系統前,首先來掌握一些基本知識(必須掌握的):
一、FATFS文件系統格式分析
搞文件系統,首先要了解一下SD卡里面的結構和分區,如下圖
1、引導扇區
引導扇區包含著磁盤和文件系統的許多重要參數。文件管理系統首先要對該扇區的信息進行分析,才能了解當前磁盤上文件系統的格式。
EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 08 20 00 02 00 00 00
00 F8 00 00 3F 00 FF 00 00 0000 0000 34 0F 00 CC 03 00 00
00 00 00 00 02 00 00 00 01 00 06 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 29 22 B0 50 A0 4E 4F 20 4E 41 4D 45 20 20
20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4 7B 8E C1 8E
11-12字節 | 每一扇區的字節數 | 典型為0x00、02,512 |
13 | 每簇扇區數 | 8 |
14-15 | 保留扇區數 | 0x20,00,保留32個扇區 |
21 | 介質類型 | 0xF8,固定介質 |
32-35 | 總扇區數 | 0x00 34 0F 00,十進制996352 |
36-39 | 文件分配表所占扇區數 | 0xCC 03 00 00,972 |
44-47 | 根目錄所在簇號 | 02 00 00 00,2號簇 |
48-49 | FSINFO扇區標號 | 01 00,在1號扇區 |
50-51 | 引導扇區的備份扇區號 | 06 00,在6號扇區 |
66 | 擴展引導標志 | 0x29 |
82-89 | FAT32字符串 | 46 41 54 33 32 20 20 20 |
FAT32與FAT12、FAT16區分是通過簇的數量,簇總數=總扇區數-(保留扇區數+分配表扇區數+根目錄區扇區數)/每簇扇區數。996352-(32+972*2+0)/8=124297,有12萬多簇,肯定是FAT32系統。
在FAT32文件系統,根目錄區與普通目錄一樣,都是位于數據區,比較典型的都是從2號簇開始。數據區起始扇區號=根目錄區起始扇區號=保留扇區+2*分配表扇區=32+1944=1976號。3號簇起始就是1984。利用shell命令里的SDRD命令讀出來看一下。我編寫的這個命令以扇區號為參數,每次讀入兩個扇區,并以十六進制的形式顯示在串口終端上。
體外的知識:
FAT16 DBR 參數的偏移0x11 處記錄了根目錄所占扇區的數目。偏移0x16
記錄了FAT 表所占扇區的數據。偏移0x10 記錄了FAT 表的副本數目。系統在得
到這幾項參數以后,就可以確定數據區的開始扇區偏移了。
FAT16 文件系統從根目錄所占的32 個扇區之后的第一個扇區開始以簇為單
位進行數據的處理,這之前仍以扇區為單位。對于根目錄之后的第一個簇,系
統并不編號為第0 簇或第1 簇 (可能是留作關鍵字的原因吧),而是編號為第2
簇,也就是說數據區順序上的第1 個簇也是編號上的第2 簇。
FAT 文件系統之所以有12,16,32 不同的版本之分,其根本在于FAT 表用
來記錄任意一簇鏈接的二進制位數。以FAT16 為例,每一簇在FAT 表中占據2
字節(二進制16 位)。所以,FAT16 最大可以表示的簇號為0xFFFF(十進制的
65535),以32K 為簇的大小的話,FAT32 可以管理的最大磁盤空間為:32KB×
65535=2048MB,這就是為什么FAT16 不支持超過2GB 分區的原因。
FAT 表實際上是一個數據表,以2 個字節為單位,我們暫將這個單位稱為
FAT 記錄項,通常情況其第1、2 個記錄項(前4 個字節)用作介質描述。從第三
個記錄項開始記錄除根目錄外的其他文件及文件夾的簇鏈情況。根據簇的表現
情況FAT 用相應的取值來描述,見表
二,文件系統的移植
1,首先,去網上下載FATFS的源碼
2,推薦到http://www.360doc.com/content/12/0708/23/10358948_223078499.shtml 這里,這是一篇寫得比較好,比較詳細的移植文章。
上一篇:STM32讀寫TXT文件(可追加數據)的示例代碼
下一篇:對STM32中FATFS文件系統常用API函數的理解
推薦閱讀
史海拾趣