天天看點

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

21.1 檔案系統簡介:

使用SPI FLASH直接存儲資料:

      當需要記錄字元“STM32-F429 SPI FLASH” 時。 可以把這些文字轉化成ASCII碼,存儲在數組中,然後調用SPI_FLASH_BufferWrite函數,把數組内容寫入到SPI Flash晶片的指定位址上,在需要的時候從該位址把資料讀取出來,再對讀出來的資料以ASCII碼的格式進行解讀。

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

• 難以記錄有效資料的位置

• 難以确定存儲媒體的剩餘空間

• 不明确應以何種格式來解讀資料

Windows上的檔案系統:

檔案系統,就是對資料進行管理的方式。使用檔案系統可有效地管理存儲媒體。

檔案系統在計算機中的表現形式:

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs
再造STM32---第二十一部分:串行FLASH檔案系統 FatFs
再造STM32---第二十一部分:串行FLASH檔案系統 FatFs
再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

磁盤的實體結構:

       使用檔案系統時, 它為了存儲和管理資料,在存儲媒體建立了一些組織結構,這些結構包括作業系統引導區、目錄和檔案。

常見的windows下的檔案系統格式包括FAT32、 NTFS、 exFAT。

       在使用檔案系統前,要先對存儲媒體進行格式化。 格式化時會在存儲媒體上建立一個檔案配置設定表和目錄。這樣,檔案系統就可以記錄資料存放的實體位址,剩餘空間。

磁盤分區表:

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

       Windows作業系統為了便于使用者對磁盤的管理。加入了磁盤分區的概念,即将一塊磁盤邏輯劃分為幾塊,它會把磁盤的分區資訊記錄到硬碟分區表中。

       在硬碟分區表中,描述了各個邏輯分區的屬性,如分區開始和結束位置所在的實體位址(柱面号、扇區号),空間大小等資訊。

        檔案系統的存在使存取資料時,不再是簡單地向某實體位址直接讀寫,而是要遵循它的讀寫格式。如經過邏輯轉換,一個完整的檔案可能被分開成多段存儲到不連續的實體位址,使用目錄或連結清單的方式來獲知下一段的位置。

        使用檔案系統時,資料都以檔案的形式存儲。寫入新檔案時,先在目錄中建立一個檔案索引, 它訓示了檔案存放的實體位址,再把資料存儲到該位址中。當需要讀取資料時,可以從目錄中找到該檔案的索引,進而在相應的位址中讀取出資料。具體還涉及到邏輯位址、簇大小、不連續存儲等一系列輔助結構或處理過程。

檔案系統的結構與特性

檔案系統的空間示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

存儲了A.TXT,B.TXT, C.TXT檔案

目錄示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

記錄了檔案的開始位置、大小等資訊

檔案系統的空間示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

存儲了A.TXT,B.TXT, C.TXT檔案

檔案配置設定表

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

        檔案 a.txt 我們根據目錄項中指定的 a.txt 的首簇為 2,然後找到檔案配置設定表的第 2 簇記錄,上面登記 的是 3,就能确定下一簇是 3。找到檔案配置設定表的第 3 簇記錄,上面登記的 是 4,就能确定下一簇是 4......直到指到第 11 簇,發現下一個指向是 FF,就是結束。檔案便讀取完畢。

檔案系統的空間示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

删除B.TXT檔案,建立D.TXT檔案後的空間示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

原目錄示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

删除B.TXT檔案,建立D.TXT檔案後的目錄示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

原檔案配置設定表示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

删除B.TXT檔案,建立D.TXT檔案後的檔案配置設定表示意圖

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

21.2 FatFs檔案系統簡介:

一、C語言中的檔案操作

檔案的打開操作

fopen 打開一個檔案

檔案的關閉操作

fclose 關閉一個檔案

檔案的讀寫操作

fgetc 從檔案中讀取一個字元

fputc 寫一個字元到檔案中去

fgets 從檔案中讀取一個字元串

fputs 寫一個字元串到檔案中去

fprintf 往檔案中寫格式化資料

fscanf 格式化讀取檔案中資料

fread 以二進制形式讀取檔案中的資料

fwrite 以二進制形式寫資料到檔案中去

getw 以二進制形式讀取一個整數

putw 以二進制形式存貯一個整數

檔案狀态檢查函數

feof 檔案結束

ferror 檔案讀/寫出錯

clearerr 清除檔案錯誤标志

ftell 了解檔案指針的目前位置

檔案定位函數

rewind 反繞

fseek 随機定位

二、FATFS檔案系統簡介:

        FatFs是面向小型嵌入式系統的一種通用的FAT檔案系統。它完全是由AISI C語言編寫并且完全獨立于底層的I/O媒體。是以它可以很容易地不加修改地移植到其他的處理器當中,如8051、 PIC、 AVR、 SH、 Z80、H8、 ARM等。 FatFs支援FAT12、 FAT16、 FAT32等格式。

        FatFs檔案系統的源碼可以從fatfs官網下載下傳:

​​ http://elm-chan.org/fsw/ff/00index_e.html​​         利用前面寫好的SPI Flash晶片驅動,把FatFs檔案系統代碼移植到工程之中,就可以利用檔案系統的各種函數,對SPI Flash晶片以“檔案”格式進行讀寫操作了。

三、FatFs的目錄結構:  

         下載下傳FatFs源碼包解壓後,在doc 檔案夾裡面是一些使用幫助文檔;在src 是FatFs檔案系統的源代碼。

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

四、FatFs幫助文檔:

       其中 en 和 ja 這兩個檔案夾裡面是編譯好的html文檔,講的是FATFS裡面各個函數的使用方法。 00index_e.html和00index_j.html是一些關于FATFS的簡介。 

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

21.3 FATFS源碼:

再造STM32---第二十一部分:串行FLASH檔案系統 FatFs

• integer.h:檔案中包含了一些數值類型定義。

• diskio.c:包含底層存儲媒體的操作函數,這些函數需要使用者自己實作,主要添加底層驅動函數。

• ff.c: FatFs核心檔案,檔案管理的實作方法。該檔案獨立于底層媒體操作檔案的函數,利用這些函數實作檔案的讀寫。

• cc936.c:本檔案在option目錄下,是簡體中文支援所需要添加的檔案,包含了簡體中文的GBK和Unicode互相轉換功能函數。

• ffconf.h:這個頭檔案包含了對FatFs功能配置的宏定義,通過修改這些宏定義就可以裁剪FatFs的功能。如需要支援簡體中文,需要把ffconf.h中的_CODE_PAGE 的宏改成936并把上面的cc936.c檔案加入到工程之中。

        建議閱讀這些源碼的順序為: integer.h --> diskio.c --> ff.c 。閱讀檔案系統源碼ff.c檔案需要一定的功底, 建議先閱讀FAT32的檔案格式,再去分析ff.c檔案。若僅為了使用檔案系統,則隻需要了解integer.h及diskio.c檔案并會調用ff.c檔案中的函數就可以了。

FatFs在程式中的關系網絡:

FatFs移植需要使用者支援函數: