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

?

MC9S12UF32的嵌入式文件系統(tǒng)數(shù)據(jù)存儲(chǔ)模塊

2010-06-22 08:17韓曉雪曾鳴邵貝貝
關(guān)鍵詞:存儲(chǔ)模塊存儲(chǔ)介質(zhì)扇區(qū)

韓曉雪,曾鳴,邵貝貝

(清華大學(xué) 工程物理系,北京100084)

引 言

隨著信息技術(shù)的發(fā)展,嵌入式系統(tǒng)簡(jiǎn)單地對(duì)存儲(chǔ)介質(zhì)按地址、字節(jié)進(jìn)行讀寫(xiě)的方式已經(jīng)不能滿(mǎn)足實(shí)際應(yīng)用的需求,利用文件系統(tǒng)對(duì)存儲(chǔ)介質(zhì)進(jìn)行管理成為嵌入式系統(tǒng)的一個(gè)發(fā)展方向。雖然目前存在很多版本的文件系統(tǒng),但Windows的廣泛應(yīng)用使得FAT文件系統(tǒng)仍然是最通用的文件系統(tǒng)之一。本文中基于MC9S12UF32單片機(jī),結(jié)合開(kāi)源文件系統(tǒng)FatFS,設(shè)計(jì)實(shí)現(xiàn)了使用FAT文件系統(tǒng)的大容量數(shù)據(jù)存儲(chǔ)模塊。

1 系統(tǒng)結(jié)構(gòu)

數(shù)據(jù)存儲(chǔ)系統(tǒng)框架如圖1所示。該數(shù)據(jù)存儲(chǔ)模塊以Freescale公司的 MC9S12UF32為核心,串行通信接口SCI接收到的數(shù)據(jù)可以直接通過(guò)單片機(jī)以FAT文件的形式存儲(chǔ)在micro SD卡中。用戶(hù)程序可以通過(guò)編程控制單片機(jī),直接對(duì)micro SD卡中的任意文件進(jìn)行讀寫(xiě),實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)。由于實(shí)現(xiàn)了FAT文件系統(tǒng),用戶(hù)也可以通過(guò)單片機(jī)內(nèi)置的USB接口將本數(shù)據(jù)模塊識(shí)別為U盤(pán),用 PC機(jī)進(jìn)行讀寫(xiě)操作。此外,模塊中的SD卡也可以取出,使用標(biāo)準(zhǔn)的讀卡器可在任何PC機(jī)上讀出。

2 硬件結(jié)構(gòu)及底層函數(shù)的編寫(xiě)

本文所介紹的數(shù)據(jù)存儲(chǔ)插件由 MC9S12UF32、DS12887實(shí)時(shí)鐘模塊、micro SD卡、串行通信接口以及USB接口5部分組成。實(shí)時(shí)時(shí)鐘,可以為數(shù)據(jù)存儲(chǔ)模塊的文件系統(tǒng)提供正確的時(shí)間戳信息,在精簡(jiǎn)的系統(tǒng)設(shè)計(jì)中,這個(gè)部分則可以省略。

圖1 系統(tǒng)框架

2.1 MC9S12UF32單片機(jī)

Freescale公司生產(chǎn)的這款16位單片機(jī)具有3.5 KB RAM和32 KB Flash EEPROM。它最大的特點(diǎn)在于擁有USB2.0接口、ATA5接口以及 SD/MMC、SmartMedia、MemoryStick等多種存儲(chǔ)卡接口。本文所介紹的數(shù)據(jù)存儲(chǔ)插件采用MC9S12UF32單片機(jī)內(nèi)部集成的SD主控制器模塊(SDHC)實(shí)現(xiàn)micro SD卡的底層讀寫(xiě)。

(1)SDHC模塊

SD1.0規(guī)范協(xié)議中定義了對(duì)SD卡的兩種訪問(wèn)模式:SD模式和SPI模式。使用SDHC(Secured Digital card Host Controller)模塊對(duì)SD卡讀寫(xiě)采用了SD模式。該模塊將SD總線轉(zhuǎn)換為MC9S12UF32內(nèi)部的IPBus總線或者IQUE總線,使用者只需要對(duì)SDHC模塊相關(guān)的寄存器進(jìn)行配置,就可以實(shí)現(xiàn)向SD卡發(fā)送各種命令和讀寫(xiě)數(shù)據(jù)的功能。SD卡與SDHC的連接如圖2所示。MC9S12UF32內(nèi)部集成的 SDHC模塊支持SD卡1.0版本的物理層協(xié)議,所以本系統(tǒng)使用標(biāo)準(zhǔn) micro SD卡(而非SDHC卡),其存儲(chǔ)容量最大為2G。這樣的存儲(chǔ)容量已經(jīng)完全可以滿(mǎn)足大多數(shù)嵌入式應(yīng)用的需求。

(2)MC9S12UF32與SD卡之間的數(shù)據(jù)傳輸

在完成對(duì)時(shí)鐘頻率和傳輸數(shù)據(jù)線寬度的配置之后,通過(guò)發(fā)送相應(yīng)的讀寫(xiě)命令就可以實(shí)現(xiàn)單片機(jī)與SD卡之間的數(shù)據(jù)傳輸了。在單片機(jī)向SD卡寫(xiě)入數(shù)據(jù)的過(guò)程中,編程者將需要寫(xiě)入的數(shù)據(jù)寫(xiě)入SDHC模塊的SDATA寄存器(16位)之后,該數(shù)據(jù)將被轉(zhuǎn)移至發(fā)送數(shù)據(jù)FIFO中。與此同時(shí),只要發(fā)送數(shù)據(jù)FIFO非空,其中的數(shù)據(jù)就會(huì)不斷地通過(guò)數(shù)據(jù)線被寫(xiě)入SD卡的相應(yīng)位置。在單片機(jī)從SD卡中讀取數(shù)據(jù)的過(guò)程中,SD卡中的數(shù)據(jù)將不斷發(fā)送至接收數(shù)據(jù)FIFO中。只要接收FIFO非空,單片機(jī)就可以不斷地通過(guò)讀SDATA寄存器得到接收數(shù)據(jù)FIFO中的數(shù)據(jù)。

圖2 SD卡與SDHC的連接

2.2 DS12887實(shí)時(shí)鐘模塊

DS12887模塊使用數(shù)據(jù)/地址復(fù)用的并行異步總線,可以為單片機(jī)提供100年以?xún)?nèi)的實(shí)時(shí)鐘信息(年/月/日/時(shí)/分/秒)。它內(nèi)部具有石英晶振和鋰電源,首次使用時(shí),需要對(duì)該模塊內(nèi)部的寄存器進(jìn)行相應(yīng)配置,激活晶振使其進(jìn)入工作狀態(tài)。由于DS12887內(nèi)部帶有鋰電源,所以一旦晶振被激活,即使外部掉電,該模塊依然可以保存并提供正確的實(shí)時(shí)鐘信息。

設(shè)定DS12887的時(shí)間和從DS12887中讀取時(shí)間信息的底層程序比較簡(jiǎn)單,只需參照芯片手冊(cè)對(duì)寄存器進(jìn)行合理配置。但是,需要特別注意的是,在寫(xiě)時(shí)鐘和讀取時(shí)鐘之前需要鎖存時(shí)鐘信息相關(guān)的buffer,防止在讀寫(xiě)過(guò)程中由于出現(xiàn)時(shí)鐘信息自動(dòng)更新情況而導(dǎo)致的錯(cuò)誤。系統(tǒng)中,在每次讀寫(xiě)實(shí)時(shí)鐘之前,查詢(xún)DS12887內(nèi)部控制寄存器A最高位UIP是否為0,以避免上述錯(cuò)誤的產(chǎn)生。因?yàn)樾酒謨?cè)中給出,一旦UIP=0,那么在244 μ s內(nèi)實(shí)時(shí)鐘模塊都不會(huì)自動(dòng)更新當(dāng)前的時(shí)鐘信息,而這段時(shí)間足以讓單片機(jī)完成讀寫(xiě)實(shí)時(shí)鐘的過(guò)程。

3 FatFs文件系統(tǒng)的移植與配置

3.1 FatFs軟件包簡(jiǎn)介

采用文件系統(tǒng),是為了在單片機(jī)能夠?qū)D卡進(jìn)行數(shù)據(jù)讀寫(xiě)的同時(shí),保證其讀寫(xiě)的數(shù)據(jù)能夠被大多數(shù)通用設(shè)備識(shí)別。換言之,數(shù)據(jù)在存儲(chǔ)器內(nèi)的組織型式,需要遵循一些已有的工業(yè)標(biāo)準(zhǔn)和規(guī)范。例如使用FAT文件系統(tǒng),數(shù)據(jù)存儲(chǔ)單元的SD卡取下來(lái)后,可以使用任何標(biāo)準(zhǔn)的讀卡器在Windows、Linux等PC機(jī)上讀出。

當(dāng)前著名的嵌入式文件系統(tǒng)有若干種選擇,比如EFSL(Embedded File system Library)、uC/FS 、/TinyFatFS等。這之中EFSL和FatFs都是開(kāi)放源碼的,具有十分詳盡的文檔和函數(shù)手冊(cè),除錯(cuò)更新也十分及時(shí),在本文的設(shè)計(jì)中我們采用的是FatFS。

FatFs采用使用ANSI C編寫(xiě),具有很好的硬件平臺(tái)獨(dú)立性,使用者只需要對(duì)源程序進(jìn)行簡(jiǎn)單的修改和配置,就可以將其移植到各種系列的單片機(jī)上。此外,它的內(nèi)存開(kāi)銷(xiāo)很小,ROM的占有量在十幾KB的量級(jí),使用者可以根據(jù)不同的應(yīng)用方便的對(duì)代碼進(jìn)行裁減。FatFs支持FAT12、FAT16和FAT32,可以建立獨(dú)立的緩沖區(qū)對(duì)多個(gè)文件進(jìn)行讀寫(xiě)。FatFs是一個(gè)不斷更新完善的軟件,大量的相關(guān)信息可以從原作者的主頁(yè)上得到(http://elmchan.org/fsw/ff/00index_e.html),同時(shí)原作者也做了很多性能測(cè)試的工作。

3.2 FatFs的移植

可從FatFS的主頁(yè)上下載得到FatFs R0.07版本。FatFs的主程序包含 5個(gè)文件,即diskio.c、diskio.h、ff.c、ff.h和integer.h。其中,diskio.c和diskio.h是與底層硬件I/O相關(guān)的函數(shù);ff.c和ff.h是應(yīng)用函數(shù),主要涉及FatFs的配置和裁減;而integer.h中定義了FatFs軟件所使用的各種數(shù)據(jù)類(lèi)型。

移植FatFs的過(guò)程中基本不需要對(duì)diskio.h和ff.c進(jìn)行修改。除了核實(shí)integer.h中的數(shù)據(jù)類(lèi)型定義是否與MC9S12U32數(shù)據(jù)類(lèi)型相符之外,移植的重點(diǎn)工作在于diskio.c中6個(gè)主要函數(shù)的實(shí)現(xiàn)和ff.h中對(duì)于文件系統(tǒng)的裁減配置。dikio.c包含的6個(gè)接口函數(shù):disk_initialize,disk_status,disk_ioctl,disk_read,disk_write和disk_fattime。它們分別實(shí)現(xiàn)存儲(chǔ)介質(zhì)的初始化、讀取/寫(xiě)入若干個(gè)扇區(qū)的數(shù)據(jù)和獲取實(shí)時(shí)鐘信息的功能。

具體移植過(guò)程如下:

(1)存儲(chǔ)媒介初始化函數(shù)

DSTATUS disk_initialize(BYTE drv)

由于采用的存儲(chǔ)媒介是SD卡,所以該函數(shù)的實(shí)際功能是對(duì)SD卡進(jìn)行初始化。drv是存儲(chǔ)介質(zhì)號(hào)碼,由于Tinv-FatFs只支持一個(gè)存儲(chǔ)介質(zhì),所以此處drv始終取0值。執(zhí)行無(wú)誤,則返回值=0;執(zhí)行中出現(xiàn)錯(cuò)誤,則返回非0值。

(2)狀態(tài)檢測(cè)函數(shù)

DSTATUS disk_status(BYTE drv)

該函數(shù)用于檢測(cè)是否支持當(dāng)前的存儲(chǔ)介質(zhì)。此處的drv仍然恒為0。對(duì)Tiny-FatFs而言,只要drv為0,就認(rèn)為支持當(dāng)前介質(zhì),函數(shù)直接返回0值即可。

(3)讀扇區(qū)函數(shù)

DRESULT disk_read(BYTE drv,BYTE*buff,DWORD sector,BYTE.count)

該函數(shù)是在“單片機(jī)從SD卡讀取一個(gè)扇區(qū)”的函數(shù)基礎(chǔ)上編寫(xiě)而成的,其功能是從SD卡讀取一個(gè)或多個(gè)扇區(qū)的數(shù)據(jù)。*buff用于存儲(chǔ)已經(jīng)讀取的數(shù)據(jù),sector是待讀取扇區(qū)的起始扇區(qū)數(shù),count是需要讀取的扇區(qū)數(shù)。如果執(zhí)行無(wú)誤則返回0值,否則返回非0值。

(4)寫(xiě)扇區(qū)函數(shù)

DRESULT disk_write(BYTE drv,const BYTE*buff,DWORD sector,BYTE count)

與disk_read相似,該函數(shù)是在“單片機(jī)向SD卡寫(xiě)入一個(gè)扇區(qū)”的函數(shù)基礎(chǔ)上編寫(xiě)而成的,其功能是向SD卡導(dǎo)入一個(gè)或多個(gè)扇區(qū)的數(shù)據(jù)。*buff用于保存將要寫(xiě)入的數(shù)據(jù),sector是待寫(xiě)入扇區(qū)的起始扇區(qū)數(shù),count是需要寫(xiě)入的扇區(qū)數(shù)。如果執(zhí)行無(wú)誤則返回0值,否則返回非0值。

(5)存儲(chǔ)介質(zhì)控制函數(shù)

DRESULT disk_ioctl(BYTE drv,BYTE ctrl,VoiI*buff)

ctrl是控制代碼,*buff用于保存或接收需要控制的數(shù)據(jù)數(shù)據(jù)。使用者可以在此函數(shù)里添加自己需要的功能代碼,例如獲得存儲(chǔ)介質(zhì)的容量、扇區(qū)數(shù)等。如果是簡(jiǎn)單的應(yīng)用,也可以不執(zhí)行任何功能,直接返回0值。本文采用的就是這一方法。

(6)實(shí)時(shí)鐘函數(shù)

DWORD disk_fattime(Void)

該函數(shù)將讀取的實(shí)時(shí)鐘信息保存在一個(gè)32位無(wú)符號(hào)整數(shù)中,并將其作為函數(shù)的返回值。時(shí)鐘信息在這32位中的具體分布如表1所列。

表1 返回值DWORD中包含的時(shí)鐘信息

3.3 FatFs的裁減與配置Tiny-FatFs

FatFs提供了豐富的庫(kù)函數(shù),可以實(shí)現(xiàn)創(chuàng)建、讀取文件夾,創(chuàng)建、讀寫(xiě)文件,移動(dòng)文件指針,向文件中寫(xiě)入或讀取字符串,甚至是類(lèi)似與C語(yǔ)言fprintf()的格式化輸入等各種功能。使用者可以根據(jù)自己的需求設(shè)置相應(yīng)的宏,對(duì)FatFs進(jìn)行裁減,僅保留需要的功能函數(shù),從而精簡(jiǎn)文件系統(tǒng)的內(nèi)存開(kāi)銷(xiāo)。FatFs提供的函數(shù)與宏的對(duì)應(yīng)關(guān)系如圖3所示。

圖3 FatFs提供的庫(kù)函數(shù)

FatFs的裁減,不僅僅是函數(shù)層面的。更重要的是,在內(nèi)部機(jī)制上形成一個(gè)精簡(jiǎn)版本,稱(chēng)為T(mén)iny-FatFs。它與標(biāo)準(zhǔn)版FatFs相比,主要的區(qū)別在于Tiny-FatFs僅支持一個(gè)物理存儲(chǔ)介質(zhì),而且不再針對(duì)每個(gè)開(kāi)啟的文件建立512字節(jié)的緩存,整個(gè)文件系統(tǒng)和物理介質(zhì)使用同一個(gè)緩存。顯然,Tiny-FatFs需要的內(nèi)存開(kāi)銷(xiāo)比標(biāo)準(zhǔn)版FatFs更低,只要1 KB左右的RAM??梢哉f(shuō),Tiny-FatFs是專(zhuān)門(mén)為小型嵌入式系統(tǒng)而設(shè)計(jì)的文件系統(tǒng)模塊。本文介紹的數(shù)據(jù)存儲(chǔ)系統(tǒng)使用的正是Tiny-FatFs版本。

在表2中,對(duì)ff.h中主要配置宏的含義進(jìn)行了說(shuō)明,同時(shí)給出了本文所介紹的數(shù)據(jù)存儲(chǔ)模塊采用的取值。

表2 ff.h中的主要參數(shù)配置說(shuō)明

4 FatFs文件系統(tǒng)的使用

FatFs文件系統(tǒng)中涉及2個(gè)基本的數(shù)據(jù)結(jié)構(gòu):文件系統(tǒng)(磁盤(pán))的數(shù)據(jù)結(jié)構(gòu)FATFS和文件的數(shù)據(jù)結(jié)構(gòu)FIL。這兩個(gè)結(jié)構(gòu)是FatFs軟件主要的RAM開(kāi)銷(xiāo),FATFS數(shù)據(jù)結(jié)構(gòu)中有針對(duì)磁盤(pán)的512字節(jié)讀寫(xiě)緩存,FIL則有針對(duì)每個(gè)文件的緩存。而采用Tiny FatFS配置則不會(huì)開(kāi)設(shè)文件讀寫(xiě)緩存,節(jié)約RAM。

依次使用f_mount、f_open、f_read/f_write、f_close 可以完成基本的讀寫(xiě)。FatFs允許對(duì)同一文件同時(shí)復(fù)數(shù)讀取,但完全不支持對(duì)同一文件同時(shí)復(fù)數(shù)的寫(xiě)入操作,因?yàn)檫@會(huì)引起文件系統(tǒng)錯(cuò)誤。具體每一個(gè)函數(shù),特別是字符串讀寫(xiě)、格式化讀寫(xiě)等,可以參見(jiàn)原始幫助和例程。

此外,由于嵌入式系統(tǒng)具有突然掉電的可能性,一些關(guān)鍵代碼段可能導(dǎo)致文件系統(tǒng)錯(cuò)誤,所以要注意調(diào)用f_sync()及時(shí)寫(xiě)入。當(dāng)然,如果是一組連續(xù)的f_write()寫(xiě)入,而每次寫(xiě)完都f_sync(),則會(huì)極大地影響速度,可以全部寫(xiě)完后f_sync()。

V0.07以后版本的FatFS,增加了以下新的功能:

①_FS_TINY。Tiny模式變成了一個(gè)宏選項(xiàng),而不是獨(dú)立的代碼包。

②_FS_RPATH。決定是否有當(dāng)前路徑的概念,這將影響兩個(gè)相關(guān)函數(shù)的參數(shù)。

③_USE_LFN。啟用長(zhǎng)文件名支持,可為1或2,為2時(shí)可重入。由于長(zhǎng)文件名存在堆棧上,而且啟用LFN會(huì)依據(jù)代碼頁(yè)增加一個(gè)很大的轉(zhuǎn)換表,占掉幾十~幾百KB,所以不推薦。

④_LFN_UNICODE。長(zhǎng)文件名使用Unicode,實(shí)驗(yàn)階段,尚未正式寫(xiě)入文檔。

結(jié) 語(yǔ)

MC9S12UF32單片機(jī)內(nèi)部集成的 SDHC模塊,可將SD總線轉(zhuǎn)換為單片機(jī)內(nèi)部的IP總線,開(kāi)發(fā)者只需要對(duì)SD協(xié)議的基本內(nèi)容有所了解,通過(guò)讀寫(xiě)相應(yīng)的寄存器就可以方便地實(shí)現(xiàn)對(duì)SD卡的底層讀寫(xiě),大大簡(jiǎn)化了硬件的開(kāi)發(fā)過(guò)程。同時(shí),獨(dú)立于硬件平臺(tái)的FatFs軟件包可以方便地移植到各種嵌入式系統(tǒng)中,研發(fā)者只需要對(duì)該軟件包的diskio.c和 ff.h進(jìn)行修改,即可完成移植,從而使用FatFs提供的豐富且易于使用的各種接口函數(shù)。

應(yīng)用上述主要技術(shù)實(shí)現(xiàn)的具有嵌入式文件系統(tǒng)的數(shù)據(jù)模塊如圖4所示。

圖4 數(shù)據(jù)存儲(chǔ)模塊實(shí)物圖

該模塊體積小巧、存儲(chǔ)數(shù)據(jù)的靈活性和通用性很高,可以通過(guò)模塊自帶的串行通信接口接收數(shù)據(jù),并以文件的形式存儲(chǔ)起來(lái)。用戶(hù)既可以直接通過(guò)USB接口將本模塊識(shí)別為U盤(pán)進(jìn)行數(shù)據(jù)讀寫(xiě)和分析,也可以將micro SD卡拔出,在任意一個(gè)具有micro SD讀卡器功能的設(shè)備上讀寫(xiě)數(shù)據(jù)。上述功能特性使得這款數(shù)據(jù)存儲(chǔ)模塊具有很良好的應(yīng)用前景。

[1]Motorola Inc.MC9S12UF32 System on a Chip Guide V01.04,2004.

[2]Dallas Semiconductor.DS12887 Real-Time Clock.

猜你喜歡
存儲(chǔ)模塊存儲(chǔ)介質(zhì)扇區(qū)
分階段調(diào)整增加扇區(qū)通行能力策略
Burden of Cirrhosis and Other Chronic Liver Diseases Caused by Specific Etiologies in China, 1990?2016:Findings from the Global Burden of Disease Study 2016
檔案館移動(dòng)存儲(chǔ)介質(zhì)管理方法探討
U盤(pán)故障排除經(jīng)驗(yàn)談
一種使用存儲(chǔ)介質(zhì)驅(qū)動(dòng)的方式
雷達(dá)內(nèi)嵌式偵測(cè)信號(hào)高速數(shù)據(jù)存儲(chǔ)系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)
數(shù)據(jù)采集系統(tǒng)在環(huán)保工程中的應(yīng)用研究
基于貝葉斯估計(jì)的短時(shí)空域扇區(qū)交通流量預(yù)測(cè)
重建分區(qū)表與FAT32_DBR研究與實(shí)現(xiàn)
彈載數(shù)據(jù)存儲(chǔ)模塊抗高過(guò)載防護(hù)技術(shù)研究