• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

      2010-06-22 08:17:56韓曉雪曾鳴邵貝貝
      關鍵詞:存儲模塊存儲介質扇區(qū)

      韓曉雪,曾鳴,邵貝貝

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

      引 言

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

      1 系統(tǒng)結構

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

      2 硬件結構及底層函數(shù)的編寫

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

      圖1 系統(tǒng)框架

      2.1 MC9S12UF32單片機

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

      (1)SDHC模塊

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

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

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

      圖2 SD卡與SDHC的連接

      2.2 DS12887實時鐘模塊

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

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

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

      3.1 FatFs軟件包簡介

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

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

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

      3.2 FatFs的移植

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

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

      具體移植過程如下:

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

      DSTATUS disk_initialize(BYTE drv)

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

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

      DSTATUS disk_status(BYTE drv)

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

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

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

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

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

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

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

      (5)存儲介質控制函數(shù)

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

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

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

      DWORD disk_fattime(Void)

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

      表1 返回值DWORD中包含的時鐘信息

      3.3 FatFs的裁減與配置Tiny-FatFs

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

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

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

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

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

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

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

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

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

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

      ①_FS_TINY。Tiny模式變成了一個宏選項,而不是獨立的代碼包。

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

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

      ④_LFN_UNICODE。長文件名使用Unicode,實驗階段,尚未正式寫入文檔。

      結 語

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

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

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

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

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

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

      猜你喜歡
      存儲模塊存儲介質扇區(qū)
      基于MinI0分布式存儲的微服務模塊開發(fā)應用
      分階段調整增加扇區(qū)通行能力策略
      南北橋(2022年2期)2022-05-31 04:28:07
      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
      檔案館移動存儲介質管理方法探討
      U盤故障排除經驗談
      一種使用存儲介質驅動的方式
      MiR-125a-5p is Upregulated in Plasma of Residents from An Electronic Waste Recycling Site
      數(shù)據(jù)采集系統(tǒng)在環(huán)保工程中的應用研究
      基于貝葉斯估計的短時空域扇區(qū)交通流量預測
      重建分區(qū)表與FAT32_DBR研究與實現(xiàn)
      和政县| 西乌珠穆沁旗| 淮安市| 马关县| 伊吾县| 定安县| 砀山县| 敦化市| 湄潭县| 乾安县| 阆中市| 穆棱市| 桂林市| 辛集市| 高淳县| 合川市| 北票市| 辽阳市| 仙桃市| 桐乡市| 广汉市| 韩城市| 邯郸县| 仪征市| 高碑店市| 佛冈县| 南投市| 建德市| 蒙山县| 手游| 盐亭县| 平远县| 建瓯市| 崇明县| 昭平县| 资兴市| 崇明县| 本溪| 寿光市| 萝北县| 永定县|