国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于SD卡的FAT32文件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

2017-07-20 14:32李敏侯亞玲劉穎
物聯(lián)網(wǎng)技術(shù) 2017年7期

李敏++侯亞玲++劉穎

摘 要:為解決嵌入式系統(tǒng)中便攜式存儲(chǔ)設(shè)備的大容量數(shù)據(jù)存儲(chǔ)問(wèn)題,并便于對(duì)數(shù)據(jù)進(jìn)行查詢(xún)、讀取及分析,系統(tǒng)采用具備SD卡插座的Cortex M3處理器平臺(tái),分析了SD卡的驅(qū)動(dòng)實(shí)現(xiàn),并按照FAT32文件系統(tǒng)規(guī)范進(jìn)行文件系統(tǒng)設(shè)計(jì)。設(shè)計(jì)使用c語(yǔ)言進(jìn)行開(kāi)發(fā),通過(guò)系統(tǒng)采集實(shí)時(shí)溫度,并將數(shù)據(jù)按照一定的格式規(guī)范存儲(chǔ)在SD卡的文件中;通過(guò)讀取SD卡進(jìn)行數(shù)據(jù)的查詢(xún)、讀取。經(jīng)反復(fù)測(cè)試,系統(tǒng)運(yùn)行穩(wěn)定,數(shù)據(jù)的存儲(chǔ)及讀取都很可靠,且軟件便于移植,可應(yīng)用于大容量數(shù)據(jù)采集的系統(tǒng)中。

關(guān)鍵詞:SD卡;FAT32文件系統(tǒng);SPI;ds18b20

中圖分類(lèi)號(hào):TP39;TN915.41 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2017)07-00-03

0 引 言

隨著嵌入式技術(shù)的飛速發(fā)展,很多嵌入式系統(tǒng)都需要大容量的存儲(chǔ)設(shè)備,用于數(shù)據(jù)存儲(chǔ)。而當(dāng)前,常用的存儲(chǔ)設(shè)備有U盤(pán)、移動(dòng)硬盤(pán)、Flash芯片、SD卡等,它們各有優(yōu)缺點(diǎn)。綜合考慮在系統(tǒng)設(shè)計(jì)時(shí)的性?xún)r(jià)比、功耗及體積等要求時(shí),SD卡無(wú)疑是一個(gè)非常好的選擇。隨著存儲(chǔ)技術(shù)的發(fā)展,其容量也越來(lái)越大,可以達(dá)到32 G以上,且支持SPI接口,同時(shí)SD卡有幾種不同的體積可供選擇,可滿(mǎn)足不同的設(shè)計(jì)及應(yīng)用要求。

具備SPI接口的嵌入式系統(tǒng)只需4個(gè)I/O接口就可以擴(kuò)展達(dá)32 G以上的外部存儲(chǔ)器,存儲(chǔ)容量不等,設(shè)備更換方便,程序在不同的設(shè)備上移植也更簡(jiǎn)單?;谝陨蟽?yōu)點(diǎn),SD卡在嵌入式市場(chǎng)得到廣泛應(yīng)用,成為存儲(chǔ)設(shè)備的首選。然而SD卡中的數(shù)據(jù)以塊的形式進(jìn)行存儲(chǔ),不便于數(shù)據(jù)的組織管理,為了能夠在PC端有效的對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)、管理、查詢(xún)及讀取,需要對(duì)SD卡進(jìn)行文件系統(tǒng)的設(shè)計(jì)。一般而言,PC端可直接對(duì)其進(jìn)行格式化后直接使用,而在嵌入式系統(tǒng)中,需要設(shè)計(jì)FAT文件系統(tǒng)對(duì)其進(jìn)行數(shù)據(jù)管理。

1 SD卡驅(qū)動(dòng)設(shè)計(jì)

SPI有9個(gè)引腳,支持兩種操作模式,即SD卡模式(SDIO通信)和SPI模式[1]。SD卡模式允許4線的高速數(shù)據(jù)傳輸模式,但需要MCU帶SD卡控制器,設(shè)計(jì)中會(huì)增加產(chǎn)品的硬件成本;SPI模式通過(guò)SPI總線接口與SD卡通信。

設(shè)計(jì)中采用的MCU為Cortex M3,它是一種低功耗、內(nèi)核架構(gòu)為ARM7的控制器,自帶SPI控制器。處理器平臺(tái)SD卡硬件連接電路均已完成,采用SPI連接方式。

系統(tǒng)使用SPI模式。系統(tǒng)上電后,設(shè)置SD卡模式轉(zhuǎn)換為SPI模式。在SD卡收到復(fù)位命令(CMO)時(shí),CS引腳被拉低,進(jìn)入SPI模式。上電后,因?yàn)镾D卡內(nèi)部供電電壓上升時(shí)間需要大約64個(gè)CLK,還需要10個(gè)CLK用于SD卡同步,在發(fā)送CMO指令前,發(fā)送至少74個(gè)系統(tǒng)CLK,初始化時(shí),CLK最大不得超過(guò)400 kHz。

通過(guò)SD卡初始化就可以知道SD卡的類(lèi)型,讀寫(xiě)數(shù)據(jù)。SD卡讀取數(shù)據(jù)通過(guò) CMD17實(shí)現(xiàn),具體過(guò)程如下:

(1)發(fā)送 CMD17;

(2)接收卡響應(yīng) R1;

(3)接收數(shù)據(jù)起始令牌 0XFE;

(4)接收數(shù)據(jù);

(5)接收 2 個(gè)字節(jié)的 CRC,如果不使用CRC,這兩個(gè)字節(jié)在讀取后可以丟掉。

(6)禁止片選之后發(fā)送8個(gè)CLK;

SD卡的寫(xiě)和讀數(shù)據(jù)過(guò)程基本相同,寫(xiě)數(shù)據(jù)通過(guò)CMD24實(shí)現(xiàn)[2],具體過(guò)程如下:

(1)發(fā)送CMD24;

(2)接收卡響應(yīng)R1;

(3)發(fā)送寫(xiě)數(shù)據(jù)起始令牌0XFE;

(4)發(fā)送數(shù)據(jù);

(5)發(fā)送2 B的偽CRC;

(6)禁止片選之后多發(fā)8個(gè)CLK。

2 FAT32文件系統(tǒng)介紹

為了有效管理寫(xiě)入SD卡的數(shù)據(jù),使SD卡在PC機(jī)端能夠被有效訪問(wèn),必須將SD卡中的數(shù)據(jù)以文件形式存儲(chǔ),需要在SD卡中創(chuàng)建常用的文件系統(tǒng)。目前,SD卡的容量越來(lái)越大,因此設(shè)計(jì)中采用FAT32文件系統(tǒng)。

在設(shè)計(jì)中使用了FATFS,它是一種開(kāi)源免費(fèi)且專(zhuān)用于小型嵌入式系統(tǒng)的文件系統(tǒng)模塊,硬件獨(dú)立性強(qiáng),是Windows系統(tǒng)兼容的文件系統(tǒng)格式,其代碼特點(diǎn)與平臺(tái)無(wú)關(guān),支持長(zhǎng)文件名、多種大小的扇區(qū)[3]?;诖颂攸c(diǎn),F(xiàn)ATFS的使用非常廣泛,其層次結(jié)構(gòu)如圖1所示。

應(yīng)用層用戶(hù)只需調(diào)用FATFS模塊提供給用戶(hù)接口函數(shù),就可在PC機(jī)上對(duì)SD卡進(jìn)行讀寫(xiě)操作[4]。中間層FATFS模塊實(shí)現(xiàn)了FAT文件的讀/寫(xiě)協(xié)議,使用中一般不做修改,可直接將相關(guān)頭文件包含在應(yīng)用程序中。編寫(xiě)移植代碼的是FATFS模塊提供的底層接口,包括存儲(chǔ)媒介讀/寫(xiě)接口以及提供文件創(chuàng)建修改時(shí)間的實(shí)時(shí)時(shí)鐘。在FATFS源碼包中,需要修改的是與平臺(tái)相關(guān)的代碼diskio.c,即FATFS和disk I/O模塊接口層文件[5]。

FATFS模塊在移植時(shí),只需修改2個(gè)文件,即ffconf.h 和 diskio.c。FATFS模塊的所有配置項(xiàng)都存放在ffconf.h中,可以通過(guò)配置一些選項(xiàng)來(lái)滿(mǎn)足設(shè)計(jì)的需求。對(duì)于SD卡的一些操作特性,可修改ffconf.h中的宏定義來(lái)實(shí)現(xiàn),比如宏_FS_READONLY將其設(shè)置為0,即表示對(duì)SD卡進(jìn)行讀寫(xiě)權(quán)限的操作,_USE_MKFS為1表示使能SD卡的格式化操作等。

FATFS的移植主要分為3個(gè)步驟:

(1)在 integer.h 里定義好數(shù)據(jù)的類(lèi)型;

(2)根據(jù)對(duì)SD卡的功能需要,通過(guò) ffconf.h配置FATFS的相關(guān)功能;

(3)函數(shù)編寫(xiě):打開(kāi) diskio.c以進(jìn)行底層驅(qū)動(dòng)編寫(xiě),實(shí)現(xiàn) 6個(gè)接口函數(shù)的編寫(xiě),如圖2所示。

通過(guò)上述步驟就可以完成FATFS的移植。

3 FAT32文件系統(tǒng)設(shè)計(jì)

FAT32文件系統(tǒng)的設(shè)計(jì)包括以下步驟:

(1)程序初始化。定義兩個(gè)結(jié)構(gòu)體變量,其類(lèi)型分別為DIR與FILINFO[6]。其中,DIR結(jié)構(gòu)體表示文件夾目錄相關(guān)信息,例如文件夾cewen,文件夾下有文件wendu1.txt,wendu2.txt,wendu3.txt以及文件夾cw。DIR用來(lái)存儲(chǔ)LM、limin的目錄信息,F(xiàn)ILINFO用來(lái)存儲(chǔ)limin1.txt,limin2.txt,limin3.txt。

DIR cewendir;//臨時(shí)目錄信息

FILE fileinfo;//臨時(shí)文件信息

(2)程序初始化中要初始化內(nèi)存,因?yàn)槲募畔⒎峙涞膬?nèi)存空間大,一般存儲(chǔ)在內(nèi)部RAM中,也可存放在外部RAM中。先初始化內(nèi)存,再申請(qǐng)fata所用到的變量分配內(nèi)存空間。

mem_init(SRAMIN);//初始化內(nèi)部?jī)?nèi)存池

exfuns_init( );//為FATFS相關(guān)變量申請(qǐng)內(nèi)存[7]

(3)掛載SD卡。只有掛載了SD卡,才能使用,即尋找是否存在。

f_mount(0,fs[0]);//掛載SD卡

(4)打開(kāi)SD卡下的文件夾,函數(shù)為FRESULT f_opendir (DIR *dj,/* 指向一個(gè)空白的結(jié)構(gòu)體,用來(lái)存儲(chǔ)要打開(kāi)的文件信息,用到初始化定義的DIR型變量*/const TCHAR *path /*指向文件夾名稱(chēng)的指針,即打開(kāi)文件的路徑 */)。函數(shù)返回0 ,表示打開(kāi)文件成功,否則表示打開(kāi)失敗[8]。

res=f_opendir ( &cewen, "0:/"); //打開(kāi) 0:/cewen文件夾,文件夾的信息保存在結(jié)構(gòu)體cewendir變量中,res為0,打開(kāi)成功

(5)讀取文件信息。在讀取文件信息之前,先要申請(qǐng)相關(guān)變量信息的內(nèi)存。

fileinfo.lfsize=_MAX_LFN*2+1; //長(zhǎng)文件名最大長(zhǎng)度

fileinfo.lfname=mymalloc(SRAMIN,fileinfo.lfsize);//為長(zhǎng)文件緩存區(qū)分配內(nèi)存

(6)只有成功打開(kāi)文件夾,才能讀取或更改文件夾下的文件,與Windows系統(tǒng)下的使用原理一樣。判斷通過(guò)res進(jìn)行,即if(res==FR_OK){讀取文件夾}

(7)讀取文件夾函數(shù)為:FRESULT f_readdir (DIR *dj,/*指向讀取的文件夾信息結(jié)構(gòu)體的指針,打開(kāi)文件夾后,文件夾的信息已存入信息結(jié)構(gòu)體 */FILINFO *fno,/* 指向文件信息結(jié)構(gòu)體,用來(lái)存儲(chǔ)讀取到的文件信息*/)。重復(fù)調(diào)用此函數(shù)可讀取文件夾內(nèi)的所有文件,當(dāng)所有的文件讀取結(jié)束后[9],函數(shù)返回一個(gè)空字符串到f_name[ ]中(文件信息結(jié)構(gòu)體中的一個(gè)變量,存放名稱(chēng))

if(res==FR_OK) {while(1){res = f_readdir(&lmdir,&fileinfo);//遍歷文件

if(res!=FR_OK || fileinfo.fname[0]==0)

{ Show_Str(60,130,200,16,"出錯(cuò)了",16,0);break;}//讀取出錯(cuò)或遍歷結(jié)束,則退出

fn=(u8*)(*fileinfo.lfname?fileinfo.lfname:fileinfo.fname); printf(fn);//輸出文件名} }

以上步驟是對(duì)于文件夾及文件的操作,以下步驟為文件的讀寫(xiě)操作:

(1)打開(kāi)或新建一個(gè)文件(返回值為0則成功)。

FRESULT f_open (

FIL *fp,/* 指向一個(gè)用來(lái)存儲(chǔ)文件對(duì)象的空結(jié)構(gòu)體指針*/

const TCHAR *path, /* 指向文件名的指針,即路徑*/

BYTE mode /* 讀取方式*/

讀取方式的使用:

FA_READ讀模式(讀寫(xiě)同時(shí)生效)

FA_WRITE寫(xiě)模式(讀寫(xiě)同時(shí)生效)

FA_OPEN_EXISTING默認(rèn)打開(kāi)方式

FA_OPEN_ALWAYS打開(kāi)文件,如果不存在,則建立一個(gè)新文件;用此種方式可以用f_lseek在文件后追加數(shù)據(jù)。

FA_CREATE_NEW新建文件,如果文件已存在,則新建失敗

FA_CREATE_ALWAYS新建文件,如果文件已存在,覆蓋舊文件。

新建一個(gè)文件:

res=f_open(&fsrc,"0:/dongman.txt",F(xiàn)A_OPEN_ALWAYS); //打開(kāi),新建文件測(cè)試

if(res==FR_OK)

{

POINT_COLOR=0x2299; Show_Str(60,170,200,16,"新建文件成功!",16,0);}

f_close(&fsrc);

(2)讀取文件(讀取成功返回0)。

FRESULT f_read (

FIL *fp/* 指向文件對(duì)象結(jié)構(gòu)體指針*/

void *buff/* 指向存儲(chǔ)讀取到的數(shù)據(jù)的緩沖區(qū)的指針 */

UINT btr/* 準(zhǔn)備讀取的字節(jié)數(shù) */

UINT *br /* 讀取到的字節(jié)數(shù) */

f_read函數(shù)執(zhí)行完后,*br值用來(lái)存放讀取到的字節(jié)數(shù),br

res=f_open(&fsrc,"0:/limin2.txt",F(xiàn)A_READ); // 打開(kāi),新建文件測(cè)試

if(res==FR_OK)

{

USART1_SendStr("文件內(nèi)容:");

USART1_SendStr("\r\n");

while(1){

res=f_read(&fsrc,pr,256,&br);

if(res ||br < 256)

break;

USART1_SendStr(pr);

USART1_SendStr("\r\n");

Show_Str(60,170,200,16,"讀取成功!",16,0); } }

f_close(&fsrc); //關(guān)閉文件,不論是打開(kāi)還是新建,一定要關(guān)閉。

4 系統(tǒng)總體設(shè)計(jì)

系統(tǒng)主控核心為Cortex-M3,搭載DS18B20溫度傳感器[10],實(shí)現(xiàn)溫度的實(shí)時(shí)測(cè)量,每5 s測(cè)量一次溫度,將測(cè)量的數(shù)據(jù)寫(xiě)入SD卡的wendu.txt文件中。設(shè)計(jì)中需要實(shí)現(xiàn)的功能模塊為DS18B20測(cè)溫的驅(qū)動(dòng)實(shí)現(xiàn),SD卡驅(qū)動(dòng)實(shí)現(xiàn),SD卡fate32文件系統(tǒng)實(shí)現(xiàn)及主控任務(wù)實(shí)現(xiàn),系統(tǒng)設(shè)計(jì)總流程如圖3所示。

圖3 系統(tǒng)設(shè)計(jì)總流程圖

在設(shè)計(jì)中,SD卡Fate32文件系統(tǒng)的實(shí)現(xiàn)步驟全面可行,系統(tǒng)上電后,會(huì)依次初始化各相關(guān)模塊。SD卡首先檢測(cè)是否插接正常并給予提示。系統(tǒng)檢測(cè)到SD卡,會(huì)掛接SD卡到主控系統(tǒng)并在SD卡根目錄中創(chuàng)建一個(gè)名為wendu.txt的測(cè)溫記錄文檔(如果已經(jīng)存在,則直接打開(kāi)該文檔)。準(zhǔn)備工作完成后,系統(tǒng)開(kāi)始循環(huán)測(cè)溫,并將每一次測(cè)溫結(jié)果以及RTC時(shí)間格式化寫(xiě)入文檔中??稍O(shè)定文檔大小,如果寫(xiě)入信息超過(guò)500 K,則關(guān)閉現(xiàn)打開(kāi)文檔,重新建立文檔記錄。

5 結(jié) 語(yǔ)

經(jīng)測(cè)試,系統(tǒng)工作穩(wěn)定,SD卡插接正??煞€(wěn)定打開(kāi),也可以FAT32格式進(jìn)行格式化。通過(guò)軟件設(shè)計(jì),可在SD卡中創(chuàng)建文件、打開(kāi)文件、關(guān)閉文件及刪除文件,所采集的數(shù)據(jù)能夠正常寫(xiě)入文件中,并可結(jié)合RTC寫(xiě)入當(dāng)前數(shù)據(jù)的采集時(shí)間供后續(xù)分析使用。SD卡可在PC端打開(kāi),提供采集的文本信息。設(shè)計(jì)中使用溫度采集進(jìn)行測(cè)試,也可按需求采集具體所需數(shù)據(jù)。FAT32文件系統(tǒng)的實(shí)現(xiàn)設(shè)計(jì)可移植性良好,可移植于單片機(jī)及各類(lèi)控制器的信息采集存儲(chǔ)系統(tǒng)中。

參考文獻(xiàn)

[1]王淵,楊婧.一種基于SD卡的口令認(rèn)證密鑰協(xié)商方案[J].信息安全與通信保密,2014(10):88-92.

[2]劉智勇,陳鵬飛,宿磊,等.基于STM32芯片的U盤(pán)/SD卡文件傳輸技術(shù)研究[J].現(xiàn)代電子技術(shù),2014,37(18):107-109.

[3]石長(zhǎng)華,謝恩.基于FAT32文件系統(tǒng)和SD卡的陶瓷窯爐測(cè)溫儀設(shè)計(jì)[J].激光雜志,2014(7):100-103.

[4]樊海洋,王立鵬,安曉捧,等.FAT32文件系統(tǒng)數(shù)據(jù)恢復(fù)技術(shù)的研究[J].科技信息,2013(36).

[5]夏昀.基于FAT32文件系統(tǒng)的安全存儲(chǔ)方案[D].上海:上海交通大學(xué),2013.

[6]楊明極,陳方縣,吳學(xué)君.嵌入式系統(tǒng)中SD卡的FAT32文件系統(tǒng)的設(shè)計(jì)[J].電聲技術(shù),2010,34(4):36-39.

[7]顧春洋,李鑫,張強(qiáng).基于SD卡的FAT32文件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].產(chǎn)業(yè)與科技論壇,2013,12(2):96-98.

[8]楊書(shū)凱.劉慧.一種用于高速數(shù)據(jù)采集的改進(jìn)FAT32文件系統(tǒng)[J].信息技術(shù)與信息化,2011(6):68-70.

[9]何諧. FAT32文件系統(tǒng)在Cortex-M3音樂(lè)播放器中的應(yīng)用[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2013,13(6):71-73.

[10]袁杰,江祖敏.基于FAT32的文件隱藏方法及在Linux上的實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2012,20(13):15-18.

微山县| 沾化县| 安多县| 都兰县| 吴堡县| 淄博市| 韩城市| 虞城县| 辉南县| 萨嘎县| 汉沽区| 衢州市| 中方县| 万盛区| 凤山市| 新竹市| 大石桥市| 连城县| 获嘉县| 虞城县| 怀集县| 靖安县| 任丘市| 巴青县| 巩义市| 盘锦市| 久治县| 海阳市| 永济市| 崇左市| 海伦市| 汉源县| 娱乐| 新安县| 吴忠市| 福州市| 毕节市| 锦州市| 邯郸县| 丰原市| 呈贡县|