基于STM32F103XX微處理器的Micr0 SD卡讀寫
摘要:基于STM32F103XX微控制器的遠(yuǎn)程智能心臟檢測(cè)儀采用Micro SD作為存儲(chǔ)介質(zhì)保存特定的心電信號(hào)。所存Micro SD卡中的存儲(chǔ)數(shù)據(jù)要能夠在計(jì)算機(jī)上直接存取,需要存儲(chǔ)的數(shù)據(jù)以FAT32文件格式寫入Micro SD卡。研究了使用STM32F103XX微處理器,采用SPI模式與Micro SD接口,將數(shù)據(jù)寫入Micro SD的軟件方法及硬件設(shè)計(jì)。采用的FAT開源文件系統(tǒng)FATFS是專門為小型嵌入式系統(tǒng)而設(shè)計(jì)的,容易移值和使用,占用硬件資源相對(duì)較小而且功能強(qiáng)大。
關(guān)鍵詞:STM32F1103XX;Micro SD;SPI;FATFS
O 引言
由于遠(yuǎn)程智能心臟檢測(cè)儀器對(duì)采集到的心電信號(hào)是實(shí)時(shí)處理與存儲(chǔ)的。因此,本文在STM32F103XX微處理器的基礎(chǔ)上,采用Micro SD存儲(chǔ)卡實(shí)現(xiàn)了關(guān)鍵心電信號(hào)的存儲(chǔ)。
1 硬件電路設(shè)計(jì)
1.1 STM32F103xx微處理器簡(jiǎn)介
STM32F103XX基于高性能32位RISC的ARMCortex-M3核,工作頻率為72 MHz。片上集成了高速存儲(chǔ)器,通過(guò)APB總線連接了豐富、增強(qiáng)的外設(shè)和I/O。所有的設(shè)備都提供標(biāo)準(zhǔn)的通信接口。
1.2 SPI協(xié)議
由于SPI(setial peripheralinterface)總線占用的接口線少,通信效率高,并且支持大部分處理器芯片,因而是一種理想的選擇。SPI是利用4根信號(hào)線進(jìn)行通信的串行接口協(xié)議,包括主/從兩種模式。4個(gè)接口信號(hào)為:串行數(shù)據(jù)輸入(MISO,主設(shè)備輸入、從設(shè)備輸出)、串行數(shù)據(jù)輸出(MOSI,主設(shè)備輸出、從設(shè)備輸入)、移位時(shí)鐘(SCK)、低電平有效的從設(shè)備使能信號(hào)(cs)。SPI最大的特點(diǎn)是由主設(shè)備時(shí)鐘信號(hào)的出現(xiàn)與否來(lái)確定主/從設(shè)備間的通信。一旦檢測(cè)到主設(shè)備的時(shí)鐘信號(hào),數(shù)據(jù)開始傳輸。
1.3 Micro SD卡簡(jiǎn)介
Micro SD卡的接口可以支持2種操作模式:SDIO模式和SPI模式。設(shè)計(jì)者可以選擇其中任一模式。SDIO模式允許4線的高速數(shù)據(jù)傳輸,傳輸速率高,但是大部分微控制器無(wú)此接口,使用軟件模擬協(xié)議復(fù)雜。SPI模式使用簡(jiǎn)單通用的SPI通道接口,即可實(shí)現(xiàn)數(shù)據(jù)傳輸,目前大多數(shù)微控制器都提供SPI接口。SPI模式相對(duì)于SDIO模式的缺點(diǎn)是損失了傳輸速度,但目前微處理器的處理速度越來(lái)越高,利用SPI模式大多都能滿
足工程需要。
Micro SD卡要求用全雙工、8位的SPI操作。STM32F103XX微處理器和Micro SD卡之間只需要4根信號(hào)線就可以完成數(shù)據(jù)的讀/寫,當(dāng)CS片選信號(hào)線為低電平時(shí),微處理器開始所有的總線傳輸。數(shù)據(jù)從微處理器的MOSI引腳同步輸入Micro SD卡的DI引腳,并由Micro SD卡的DO線同步輸入微處理器的MISO引腳,數(shù)據(jù)在CLK信號(hào)的上升沿同步輸入和輸出。在每個(gè)數(shù)據(jù)傳輸?shù)慕Y(jié)尾還必須提供8個(gè)額外的時(shí)鐘,以允許Micro SD卡完成任何未完結(jié)的操作。另外,使用SPI模式時(shí),為了防止在無(wú)卡接入或卡驅(qū)動(dòng)器呈高阻態(tài)時(shí)總線懸空,根據(jù)SD卡規(guī)范,這些信號(hào)需要在微處理器端用10~100 kΩ的上拉電阻,其硬件連接電路如圖1所示。
[!--empirenews.page--]
2 軟件設(shè)計(jì)
軟件設(shè)計(jì)一部分是基于STM32固件庫(kù),該固件庫(kù)針對(duì)基于ARM的32位微處理STM32F101XX和STM32F103XX。其中,包括程序、數(shù)據(jù)結(jié)構(gòu)和覆蓋所有外設(shè)特性的宏單元,還包括設(shè)備驅(qū)動(dòng)的描述以及每個(gè)外圍模塊的實(shí)例。因此,使用該固件庫(kù)可以節(jié)省許多時(shí)間,將更多的時(shí)間花費(fèi)在編程方面,從而減少了在應(yīng)用開發(fā)中的綜合開銷。
2.1 Micro SD卡初始化為SPI總線模式
STM32F103XX微處理器包括2個(gè)串行外設(shè)接口(SPI),可以方便地對(duì)Micro SD卡接口進(jìn)行配置。首先對(duì)要用到的SPIl接口采用命令SPI_In-it(SPIl,&SPI_InitStructure)進(jìn)行初始化,并使能SPIl。
剛上電時(shí),Micro SD卡缺省使用專有的SD總線協(xié)議,將Micro SD卡切換到SPI模式,主機(jī)需要發(fā)出命令CMDO(GO-IDLE-STATE)。Micro SD卡會(huì)檢測(cè)到SPI模式選擇信息,因?yàn)榭ㄟx擇(CS)引腳在該命令和其他所有SPI命令傳送過(guò)程中都保持為低電平,故MicroSD卡以R1作為響應(yīng),空閑狀態(tài)位被置為高電平,此時(shí)MicrlO SD卡進(jìn)入空閑狀態(tài),此階段的SPI時(shí)鐘頻率不能超過(guò)400 kHz。Micro SD卡進(jìn)入SPI模式后,主機(jī)應(yīng)該先發(fā)一條初始化指令CMD1(ActiVates the card process),此時(shí)可將SPI頻率設(shè)置為高速模式。然后發(fā)送命令CMD59決定是否開啟CRC校驗(yàn),設(shè)置讀/寫塊數(shù)據(jù)長(zhǎng)度,最后延遲8個(gè)時(shí)鐘后返回。Micro SD初始化流程如圖2所示。
2.2 Micro SD卡讀寫單塊數(shù)據(jù)
從Micro SD卡中讀取一個(gè)數(shù)據(jù)塊只需要主機(jī)發(fā)送CMD17(MSD_READ_SINGLE_BLOCK)命令,并將起始地址作為參數(shù)(此地址必須和介質(zhì)上一個(gè)塊的起始位置對(duì)齊),然后Micro SD卡會(huì)驗(yàn)證這個(gè)字節(jié)地址,并以一個(gè)R1命令作為響應(yīng)。在完成Micro SD卡讀取操作后,先發(fā)送一個(gè)起始數(shù)據(jù)命令,接著發(fā)送固定數(shù)量的數(shù)據(jù),最后是2個(gè)字節(jié)CRC校驗(yàn)。讀取一個(gè)數(shù)據(jù)塊由函數(shù)u8 MSD_ReadBlock(u8*pBuffer,u32 ReadAddr,u16 NumByteToRead)來(lái)完成,pBuffer是一個(gè)指針,它指向接受Micro SD卡數(shù)據(jù)內(nèi)存緩沖區(qū)的地址,ReadAddr是要讀取數(shù)據(jù)在Micro SD卡中的地址,NumByteToRead是要讀取的字節(jié)數(shù),一般為512 B。[!--empirenews.page--]
從Micro SD卡中寫入一個(gè)數(shù)據(jù)塊與讀取數(shù)據(jù)塊相似。主機(jī)發(fā)送CMD24(MSD_WRITE_BLOCK)命令啟動(dòng)寫操作過(guò)程,Micro SD卡將以R1命令響應(yīng)格式進(jìn)行應(yīng)答。如果命令響應(yīng),則進(jìn)行寫操作,主機(jī)發(fā)送起始令牌,然后發(fā)送固定數(shù)量的數(shù)據(jù)字節(jié)(512 B),返回一個(gè)數(shù)據(jù)響應(yīng)令牌,指示需要寫入的數(shù)據(jù)是否完成,最后是2個(gè)字節(jié)的CRC校驗(yàn),寫入一個(gè)數(shù)據(jù)塊由函數(shù)u8 MSD_WriteBuffer(u8*pBuffer,u32 WriteAddr,u32 Num-ByteToWrite)來(lái)完成,向Micro SD卡寫數(shù)據(jù)函數(shù)中的參數(shù)與向Micro sD卡讀數(shù)據(jù)函數(shù)中的參數(shù)相同。讀/寫單塊數(shù)據(jù)流程如圖3所示。
2.3 Micro SD卡的文件存儲(chǔ)
由于需要Micro SD卡上的數(shù)據(jù)能夠在計(jì)算機(jī)上直接讀/寫,所以Micro SD卡文件系統(tǒng)必須與計(jì)算機(jī)的文件系統(tǒng)一致。目前常用的文件系統(tǒng)主要有微軟的FATl2,F(xiàn)ATl6,F(xiàn)AT32,NTFS,以及Linux系統(tǒng)下的 EXT2,EXT3等。由于微軟Windows的廣泛應(yīng)用,在當(dāng)前的消費(fèi)類電子產(chǎn)品中,用得最多的還是FAT文件系統(tǒng),如U盤、MP3,MP4,數(shù)碼相機(jī)等,所以找到一款容易移植和使用、占用硬件資源相對(duì)較小而功能又強(qiáng)大的FAT開源文件系統(tǒng),對(duì)于單片機(jī)系統(tǒng)設(shè)計(jì)者來(lái)說(shuō)是很重要的。所以在Micro SD卡存儲(chǔ)機(jī)制上,移植了FAT FS文件系統(tǒng)。FAT FS是一種完全免費(fèi)開源的FAT文件系統(tǒng)模塊,是專門為小型嵌入式系統(tǒng)而設(shè)計(jì)的。它完全用標(biāo)準(zhǔn)C語(yǔ)言編寫,所以具有良好的硬件平臺(tái)獨(dú)立性,可以移植到多種平臺(tái)而只需做簡(jiǎn)單的修改。需要使用者編寫移植代碼的是FAT FS提供的底層接口,包括存儲(chǔ)介質(zhì)讀/寫接口DiskIO和供給文件創(chuàng)建修改時(shí)間的實(shí)時(shí)時(shí)鐘RTC。
FAT FS Module一開始就是為了能在不同的單片機(jī)上使用而設(shè)計(jì)的,所以具有良好的層次結(jié)構(gòu),如圖4所示。最頂層是應(yīng)用層,使用者無(wú)需理會(huì)FAT FSModule的內(nèi)部結(jié)構(gòu)和復(fù)雜的FAT協(xié)議,只需要調(diào)用Module提供給用戶的一系列應(yīng)用接口函數(shù),如f-open,f-read,f- write,f-Close等就可以像在PC上讀/寫文件那樣簡(jiǎn)單。
2.3.1 文件(或目錄)創(chuàng)建
在Micro SD卡上創(chuàng)建文件(或目錄)的過(guò)程就是在文件目錄表中申請(qǐng)登記項(xiàng)的過(guò)程。首先程序要檢測(cè)文件目錄表(FDT)中是否已經(jīng)存在該文件,然后申請(qǐng)空閑的FDT 表項(xiàng)。如果存在同名的文件,則返回,創(chuàng)建文件(或目錄)失敗。申請(qǐng)F(tuán)DT表項(xiàng)成功后,程序會(huì)檢測(cè)磁盤剩余的空間是否滿足新創(chuàng)文件數(shù)據(jù)長(zhǎng)度的需要,而后尋找第一個(gè)空閑的簇號(hào),并修改對(duì)應(yīng)的FDT表項(xiàng)。根據(jù)文件的大小,不斷循環(huán)查找下一個(gè)空閑的簇,同時(shí)修改當(dāng)前FAT項(xiàng)目為下一個(gè)簇號(hào),直到最后一個(gè)FAT項(xiàng)寫入0xFFFFH,以表示文件結(jié)束。新建目錄時(shí),只需要提供函數(shù)CreateDir()函數(shù)新建目錄的目錄名,其過(guò)程和創(chuàng)建文件一樣,只是不需要提供數(shù)據(jù)相關(guān)的信息。
2.3.2 文件的讀寫
Micro SD卡上的文件都是以簇(Cluster)為單位存取的。當(dāng)讀取Micro SD卡上的文件時(shí),首先要根據(jù)文件名查找到文件加目錄登記項(xiàng)(F-DT),根據(jù)文件中目錄登記項(xiàng)中起始簇號(hào)即可以找到文件在數(shù)據(jù)DATA區(qū)中的第一簇內(nèi)容,并且可以在FAT表中找到第二個(gè)簇號(hào)。根據(jù)第二個(gè)簇號(hào)又能讀取第二簇的數(shù)據(jù)和FAT中第三個(gè)簇號(hào),這樣就可以讀取全部文件數(shù)據(jù)。寫文件時(shí)要保證 FAT1和FAT2內(nèi)容的一致性,即要對(duì)兩個(gè)FAT進(jìn)行同樣的寫操作。當(dāng)要在已有的文件中增添數(shù)據(jù)時(shí),程序首先要分析原有文件最后一個(gè)扇區(qū)還有多少剩余空閑字節(jié)數(shù),以便新添加數(shù)據(jù)與這最后一個(gè)扇區(qū)匯合,超過(guò)扇區(qū)的數(shù)據(jù)在申請(qǐng)新的空閑FAT表項(xiàng)時(shí),其過(guò)程與新建文件類似。在文件的最后一簇填寫0xFFFFH 表示文件結(jié)束。
2.3.3 文件(或目錄)的刪除
刪除文件的操作需要提供函數(shù)DeleteFile()刪除文件的文件名和擴(kuò)展名。刪除文件時(shí),不涉及數(shù)據(jù)區(qū)的操作,只須在文件的目錄登記項(xiàng)(FDT)上做一個(gè)刪除標(biāo)記,并把文件在FAT表中所占用的簇標(biāo)記為“空簇”。
程序先在FDT中查找是否有同名文件,如果存在同名文件,則將在對(duì)應(yīng)的FDT表項(xiàng)中第一個(gè)字節(jié)內(nèi)容改為0xE5H,表示該FDT表項(xiàng)的內(nèi)容已經(jīng)被刪除,新建文件可以使用該表項(xiàng)。最后還需要將FAT表中所有文件相關(guān)簇項(xiàng)目的內(nèi)容都改成Ox0000,釋放出所對(duì)應(yīng)的Micro SD卡磁盤空間。若未找到同名文件,則返回一個(gè)錯(cuò)誤值。刪除目錄的操作只需要提供函數(shù)DeleteDir()刪除目錄的目錄名。程序先在FDT中查找是否有同名目錄項(xiàng),如果存在同名目錄項(xiàng),則將對(duì)應(yīng)的FDT表項(xiàng)中第一個(gè)字節(jié)內(nèi)容改為0xE5H。然后讀出對(duì)應(yīng)目錄的起始簇號(hào),在該簇號(hào)中去刪除該目錄下的所有文件。
3 結(jié)語(yǔ)
該方案已經(jīng)成功應(yīng)用于遠(yuǎn)程智能心臟檢測(cè)儀器中,為心臟檢測(cè)儀器的數(shù)據(jù)采集提供了一種非易失性存儲(chǔ)器的解決方案,遠(yuǎn)程智能心臟檢測(cè)儀器采集得到的數(shù)據(jù)信息以FAT32標(biāo)準(zhǔn)文件的格式保存于Micro sD卡中,數(shù)據(jù)文件可在Windows下讀取,在保證高性價(jià)比的同時(shí),又方便了數(shù)據(jù)的進(jìn)一步分析和處理。