版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第一部分FATFS系統(tǒng)的特點(diǎn)和原理FatFs是一個為小型嵌入式系統(tǒng)設(shè)計的通用FAT(FileAllocationTable)文件系統(tǒng)模塊。FatFs的編寫遵循ANSIC,并且完全與磁盤I/O層分開。因此,它獨(dú)立于硬件構(gòu)架。它可以被嵌入到低成本的微控制器中,如AVR、8051、PIC、ARM、Z80、68K等等,而不需要做任何修改。ApplicationFatFsModuleLowleveldiskI/ORTC(SD,ATA,USB,NAND)圖1.1FATFS示意圖其特點(diǎn)是:兼容Windows的FAT文件系統(tǒng)?不依賴于硬件平臺與架構(gòu),易于移植代碼和工作區(qū)占用空間非常小多種配置選項(xiàng)■■■■■■■另外,多ANSI/OEM或Unicode中長文件名的支持RTOS的支持多扇區(qū)大小的支持只讀,最少API,I/O緩沖區(qū)等等FatFs提供了豐富的API函數(shù),包括驅(qū)動器的建立,文件的讀寫以及目錄的設(shè)立第二部分FATFS文件系統(tǒng)移植主要實(shí)現(xiàn)功能分析2.1功能分析結(jié)合項(xiàng)目實(shí)際情況,本次FatFs文件系統(tǒng)的移植主要實(shí)現(xiàn)的功能為:?通過特定的“開始”按鍵等輸入控制文件的創(chuàng)建以及實(shí)驗(yàn)的開始;?從節(jié)點(diǎn)收集的數(shù)據(jù)持續(xù)寫入特定的txt文件中,在寫入過程中需要加入斷電保護(hù)使得設(shè)備在突發(fā)斷電中可以將當(dāng)前緩存中的數(shù)據(jù)全部寫入或者舍棄;按下“結(jié)束”按鍵,停止本次實(shí)驗(yàn),并生成第一次實(shí)驗(yàn)數(shù)據(jù)文件,再度按下“開始”按鈕開始實(shí)驗(yàn)時會重新建立一個新的txt文本文檔,并將數(shù)據(jù)寫入;在實(shí)驗(yàn)過程中需要對當(dāng)前SD卡的讀寫狀態(tài)進(jìn)行監(jiān)視,比如寫入的狀態(tài)和剩余的容量等:>當(dāng)SD卡剩余容量小于一定界限時(此界限可根據(jù)反應(yīng)時間和寫入速度決定),會給予報警信號進(jìn)行提示;另外,分析以下功能實(shí)現(xiàn)的主要矛盾點(diǎn):?傳感器節(jié)點(diǎn)采樣速度為200Hz,平均5ms一次,每次采集數(shù)據(jù)大小約為1KB,所以SD卡寫入速度理論上應(yīng)為200KB/S。這個速度會受到寫入次數(shù)、文件系統(tǒng)操作次數(shù)以及文件數(shù)量的影響。寫入的數(shù)據(jù)需要斷電保護(hù),主要目的是防止斷電使得一幀數(shù)據(jù)并未完全寫入txt文件中,成為無用數(shù)據(jù)。2.2主要實(shí)現(xiàn)函數(shù)與流程根據(jù)以上需求,在本次SD卡文件系統(tǒng)的實(shí)現(xiàn)中,主要使用f_mount、f_open、f_write、f_lseek、f_sync等函數(shù),下面著重結(jié)合FATFS系統(tǒng)的原理對以上函數(shù)的工作流程進(jìn)行分析。根據(jù)FATFS的例程顯示,一般的寫操作包括以下幾個步驟:1.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)建文件所用。2.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)建的方式。3.f_write主要功能:寫入數(shù)據(jù)到一個文件。::::::咨左!::::::咨左!:企翩、旳再加:*^frjWd:圖2.1f_write的工作原理示意圖描述:先前的f_open是將一個創(chuàng)建的文件設(shè)置為活動的狀態(tài),也就是允許按照其事先設(shè)置的模式進(jìn)行讀寫操作等。文件對象中的讀/寫指針以已寫入字節(jié)數(shù)增加。該函數(shù)成功后,應(yīng)該檢查*ByteWritten來檢測磁盤是否已滿。在寫操作過程中,一旦*ByteWritten
<*ByteToWritten,則意味著該卷已滿。4.f_lseek主要功能:移動一個打開的文件對象的文件讀/寫指針。也可以被用來擴(kuò)展文件大?。ù仡A(yù)分配)。描述:采集的數(shù)據(jù)是按照一定的頻率寫入文檔的,每次寫入需要在上一次寫入的位置接著寫,而非替換原有數(shù)據(jù)。f_write的指針每次都默認(rèn)指向文檔開頭。因此,必須在寫操作前將寫指針移向文本最后。5.f_close主要功能:關(guān)閉一個活動的文件。描述:f_close函數(shù)關(guān)閉一個打開的文件對象。無論向文件寫入任何數(shù)據(jù),文件的緩存信息都將被寫回到磁盤。該函數(shù)成功后,文件對象不再有效,并且可以被丟棄。如果文件對象是在只讀模式下打開的,不需要使用該函數(shù),也能被丟棄。6.f_sync主要功能:沖洗一個寫文件的緩存信息。ITiV-V1:外孫刨」RflJi.rnrir溶I代ITiV-V1:外孫刨」RflJi.rnrir溶I代?應(yīng)罔八::::::應(yīng)筆!:節(jié)曲IS■知呂加::::::1:::::輸::::Fuflci圖2.2f_write的工作原理示意圖描述:其執(zhí)行過程與f_close相同。但是文件仍處于打開狀態(tài),并且可以繼續(xù)對文件執(zhí)行讀/寫/移動指針操作。這適用于以寫模式長時間打開文件,比如數(shù)據(jù)記錄器。定期的或f_write后立即執(zhí)行f_sync可以將由于突然斷電或移去磁盤而導(dǎo)致數(shù)據(jù)丟失的風(fēng)險最小化。在f_close前立即執(zhí)行f_sync沒有作用,因?yàn)樵趂_close中執(zhí)行了f_sync。換句話說,這兩個函數(shù)的差異就是文件對象是不是無效的。本例設(shè)計的程序基本結(jié)構(gòu)如下所示:流程圖開臺創(chuàng)建驅(qū)動器所對應(yīng)使用的函數(shù)f_mount創(chuàng)建新文件并設(shè)置
寫模式f_open是否滿足結(jié)束條件f_size將當(dāng)前寫指針的位置偏
移到文件末尾f_lseek數(shù)據(jù)寫入f_write沖洗寫緩存f_sync結(jié)束圖2.3寫數(shù)據(jù)流程圖fclose第三部分FATFS移植測試問題分析與解決方案3.1數(shù)據(jù)寫入的測試首先通過中斷模擬匯聚節(jié)點(diǎn)收集數(shù)據(jù)的大小和速度,匯聚節(jié)點(diǎn)采樣速率為200Hz,即每5ms采集一次,每次數(shù)據(jù)大小最大為1024字節(jié)。首先需要STM32每5ms產(chǎn)生一個1024字節(jié)的數(shù)據(jù)包。3.1.1測試1:測試f_write的寫入速度測試目的:當(dāng)前工程使用的為SDIO的1線模式,其理論速度為2MB/s,理論上滿足數(shù)據(jù)的寫入速度,設(shè)計實(shí)驗(yàn)驗(yàn)證實(shí)際的數(shù)據(jù)寫入是否滿足200Hz的要求。測試手段:在寫文件程序中,包括文件寫指針的尋址以及數(shù)據(jù)的寫入,每完成一個函數(shù)會控制一個LED燈的亮滅,通過示波器觀察其電平拉低的時間,即為每個函數(shù)所需要的耗時。測試代碼:for(write_count=0;write_count<4000;write_count++)2{3 GPIO_Write(GPIOC,0xfe);res=f_lseek(&fil,fil.fsize);GPIO_Write(GPIOC,0xff);GPIO_Write(GPIOC,0xfd);7res=fwrite(&fil,testBuffer,sizeof(testBuffer)-1,&br);8res=fsync(&fil);GPIO_Write(GPIOC,0xff);10}11f_close(&fil);觀察現(xiàn)象:通過示波器可以觀察到f_lseek耗時約為40us,f_write與f_sync的耗時共約為5ms,其速度不僅不符合工程要求,甚至也不符合其理論速度。經(jīng)過驗(yàn)證,f_write與f_sync耗時相當(dāng),均約為2.7ms,僅計算f_write的寫入速度。另外,在寫入循環(huán)中,任意時間拔掉SD卡,在PC中對文本進(jìn)行觀察,可以發(fā)現(xiàn)在f_write后加入f_sync,并不會存在一個testBuffer僅有一部分被寫入的狀況,循環(huán)所寫入的數(shù)據(jù)均保存在文檔中可以顯示,不存在亂碼。可以看出,原本設(shè)置為4000次的有限循環(huán),在中間任意時刻拔出后,可以觀察到其中47次有效寫入,如圖3.1(a)所示?!箃estl.txt-記事本Thisisthevirtualwritin呂datatest」testl.txt-記事本Thisisthevirtualwritin呂datatestforThisisth巳virtu辿1writin呂t巳mtforThisisthevirtualwritingdatatest.forThisisthevirtu也1writingH日t;mtestforThisisthevirtualwritingdatatest.forThisisthevirtualwritin呂datatestforThisisth巳virtu辿1writin呂test.forThisisthevirtualwritin呂datatest.forThisisthevirtu也1writingH日t;mtestforThisisthmvirtu辺1writingdat;atEEtforThisisthevirtualwritin呂datatestforThisisth巳virtu辿1writin呂test.forThisisthevirtualwritin呂datatest.forThisisthevirtu畀writingH日t;oitest-forThisisthmvirtu辺1writingdat;atEEtforThisisthevirtualwritin呂datatestforThisisth巳virtu辿1writin呂test.forThisisthevirtualwritingdatatest.forThisisthevirtualwritin呂datatestforThisisthmvirtu辺1writingdatcitEBtforThisisthevirtualwritin呂datatestforThisisth巳virtu辿1writiri呂test.forThisisthevirtualwritingdatatest.forThisisthevirtualwritin呂datatestforThisisth巳virtu辿1writin呂t巳mtforThisisthevirtualwritingdatatest.forThisisth巳virtu辿1writiri呂test.forThisisthevirtualwritingdatatest.forThisisthevirtualwritin呂datatestforThisisth巳virtu辿1writin呂test.forThisisthevirtualwritin呂datatest.forThisisthevirtu也1writingH日t;mtestforThisisthevirtualwritingdatatest.forThisisthevirtualwritingdatatestforThisisth巳virtu辿1writingtest.forThisisthevirtualwrit(a)tatest.forThisisthevirtu畀writingH日t;oitest-forThisisthmvirtu辺1writingdat;atEEtforThisisthevirtualwritin呂datatestfor」testl.txt-記事本文件(F)褊輯(E)梧式(O)童看(V)幫助(H)timestilTL巳日tiir舊日tiir舊日tiir舊日tiir舊日tilTL巳日tiir舊日tiir舊日timR日tiir舊日tiiR巳日tiir舊日tim已日timR日tiir舊日tiiR巳日tiir舊日tiir舊日tiiTL已曰tiir舊日tiiR巳日tiir舊日tiir舊日tiiR巳日tiir舊日tiiR巳日tiir舊日tiir舊日tiiR巳日tiir舊日tiir舊日tiir舊日tiir舊日tiiR巳日timestim已日timR日文件舊精(E)梧式(O)查看(V)幫助(H〕■EM; F:\K小: 0拜哲學(xué)閏:0拜■已用蘭閏: 516,096可用蘭閏: 495,288,32。字十客號: 495,804,416手十驅(qū)動器F:(b)殲圖13.1SD卡文件寫入狀況504KB472MB472MB但是如果將f_write之后的f_sync注釋掉,在循環(huán)中任意時間拔掉SD卡,在PC中對文本進(jìn)行觀察,則可以發(fā)現(xiàn)文本中并沒有已經(jīng)完成的寫操作的數(shù)據(jù),為空文本,也不存在亂碼現(xiàn)象,文本占用空間為0,但是,查詢SD卡的屬性可以發(fā)現(xiàn)有空間被占用,如圖3.1(b)所示。解決辦法:從以上分析可知,如果需要加入f_sync斷電保護(hù)的這個函數(shù),則一次寫操作需要5.5ms,但是其速度遠(yuǎn)遠(yuǎn)達(dá)不到要求。因此,擬采用SDIO的4線模式對SD卡進(jìn)行讀寫操作來大大提高其讀寫速度。3.1.2測試2:FATFS工程SDIO的4線模式修改整個SD卡的初始化過程基本分為三大步:可以參見main.c中的C124的SD_USER_Init:第一步:SDIO外設(shè)的初始化以及SD卡本身的上電。第二步:獲取SD卡的信息。第三步:設(shè)置SD卡的總線寬度。第四部:設(shè)置DMA的工作模式。使用官方庫的SDIO和sdcard進(jìn)行移植和設(shè)置4線模式之后,SD卡并不能有效的初始化,errorstatus會返回SD_START_BIT_ERR的錯誤信息,但是,很明顯SDIO是支持4線模式的。因此需要對官方庫進(jìn)行修改。從目前調(diào)試的結(jié)果來看,主要問題出現(xiàn)在SD卡上電初始化存在問題,另外則是時鐘頻率設(shè)置的問題。接下來將針對SDIO的4
線模式對官方固件庫進(jìn)行修改。第一個問題首先出現(xiàn)在SD卡的上電初始化過程中。描述:本工程中將所有的初始化過程都放在了disk_initialize(0)(main.c->C68)這個函數(shù)中,此函數(shù)的主要功能為初始化SD硬件。其中的功能包括對SD卡基本功能的設(shè)置函數(shù):SD_USER_Init()(main.c->C124(由于此函數(shù)需要用戶自定義,所以放在了main.c中進(jìn)行了定義)以及初始化信息的返回。SD_USER_Init函數(shù)第一步便是對SD卡的初始化:SD_Init(main.c->C129)此函數(shù)的詳解可見于其定義處(sdcard.c>C129)。其中包括對GPIO,SDIO以及DMA時鐘的配置,以及對SDIO外設(shè)寄存器的默認(rèn)設(shè)置(SDIO_Deinit->C142)。完成以上設(shè)置,接下來進(jìn)入:SD_PowerON(sdcard.c->C181)也就是SD卡的上電步驟。在這個步驟中首先要注意此函數(shù)僅是為了配置SD卡,因此僅需要一根線,而且時鐘頻率也只需設(shè)置為400kHz,所以并不需要在此步設(shè)置4線模式。6.4.1PowerUpSupplyvnltngcinujalizauonseduenIniljalizalidnMe也頁Themaximumof1msec.西clockcyclesandsupdyrampuplimeCMoe*蔦;匚Vabdvdiagcfor
allcwiwuflndtninecotvalueforACMD4H在SD_PowerON中存在一處修改,從SD卡協(xié)議中6.4.1PowerUpSupplyvnltngcinujalizauonseduenIniljalizalidnMe也頁Themaximumof1msec.西clockcyclesandsupdyrampuplimeCMoe*蔦;匚Vabdvdiagcfor
allcwiwuflndtninecotvalueforACMD4HOptwal o1ACMD41uniilridcardsare陽申口ndingwthbusyBil泅Inaire.iR.ll■IPn-iuaraiinAiisnrsim圖3.1上電流程圖SD_InitializeCards函數(shù)主要發(fā)送CMD2和CMD3,獲得CID寄存器內(nèi)容和SD卡的相對地址(RCA),并通過CMD9,獲取CSD寄存器內(nèi)容。到這里,實(shí)際上SD卡的初始化就已經(jīng)完成了。SD_Init函數(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ù)則參照以下流程圖:CMMVarZCOorkaterHighCspacrtySDMcrnoryCardVeri.OQcrlaterStandardCapacfty-百DMernory器品p,Unij5s?blcCardCardIsready'J川切赳CommandIComm;VCfUCSlaicftaM匚EDh怕rnciry亡日nd(READpCR)LNmSDMemoryCaQNdUjrdakM-fIcurujCMDS3:Nd怕M昨rCMMVarZCOorkaterHighCspacrtySDMcrnoryCardVeri.OQcrlaterStandardCapacfty-百DMernory器品p,Unij5s?blcCardCardIsready'J川切赳CommandIComm;VCfUCSlaicftaM匚EDh怕rnciry亡日nd(READpCR)LNmSDMemoryCaQNdUjrdakM-fIcurujCMDS3:Nd怕M昨r如sendCMOsa.Though謁i*FsectffiinwJfidtoba如AinwdtrLaoilD*wsupporlud丫口口尸rangocdUic-cand.Gards型ithnon[:oripM比kt^lageFigure7-2:SPIModeInitializationFlowGa*dretumsresponsewithcullie滬Icz&miTiMrdf1期日門.XED和ei?i>CardItx曲£DM日nr^ryCE『dG日rdretum&'in」dlj5talc=0'廠Card期thcwn|■"0加口日陽1iNorrtcmpotit}止volfiagcrangeordiccKpa7i)cmerrorQa-mpatblsvctiBgerangeanddncchperflemisccmtdcI「Ver宜.DOorlater、幺£?rvtenpivCa「u丿Gardswvithnonccrrpotiblc⑷tagurangeCMD5H(FEADOCR)CardrelumeInidBEtste-IUnusinble-0也CardreLumsinK3baisie=Dtfhostsuppoftshighrapadty.HC3issetBo1CardreliJiTE!inidk;_s^atc,=1ACIUD41IwHhHCS-CJof1CMD5&iGetCCS)AC^lCMl(argumentOwD)CWDO*陰Asserted[暫)第二個問題出現(xiàn)在CMD55沒有足夠的處理時間以導(dǎo)致程序會進(jìn)入一個死循環(huán)。由于修改時鐘頻率帶來的錯誤。最開始配置SDIO時,其頻率并不能設(shè)置為25MHz,而是應(yīng)為400kHz,1線模式。初始化完成之后才應(yīng)將時鐘頻率提高至25MHz。另外,時鐘速度最高為25MHz,高于此速度會導(dǎo)致SDIO傳輸不可用。SD_EnableWideBusOperation(sdcard.cC655)則是設(shè)置SDIO讀寫時鐘頻率以及4線模式的函數(shù)。在C672-688中間是對SDIO傳輸模式的設(shè)置。但是在官方的驅(qū)動中,程序會卡在SDEnWideBus(sdcard.cC674)中的FindSCR(sdcard.cC2440)中的C2764處,無法繼續(xù)進(jìn)行。此錯誤主要是因?yàn)樵诖撕瘮?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ù)(DO?D3均有數(shù)據(jù)傳輸),而且較為穩(wěn)定,但是速度仍然受限為500kB/s。并且無論將時鐘分頻為24,18或14MHz,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《住宅平面分析》課件
- 小學(xué)五年級數(shù)學(xué)小數(shù)乘除法計算練習(xí)題集
- 小學(xué)四年級下冊四則混合運(yùn)算及簡便運(yùn)算
- 中考語文專題匯編-非連續(xù)性文本閱讀-人教版初中九年級全冊語文試題
- 小學(xué)三年級四則混合運(yùn)算練習(xí)題
- 屆茶中學(xué)屆高三臨考模擬考試臨考模擬語文加試試題教師版語文加試題(選考?xì)v史)
- 波形梁護(hù)欄材料技術(shù)參數(shù)
- 激光焊接常見工藝參數(shù)解讀
- 血透室護(hù)理工作總結(jié)
- 優(yōu)化數(shù)學(xué)課程設(shè)置與教材使用提高教學(xué)效果
- 藝術(shù)漆培訓(xùn)課件
- 四川新農(nóng)村建設(shè)農(nóng)房設(shè)計方案圖集川東南部分
- 2024年江蘇省普通高中學(xué)業(yè)水平測試小高考生物、地理、歷史、政治試卷及答案(綜合版)
- 浙江省杭州市西湖區(qū)2023-2024學(xué)年六年級上學(xué)期期末語文試卷
- 擋風(fēng)玻璃自動涂膠方案
- 復(fù)旦大學(xué)新聞傳播學(xué)考博真題
- IEC60335-1(中文)
- 對于申請?jiān)黾愚k公用房請示
- 民用無人駕駛航空器系統(tǒng)空中交通管理辦法
- 姓名代碼查詢
- 四層電梯控制系統(tǒng)設(shè)計-(共38頁)
評論
0/150
提交評論