FATFS搭建以及測試方案_第1頁
FATFS搭建以及測試方案_第2頁
FATFS搭建以及測試方案_第3頁
FATFS搭建以及測試方案_第4頁
FATFS搭建以及測試方案_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第一部分FATFS系統(tǒng)的特點和原理FatFs是一個為小型嵌入式系統(tǒng)設(shè)計的通用FAT(FileAllocationTable)文件系統(tǒng)模塊。FatFs的編寫遵循ANSIC,并且完全與磁盤I/O層分開。因此,它獨立于硬件構(gòu)架。它可以被嵌入到低成本的微控制器中,如AVR、8051、PIC、ARM、Z80、68K等等,而不需要做任何修改。ApplicationFatFsModuleLowleveldiskI/ORTC(SD,ATA,USB,NAND)圖1.1FATFS示意圖其特點是:兼容Windows的FAT文件系統(tǒng)不依賴于硬件平臺與架構(gòu),易于移植代碼和工作區(qū)占用空間非常小多種配置選項多卷(物理驅(qū)動器和分區(qū))多ANSI/OEM或Unicode中長文件名的支持RTOS的支持多扇區(qū)大小的支持只讀,最少API,I/O緩沖區(qū)等等另外,FatFs提供了豐富的API函數(shù),包括驅(qū)動器的建立,文件的讀寫以及目錄的設(shè)立另外,等等。第二部分FATFS文件系統(tǒng)移植主要實現(xiàn)功能分析功能分析結(jié)合項目實際情況,本次FatFs文件系統(tǒng)的移植主要實現(xiàn)的功能為:通過特定的“開始”按鍵等輸入控制文件的創(chuàng)建以及實驗的開始;從節(jié)點收集的數(shù)據(jù)持續(xù)寫入特定的txt文件中,在寫入過程中需要加入斷電保護使得設(shè)備在突發(fā)斷電中可以將當前緩存中的數(shù)據(jù)全部寫入或者舍棄;按下“結(jié)束”按鍵,停止本次實驗,并生成第一次實驗數(shù)據(jù)文件,再度按下“開始”按鈕開始實驗時會重新建立一個新的txt文本文檔,并將數(shù)據(jù)寫入;在實驗過程中需要對當前SD卡的讀寫狀態(tài)進行監(jiān)視,比如寫入的狀態(tài)和剩余的容量等:>當SD卡剩余容量小于一定界限時(此界限可根據(jù)反應時間和寫入速度決定),會給予報警信號進行提示;另外,分析以下功能實現(xiàn)的主要矛盾點:傳感器節(jié)點采樣速度為200Hz,平均5ms一次,每次采集數(shù)據(jù)大小約為1KB,所以SD卡寫入速度理論上應為200KB/S。這個速度會受到寫入次數(shù)、文件系統(tǒng)操作次數(shù)以及文件數(shù)量的影響。寫入的數(shù)據(jù)需要斷電保護,主要目的是防止斷電使得一幀數(shù)據(jù)并未完全寫入txt文件中,成為無用數(shù)據(jù)。主要實現(xiàn)函數(shù)與流程根據(jù)以上需求,在本次SD卡文件系統(tǒng)的實現(xiàn)中,主要使用f_mount、f_open、f_write、f_lseek、f_sync等函數(shù),下面著重結(jié)合FATFS系統(tǒng)的原理對以上函數(shù)的工作流程進行分析。根據(jù)FATFS的例程顯示,一般的寫操作包括以下幾個步驟:f_mount主要功能:注冊/注銷一個工作區(qū)。描述:f_mount函數(shù)在FatFs模塊上注冊/注銷一個工作區(qū)。在使用任何其他文件函數(shù)之前,必須使用該函數(shù)為每個卷注冊一個工作區(qū)。要注銷一個工作區(qū),只要指定FileSystemObject為NULL即可,然后該工作區(qū)可以被丟棄。該函數(shù)只初始化給定的工作區(qū),以及將該工作區(qū)的地址注冊到內(nèi)部表中,不訪問磁盤I/O層。卷裝入過程是在f_mount函數(shù)后或存儲介質(zhì)改變后的第一次文件訪問時完成的。此函數(shù)主要功能是注冊一個驅(qū)動器,以為后面創(chuàng)建文件所用。f_open主要功能:創(chuàng)建/打開一個用于訪問文件的文件對象。描述:如果函數(shù)成功,則創(chuàng)建一個文件對象。該文件對象被后續(xù)的讀/寫函數(shù)用來訪問文件。如果想要關(guān)閉一個打開的文件對象,則使用f_close函數(shù)。如果不關(guān)閉修改后的文件,那么文件可能會崩潰。在使用任何文件函數(shù)之前,必須使用f_mount函數(shù)為驅(qū)動器注冊一個工作區(qū)。只有這樣,其他文件函數(shù)才能正常工作。另外,此函數(shù)創(chuàng)建的文件可設(shè)置多種模式,本例中由于需要創(chuàng)建并寫入文檔,則需要設(shè)置可寫并自動創(chuàng)建的方式。f_write主要功能:寫入數(shù)據(jù)到一個文件。—:什$地 SRkft朝酒圖2.1f_write的工作原理示意圖描述:先前的f_open是將一個創(chuàng)建的文件設(shè)置為活動的狀態(tài),也就是允許按照其事先設(shè)置的模式進行讀寫操作等。文件對象中的讀/寫指針以已寫入字節(jié)數(shù)增加。該函數(shù)成功后,應該檢查*ByteWritten來檢測磁盤是否已滿。在寫操作過程中,一旦*ByteWritten<*ByteToWritten,則意味著該卷已滿。f_lseek主要功能:移動一個打開的文件對象的文件讀/寫指針。也可以被用來擴展文件大小(簇預分配)。描述:采集的數(shù)據(jù)是按照一定的頻率寫入文檔的,每次寫入需要在上一次寫入的位置接著寫,而非替換原有數(shù)據(jù)。f_write的指針每次都默認指向文檔開頭。因此,必須在寫操作前將寫指針移向文本最后。fLelose主要功能:關(guān)閉一個活動的文件。描述:f_close函數(shù)關(guān)閉一個打開的文件對象。無論向文件寫入任何數(shù)據(jù),文件的緩存信息都將被寫回到磁盤。該函數(shù)成功后,文件對象不再有效,并且可以被丟棄。如果文件對象是在只讀模式下打開的,不需要使用該函數(shù),也能被丟棄。f_syne主要功能:沖洗一個寫文件的緩存信息。圖2.2f_write的工作原理示意圖描述:其執(zhí)行過程與f_close相同。但是文件仍處于打開狀態(tài),并且可以繼續(xù)對文件執(zhí)行讀/寫/移動指針操作。這適用于以寫模式長時間打開文件,比如數(shù)據(jù)記錄器。定期的

或f_write后立即執(zhí)行f_sync可以將由于突然斷電或移去磁盤而導致數(shù)據(jù)丟失的風險最小化。在f_close前立即執(zhí)行f_sync沒有作用,因為在f_close中執(zhí)行了f_sync。換句話說,這兩個函數(shù)的差異就是文件對象是不是無效的。本例設(shè)計的程序基本結(jié)構(gòu)如下所示:流程圖開始創(chuàng)建驅(qū)動器所對應使用的函數(shù)創(chuàng)建新文件并設(shè)置

寫模式流程圖開始創(chuàng)建驅(qū)動器所對應使用的函數(shù)創(chuàng)建新文件并設(shè)置

寫模式是否滿足結(jié)束條件將當前寫指針的位置偏

移到文件末尾f_lseek數(shù)據(jù)寫入f_write沖洗寫緩存f_sync結(jié)束圖2.3將當前寫指針的位置偏

移到文件末尾f_lseek數(shù)據(jù)寫入f_write沖洗寫緩存f_sync結(jié)束圖2.3寫數(shù)據(jù)流程圖fclose第三部分FATFS移植測試問題分析與解決方案數(shù)據(jù)寫入的測試首先通過中斷模擬匯聚節(jié)點收集數(shù)據(jù)的大小和速度,匯聚節(jié)點采樣速率為200Hz,即每5ms采集一次,每次數(shù)據(jù)大小最大為1024字節(jié)。首先需要STM32每5ms產(chǎn)生一個1024字節(jié)的數(shù)據(jù)包。測試1:測試f_write的寫入速度測試目的:當前工程使用的為SDIO的1線模式,其理論速度為2MB/s,理論上滿足數(shù)據(jù)的寫入速度,設(shè)計實驗驗證實際的數(shù)據(jù)寫入是否滿足200Hz的要求。測試手段:在寫文件程序中,包括文件寫指針的尋址以及數(shù)據(jù)的寫入,每完成一個函數(shù)會控制一個LED燈的亮滅,通過示波器觀察其電平拉低的時間,即為每個函數(shù)所需要的耗時。測試代碼:for(write_count=0;write_count<4000;write_count++)(GPIO_Write(GPIOC,0xfe);res=f_lseek(&fil,fil.fsize);GPIO_Write(GPIOC,0xff);GPIO_Write(GPIOC,0xfd);res=fwrite(&fil,testBuffer,sizeof(testBuffer)-1,&br);res=fsync(&fil);GPIO_Write(GPIOC,0xff);)1f_close(&fil);觀察現(xiàn)象:通過示波器可以觀察到f_lseek耗時約為40us,f_write與f_sync的耗時共約為5ms,其速度不僅不符合工程要求,甚至也不符合其理論速度。經(jīng)過驗證,f_write與f_sync耗時相當,均約為2.7ms,僅計算f_write的寫入速度。另外,在寫入循環(huán)中,任意時間拔掉SD卡,在PC中對文本進行觀察,可以發(fā)現(xiàn)在f_write后加入f_sync,并不會存在一個testBuffer僅有一部分被寫入的狀況,循環(huán)所寫入的數(shù)據(jù)均保存在文檔中可以顯示,不存在亂碼??梢钥闯觯驹O(shè)置為4000次的有限循環(huán),在中間任意時刻拔出后,可以觀察到其中47次有效寫入,如圖3.1(a)所Zj\o:|testl.txt-記事本文件(F)端本⑹格式(0)查看(V)幫助(H)1testl.txt-記事本Thisisthevirtualv.titingdatatestfor9timesThisis the virtual writing; data test for 10 timesThisis the virtual writing data test for 11 timesThisis the virtual writin目 data test for 12 timesThisis the virtual writing data test for 13 timesThisis the virtual v.titing data test for 14 timesThisis the virtual writing; data test for 15 timesThisis the virtual writing data test for 16 timesThisis the virtual writin目 data test for 17 timesThisis the virtual writing data test. for 18 timesThisis the virtual v.titing data test for 19 timesThisis the virtual writing; data test for 20 timesThisis the virtual writing data test for 21 timesThisis the virtual writin呂 data test for 22 timesThisis the virtual writing data test. for 23 timesThisis the virtual v.titing data test for 24 timesThisis the virtual writing; data test for 25 timesThisis the virtual writing data test for 26 times文件(F]菜堪⑥格式(0尊(V)幫助位置: F:\式小: 0字下與用交閆: 0字節(jié)Thisisthevirtualv.titingdatatestforEftimesThisisthevirtualwritingdatatest.for28times 已用空間: 516Q96字節(jié) 504KBThisis the virtual v.titing data test for 29 timesThisis the virtual writing datci test for 30 times 可用空間; 495,2,88,320字節(jié)" 472 MBThisis the virtual writing data test for 31 timesThisis the virtual v.titing data test for 32 timesThisis the virtual writing; data test for 33 times 喜昌: 495804416字節(jié) 472 MBThisisthevirtualwritingdatatestfor34times - 'Thisis the virtual writing data test for 35 timesThisis the virtual writing data test for 36 timesThisis the virtual v.titing data test for 37 timesThisis the virtual writing; data test for 38 timesThisis the virtual writing data test for 39 timesThisis the virtual writin目 data test for 40 timesThisis the virtual writing data test for 41 timesThisis the virtual v.titing data test for 42 times 驅(qū)F:!S 史日,rtu可 writing^ta test for 43 times fUAThisis the virtual wri(a)ta test for 44 times (D)Thisis the virtual writin呂data test for 45 timesThisis the virtual writingdata test. for 46 timesThisisthevirtualsitingdatatestfor47圖噴1SD卡文件寫入狀況但是如果將f_write之后的f_sync注釋掉,在循環(huán)中任意時間拔掉SD卡,在PC中對文本進行觀察,則可以發(fā)現(xiàn)文本中并沒有已經(jīng)完成的寫操作的數(shù)據(jù),為空文本,也不存在亂碼現(xiàn)象,文本占用空間為0,但是,查詢SD卡的屬性可以發(fā)現(xiàn)有空間被占用,如圖3.1(b)所示。解決辦法:從以上分析可知,如果需要加入f_sync斷電保護的這個函數(shù),則一次寫操作需要5.5ms,但是其速度遠遠達不到要求。因此,擬采用SDIO的4線模式對SD卡進行讀寫操作來大大提高其讀寫速度。測試2:FATFS工程SDIO的4線模式修改整個SD卡的初始化過程基本分為三大步:可以參見 main.c中的C124的SD_USER」nit:第一步:SDIO外設(shè)的初始化以及SD卡本身的上電。第二步:獲取SD卡的信息。第三步:設(shè)置SD卡的總線寬度。第四部:設(shè)置DMA的工作模式。使用官方庫的SDIO和sdcard進行移植和設(shè)置4線模式之后,SD卡并不能有效的初始化,errorstatus會返回SD_START_BIT_ERR的錯誤信息,但是,很明顯SDIO是支持4線模式的。因此需要對官方庫進行修改。從目前調(diào)試的結(jié)果來看,主要問題出現(xiàn)在SD卡上電初始化存在問題,另外則是時鐘頻率設(shè)置的問題。接下來將針對SDIO的4線模式對官方固件庫進行修改。第一個問題首先出現(xiàn)在SD卡的上電初始化過程中。描述:本工程中將所有的初始化過程都放在了disk_initialize(0)(main.c->C68)這個函數(shù)中,此函數(shù)的主要功能為初始化SD硬件。其中的功能包括對SD卡基本功能的設(shè)置函數(shù):SD_USER_Init()(main.c->C124)(由于此函數(shù)需要用戶自定義,所以放在了main.c中進行了定義)以及初始化信息的返回。SD_USER_Init函數(shù)第一步便是對SD卡的初始化:SD_Init(main.c->C129)此函數(shù)的詳解可見于其定義處(sdcard.c>C129)。其中包括對GPIO,SDIO以及DMA時鐘的配置,以及對SDIO外設(shè)寄存器的默認設(shè)置(SDIO_Deinit->C142)。完成以上設(shè)置,接下來進入:SD_PowerON(sdcard.c->C181)也就是SD卡的上電步驟。在這個步驟中首先要注意此函數(shù)僅是為了配置SD卡,因此僅需要一根線,而且時鐘頻率也只需設(shè)置為400kHz,所以并不需要在此步設(shè)置4線模式。在SD_PowerON中存在一處修改,從SD卡協(xié)議中(Page91)可以發(fā)現(xiàn)在上電后有需要等待74個時鐘之后電壓到達有效值之后才可以接著發(fā)送CMD0,但是在官方庫的代碼中并未等待這74個時鐘。因此在sdcard.c的C204-216添加了74個循環(huán)。圖3.1上電流程圖SD_InitializeCards函數(shù)主要發(fā)送CMD2和CMD3,獲得CID寄存器內(nèi)容和SD卡的相對地址(RCA),并通過CMD9,獲取CSD寄存器內(nèi)容。到這里,實際上SD卡的初始化就已經(jīng)完成了。SD」nit函數(shù)又通過調(diào)用SD_GetCardInfo函數(shù),獲取SD卡相關(guān)信息,之后調(diào)用SD_SelectDeselect函數(shù),選擇要操作的卡(CMD7+RCA),通過SD_EnableWideBusOperation函數(shù)設(shè)置SDIO的數(shù)據(jù)位寬為4位(但MMC卡只能支持1位模式)。經(jīng)過此修改,初始化通過,并且獲取卡的類型。上電部分的其它函數(shù)則參照以下流程圖:CMMComm,Unij&ablcResponse2.CommandCardIsVsrZfiOor切梢「HighCapacitySDMcrriEyVeri.00erlaterStandardCapaefty,SDF&?EQryCm,(READOCR)VefIJCSlaieftsMlC*3dly$[)M白m口ryLmndlFigure7-2:SPIModeInitializationFlow1MmSDMemoryGahid 仙3MCMMComm,Unij&ablcResponse2.CommandCardIsVsrZfiOor切梢「HighCapacitySDMcrriEyVeri.00erlaterStandardCapaefty,SDF&?EQryCm,(READOCR)VefIJCSlaieftsMlC*3dly$[)M白m口ryLmndlFigure7-2:SPIModeInitializationFlow1MmSDMemoryGahid 仙3MCMDS3:NdMUMgrZsendCMOsa.Though4i*to曲儀iin時立r心始Isupporlud丫002rangocdIhc-eELGardswithnon[:HnpM擊kt、口dsiguldl嗎7Unjsa帥L\Cand/retumsresponse■z/ithcullie爐Icz&miTiMrdf1/日門.X30MemoryCard\◎『Np!即Manr—ryCa『。G日rdretum&,in_id苗_曲旭=0'[Cardcwn|kMonBqergiiNorrtcmpi:ftiblcvalfiagcrangeordiccKpa7i)cmerrorQa-mpatblsvett日口日rangeanddncchpaflemisccmtdcI[UsrNClGof舊tec、匕口Me呷ivCamJGards皿hnoncqitp加血皿融crangeCMD5H(FEADOCR)CardrelumeInIldBEL31E-IUnusinble-Cardtfhostsuppoftshighrapacity.HC3通se:歸1CardreLums1mK3Waisie=DACMD4HwHhHCS-Ctor1CardreliJiTE!inidk;_s^atc,=1CMD5&iGetCCS)AC^lCMl(argumentOwD)CWDO*CSAsscrtcdIFn第二個問題出現(xiàn)在CMD55沒有足夠的處理時間以導致程序會進入一個死循環(huán)。由于修改時鐘頻率帶來的錯誤。最開始配置SDIO時,其頻率并不能設(shè)置為25MHz,而是應為400kHz,1線模式。初始化完成之后才應將時鐘頻率提高至25MHz。另外,時鐘速度最高為25MHz,高于此速度會導致SDIO傳輸不可用。SD_EnableWideBusOperation(sdcard.cC655)則是設(shè)置SDIO讀寫時鐘頻率以及4線模式的函數(shù)。在C672-688中間是對SDIO傳輸模式的設(shè)置。但是在官方的驅(qū)動中,程序會卡在SDEnWideBus(sdcard.cC674)中的FindSCR(sdcard.cC2440)中的C2764處,無法繼續(xù)進行。此錯誤主要是因為在此函數(shù)的C2744處沒有給予足夠的時間處理命令,需要加一段時間的延時(C2746-2747)。另外添加了C2770-2771兩行代碼以保證最后可以跳出該循環(huán)。第三個問題出現(xiàn)在SDIO的時鐘速率上。初始化的最后會設(shè)置SDIO_CK時鐘的頻率,并設(shè)置工作模式(DMA/輪詢)。在DMA模式中,如果只讀,可以設(shè)置SDIO_CK的時鐘為24Mhz,而如果要讀寫的話,這個時鐘設(shè)置為18M左右比較合適,否則出錯的幾率比較大,雖然我們的代碼加入了防出錯處理,不過這樣會降低寫入效率。而輪詢模式,則必須設(shè)置SDIO_CK時鐘頻率不大于18Mhz,否則不能正常讀寫。以上問題解決后,SDIO可以用4線模式傳輸數(shù)據(jù)(D0?D3均有數(shù)據(jù)傳輸),而且較為穩(wěn)定,但是速度仍然受限為500kB/s。并且無論將時鐘分頻為24,18或14MHz,在寫入任務(循環(huán)4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論