FatFS的水動力實驗數(shù)據(jù)存儲系統(tǒng)設(shè)計
3 系統(tǒng)軟件設(shè)計
系統(tǒng)采用的軟件流程圖如圖4所示。本文引用地址:http://m.butianyuan.cn/article/148053.htm
3.1 MicroSD接口函數(shù)
SD卡接口函數(shù)依據(jù)SD卡通信協(xié)議V2.0編寫,需要SDIO口函數(shù)以及SD卡底層接口函數(shù)的支持。ST公司提供的庫函數(shù)中包括了SDIO單元的操作,能很快實現(xiàn)SD卡模式的讀寫操作。其中,最重要的是2個函數(shù):一個是SD_WriteBlock函數(shù),向SD卡寫入數(shù)據(jù);另外一個是SD_Read Bl ock函數(shù),用于讀取SD卡上面的數(shù)據(jù)。讀/寫扇區(qū)結(jié)構(gòu)圖如圖5和圖6所示。
3.2 USB接口函數(shù)
本數(shù)據(jù)存儲系統(tǒng)在工程中加入ST公司提供的USB函數(shù),在主函數(shù)中調(diào)用即可完成USB的初始化過程。在中斷映射單元中,將可能產(chǎn)生中斷的USB事件映射到3個不同的NVIC請求線上:
◆USB低優(yōu)先級中斷(通道20):可由所有USB事件觸發(fā)(正確傳輸,USB復(fù)位等),固件在處理中斷前應(yīng)當首先確定中斷源。
◆USB高優(yōu)先級中斷(通道19):僅能由同步和雙緩沖批量傳輸?shù)恼_傳輸事件觸發(fā),目的是保證最大的傳輸速率。
◆USB喚醒中斷(通道42):由USB掛起模式的喚醒事件觸發(fā)。
USB接口和SDIO接口都使用了STM32的嵌套向量中斷控制器(NVIC),需要對使用搶占式中斷優(yōu)先級和響應(yīng)式中斷優(yōu)先級進行配置。設(shè)置SDIO接口的中斷優(yōu)先級最高,即搶占式優(yōu)先級為0,響應(yīng)式優(yōu)先級為0。而USB的搶占式中斷優(yōu)先級為1,響應(yīng)式優(yōu)先級依次降低。USB接入Host流程圖如圖7所示。
3.3 RTC模塊函數(shù)
在本系統(tǒng)中,對STM32F103ZET6的計數(shù)器寄存器(RTC_CNTH/RTC_CNTL)和備份數(shù)據(jù)寄存器(BKP_DRx)進行配置,前者的值表示了基于0時0分0秒數(shù)值的累加進位,通過時間處理函數(shù),獲得當前日歷和時刻信息;后者在于系統(tǒng)上電后,判斷是否需要重新進行時鐘初始配置,如先寫入0xA5A,通過看寄存器是否還是0xA5A,判斷是否掉過電。如果掉過電,則需要對系統(tǒng)時間進行校正。
4 FatFS文件系統(tǒng)的移植
4.1 FatFS文件系統(tǒng)結(jié)構(gòu)
本系統(tǒng)采用基于FatFS V0.09的文件系統(tǒng)。文件系統(tǒng)的作用是保證其讀寫的數(shù)據(jù)能夠被大多數(shù)通用設(shè)備識別。例如使用FAT文件系統(tǒng),通過USB設(shè)備可以對存儲的文件進行操作,或者取下MicroSD卡后使用標準的讀卡器在PC機上讀出。當前應(yīng)用廣泛的嵌入式文件系統(tǒng)有μC/ FS、開源的EFSL(Embedded File System Library)與FatFS等。本設(shè)計中的FatFS使用ANSI C編寫,具有很好的硬件平臺獨立性,同時層次結(jié)構(gòu)非常清晰,如圖8所示。最頂層是應(yīng)用層,這一層為用戶提供一系列API甬數(shù),如f_open、f_close、f_read、f_write等,用戶可以像C文件一樣讀/寫FAT文件。中間層FatFS Module完整地實現(xiàn)了FAT協(xié)議,用戶無需對此進行任何修改。最底層是在移植過程中需要處理的接口,包括存儲媒介讀/寫接口Lowlevel disk I/O和文件創(chuàng)建/修改時間時所需的實時時鐘。用戶根據(jù)具體的硬件編寫程序,填充相關(guān)函數(shù),即可使FatFS文件系統(tǒng)應(yīng)用在具體的嵌入式平臺設(shè)備上。
4.2 FatFS移植
FatFS的最新版本是V0.09。FatFs的主程序包含5個文件,即fdiskio.h、fconf.h、ff.c、ff.h和integer.h。移植中,還需要添加diskio.c文件與diskio.h構(gòu)成底層的硬件I/O。ff.c和ff.h是主要的應(yīng)用函數(shù),上層的API函數(shù)都在其中;ffconI.h主要涉及FatFS的配置和裁減;而integer.h中定義了FatFS軟件所使用的各種數(shù)據(jù)類型。移植FatFS的過程中不需要對diskio.h和ff.c進行修改。移植工作首先核實integer.h中的數(shù)據(jù)類型,定義與STM32F103ZET6數(shù)據(jù)類型是否相符。其次,實現(xiàn)diskio.c中6個主要函數(shù),最后在ffconf.h中對文件系統(tǒng)的裁減配置。diskio.c包含的6個接口函數(shù)為:disk_initialize、disk_status、disk ioctl、disk read、disk write和disk_fat time。具體移植過程如下:
DSTATUS disk_initialize(BYTE drv)為存儲介質(zhì)初始化函數(shù)。drv是存儲介質(zhì)號碼,本設(shè)計中是SD卡的初始化函數(shù),只需支持一個存儲介質(zhì),因此drv設(shè)為0。執(zhí)行無誤,返回0值。
DSTATUS disk_status(BYTE drv)為存儲介質(zhì)狀態(tài)檢測函數(shù)。檢測是否支持當前的存儲介質(zhì)。事實上,只要drv為0,系統(tǒng)就默認為支持,執(zhí)行無誤返回0。
DRESULT disk_read(BYTE drv,BYTE*buff,DWORD sector,BYTE count)為讀扇區(qū)函數(shù)。drv設(shè)為0,*burf指向存儲的數(shù)據(jù),sector是讀的起始扇區(qū),count是需要讀的扇區(qū)數(shù)目。將SD卡讀數(shù)據(jù)接口函數(shù)根據(jù)參數(shù)填寫、調(diào)用,函數(shù)執(zhí)行無誤返回0,錯誤則返回非0。
評論