來源:壹芯微 發布日期
2022-01-21 瀏覽:-基于FatFs文件系統的SD卡存儲器設計介紹
近年來,以Flash為存儲體的SD卡因其具備體積小、功耗低、可擦寫以及非易失性等特點而被廣泛應用于消費類電子產品中。在SD卡存儲器的設計中,利用文件系統對存儲媒介進行管理已成為嵌入式系統的一個發展方向,因此需要一種可靠的文件系統,本文提出了一種基于FatFs文件系統的SD卡存儲器設計,采用了開源文件系統FatFsR0.07C。FatFs是一種免費開源的FAT文件系統模塊,專門為嵌入式系統而設計。它完全用標準C語言編寫,具有良好的硬件平臺獨立性,經過簡單的修改就可以移植到多種嵌入式處理器上。系統以ST公司的STM32F103R為核心,通過SPI總線與SD卡進行通信,實現了數據的便攜式存儲。給出了系統的硬件結構圖,詳細探討了SD卡驅動程序以及FatFs移植方面的軟件設計。
1.硬件設計
SD卡具有兩種通信模式:SD模式和SPI模式。由于多數嵌入式處理器都配有SPI接口,因此相對于SD模式,SPI模式應用的更廣泛一些。本設計采用STM32F103R對SD卡進行控制,STM32F103R是ST公司的一款基于ARMCoutex.M3的微控制器,該控制器片內設備豐富,處理速度快,性能穩定,其與SD卡的接口電路圖如圖1所示。

圖1 STM32F103R與SD卡的接口電路圖
2.軟件設計
本系統的軟件設計是基于FatFs文件系統的。FatFs具有非常清晰的層次結構,如圖2所示。最頂層是應用層,這一層為用戶提供了一系列API函數,如f_open、f_close、f_read、f_write等,用戶即使不理解Fat協議,也可以利用API函數輕松地讀/寫文件。中間層FatFsModule完整地實現了Fat協議,用戶無需對此進行任何修改。最底層是用戶在移植過程需要處理的接口,包括存儲媒介讀/寫接口DisklO和文件創建修改時間時所需的實時時鐘,用戶根據具體的硬件編寫程序,填充相關函數,即可使FatFs文件系統應用在具體的嵌入式平臺設備上。

圖2 FatFs結構圖
根據層次式軟件設計的思想,將軟件設計工作分為3步:編寫SD卡的通信函數、編寫RTC時鐘函數和FatFs的移植。
2.1SD卡通信函數
將SD卡通信函數分為3層,如圖3所示。

圖3 SD卡通信結構軟件結構圖
(1)SPI接口函數
SPI接口函數是與處理器相關的代碼,這里的處理器是STM32F103R,主要包含SPI模式的配置以及SPI單字節的讀寫函數。
(2)SD卡底層接口函數
SD卡底層接口函數主要包含SD卡寫命令和讀數據等函數,按照標準的時序調用SPI接口函數即可。
(3)SD卡高級接口函數
SD卡高級函數依據SD卡通信協議V2.0編寫,需要SPI接口函數以及SD卡底層接口函數的支持。這部分主要是SD卡的初始化函數和扇區讀/寫函數,此外還有一些用來讀SD卡信息(廠商,容量,速度等)的函數。初始化工作是SD卡驅動程序編寫的一個難點,這里給出詳細的流程圖(如圖4所示),扇區讀/寫函數結構圖如圖5和圖6所示。

圖4 SD卡初始化軟件流程圖

圖5 SD卡讀扇區結構圖

圖6 SD卡寫扇區結構圖
2.2RTC時鐘函數
STM32F103R內含RTC設備,利用這個設備可以輕松地實現實時時鐘功能,從而為文件系統提供準確的時間。相關的軟件工作就是RTC的設置以及日歷系統的實現。
2.3FatFs的移植
完成了上面的基礎工作后,就可以開始進行FatFs的移植,具體的移植工作有2步:編寫FatFs接El函數和FatFs的設置。
(1)FatFs的接口函數
這項工作就是編寫disk.C中的6個函數。
DSTATUSdisk_initialize(BYTEDrive):存儲介質初始化函數。本設計中就是SD卡的初始化函數。Drive是存儲介質號碼,本設計只需支持SD卡一個存儲介質,因此Drive設為0即可。
DSTATUSdisk_status(BYTEDrive):存儲介質狀態檢測函數。檢測是否支持當前的存儲介質。事實上只要Drive為0,系統就默認為支持,函數執行無誤返回0。
DRESUTdisk_read(BYTEDrvive,BYTE*Buf,DWORDSectorNumber,BYTESectorCount):讀扇區函數。在SD卡SPI接口函數的基礎上編寫,Drive設為0,*Buf指向存儲的數據,SectorNumber是讀的起始扇區,SectorCount是需要讀的扇區數目。函數執行無誤返回0,錯誤返回非0。
DRESULJTdisk_write(BYTEDrvive,BYTE*Buff,DWORDSectorNumber,BYTESectorCount):寫扇區函數。在SD卡SPI接口函數的基礎上編寫,Drive設為0,*Buf指向寫入的數據,SectorNumber是寫的起始扇區,SectorCount是需要寫的扇區數目。函數執行無誤返回0,錯誤返回非0。
DRESULTdisk_ioctl(BYTEDrive,BYTECommand,Void*Buf):存儲介質控制函數。Command是控制命令,Buf指向存儲或接收的控制數據(命令參數)。可以在此函數里編寫自己需要的功能代碼,比如獲取存儲介質的容量、檢測存儲介質的相關信息等。如果是簡單的應用,也可以不編寫,函數直接返回0即可。
DWORDget_fattime(Void):實時時鐘函數。需要RTC函數的支持。返回一個32位無符號整數,時鐘信息包含在這32位中,如圖7所示。

圖7 時鐘位
(2)FatFs的配置
通過FatFs的配置,可以根據需要對代碼進行裁剪,以獲取最適合的代碼,該工作主要是在fconf.h中完成的。FatFs的配置可以分為4類,如圖8所示。

圖8 FatFs配置結構圖
FunctionandBuffer:對FatFs進行功能性的裁剪,有6個選項。
#define_FS_TINY(0或者1)。設置為1的時候,FatFs在進行數據傳輸時使用文件系統自建的緩存,這樣可以減少內存的占用率。
#define_FS_READONLY(0或者1)。設置為1的時候文件為只讀,編譯時移除與寫入相關的函數。其余的4個選項都是對代碼進行裁剪的。
LocaleandNamespace:對文件所支持的語言,有5個選項。
#define_CODE_PAGE。有多個取值,取不同的值可以支持不同的語言。例如,取936就支持簡體中文,取437就支持美式英語。這里取1,支持ASCII,此時不需要對此類中其余的選項進行配置。
PhysicalDrive:與實際物理磁盤相關的配置,有3個選項。
#define_DRIVES。物理磁盤的數量,設為1。
#define_MAX_SS。扇區大小,在使用MemoryCard時必須設為512。
#define_MULTI_PARTITION。分區數量,設為0。
System:文件系統的配置,有3個選項。
#define_WORD_ACCESS。字寫入方法的配置,推薦設置為1以獲得較好的性能。
但是當處理器使用大端模式或設為1時,系統運行不正確時,應設為0。
#define_FS_REENTRANT。Reentrancy的使能,設為0時剩下的兩個函數(_FS_TIMEOUT,_SYSNC_t)失效。這里設為0。
3.系統測試及結果
在測試中STM32F103R采用12MHz的晶振,設置SPI時鐘為6MHz,分別對2GB的microSD(Kingston)和4GB的SDHC(Transcend)的卡進行讀寫。通過對一定容量(200KB和10MB)的文件讀寫時間來計算讀寫速度,測試結果如表1所示。

從測試結果上可以看出,讀寫速度令人滿意,若采用更快的SPI時鐘,讀寫速度可以進一步提高,完全可以適應嵌入式系統的需求。
結束語
本文總結了基于FatFs文件系統的SD卡存儲器設計方案,該存儲器讀寫速度快,可靠性強,設計流程簡單,為嵌入式數據的存儲提供了一種較好的方法。
〔壹芯微〕專業研發生產二極管,三極管,MOS管,橋堆,專注領域,專業品質,研發技術-芯片源自中國臺灣,擁有全工序封裝生產線,配備高標準可靠性實驗室,引入國外先進測試儀器,檢測設備,以及專業團隊豐富的生產經驗,保障每個器件的參數和性能的充分穩定性,同時實現了高度全自動化生產,大幅度降低人工成本,并與中國臺灣芯片制造商達成合作,產品低于同行10%,壹芯微還提供有選型替代,技術支持,售后FAE,歡迎點擊頁面右側"在線客服" 咨詢了解產品詳情和最新報價,提供免費樣品送予測試
手機號/微信:13534146615
QQ:2881579535
工廠地址:安徽省六安市金寨產業園區
深圳辦事處地址:深圳市福田區寶華大廈A1428
中山辦事處地址:中山市古鎮長安燈飾配件城C棟11卡
杭州辦事處:杭州市西湖區文三西路118號杭州電子商務大廈6層B座
電話:13534146615
企業QQ:2881579535

深圳市壹芯微科技有限公司 版權所有 | 備案號:粵ICP備2020121154號