Cortex-M4原理與實(shí)踐實(shí)驗(yàn)報(bào)告_第1頁(yè)
Cortex-M4原理與實(shí)踐實(shí)驗(yàn)報(bào)告_第2頁(yè)
Cortex-M4原理與實(shí)踐實(shí)驗(yàn)報(bào)告_第3頁(yè)
Cortex-M4原理與實(shí)踐實(shí)驗(yàn)報(bào)告_第4頁(yè)
Cortex-M4原理與實(shí)踐實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Cortex-M4原理與實(shí)踐實(shí)驗(yàn)報(bào)告

題目:MicroSD卡操作實(shí)驗(yàn)

作者姓名

指導(dǎo)教師

專業(yè)班級(jí)自動(dòng)化1901

學(xué)院信息工程學(xué)院

提交日期交21年12月14日

一、實(shí)驗(yàn)?zāi)康?/p>

1.了解FAT文件系統(tǒng)原理。

2.了解MicroSD卡的原理與控制方式。

3.學(xué)習(xí)TM4C129xSeriesCortex-M4的同步串口QSSI操作方式。

4.學(xué)習(xí)QSSI相關(guān)庫(kù)函數(shù)的使用。

二、實(shí)驗(yàn)設(shè)備

1.計(jì)算機(jī)一臺(tái),操作系統(tǒng)為WindosXP或Windos7,裝有CCSvll.O軟件。

2.EK-TM4C1294XL實(shí)驗(yàn)開(kāi)發(fā)板一塊。

3.USB連接線一條。

三、實(shí)驗(yàn)原理和流程

1.FAT文件系統(tǒng)原理簡(jiǎn)介

FAT文件起源于70年代末80年代初,用于微軟的MS-DOS操作系統(tǒng)。它

開(kāi)始被設(shè)計(jì)成一個(gè)簡(jiǎn)單的文件系統(tǒng)用于小于500K的軟件盤。后來(lái)被功能被大

大增強(qiáng)用于支持越來(lái)越大的媒質(zhì)。現(xiàn)在的文件系統(tǒng)有FAT12,FAT16和FAT32

三種子類。本實(shí)驗(yàn)所用的FatFs是用于小型嵌入式系統(tǒng)的通用FAT文件系統(tǒng)。

FatFs服從ANSIC標(biāo)準(zhǔn),并且完全和磁盤10脫離。能編入資源有限的小型

微處理器,像AVR,8051,PIC,ARM等等。

FatFs模塊擁有以下主要特性:

兼容Windows的FAT文件系統(tǒng);

包括DBCS在內(nèi)的多種ANSI/0EM字符集和字符編碼方案;

在ANSI/0EM或Unicode下,支持長(zhǎng)文件名;

支持實(shí)時(shí)時(shí)鐘;

支持多種扇區(qū)大小。

FatFs模塊是一個(gè)文件系統(tǒng)層,完全和諸如存儲(chǔ)三,硬盤以及其他任何種類的存

儲(chǔ)器件分離下圖1顯示了文件層和其他層之間的關(guān)系。

圖1文件層和其他層關(guān)系

2.MicroSD卡的原理與控制方式簡(jiǎn)介

MicroSDCard原名TF卡(Trans-flashCard)2004年正式更名為Micro

SDCard,由SanDisk(閃迪)公司發(fā)明,被廣泛應(yīng)用于手機(jī),PDA,數(shù)碼相機(jī),

MP3等等移動(dòng)電子產(chǎn)品°MicroSD卡體積小,容量大,相比傳統(tǒng)Flash存儲(chǔ)元

件,MicroSD卡在設(shè)計(jì)與制造上有諸多優(yōu)勢(shì),例如:

相同的尺寸大小,可以有多種不同的容量;

采用片上控制器,不需要主機(jī)的內(nèi)存管理,并且將軟件開(kāi)發(fā)從ECC和磨

損均衡中分離;

無(wú)縫內(nèi)存組件技術(shù)的轉(zhuǎn)變;

采用行業(yè)標(biāo)準(zhǔn)串口,將風(fēng)險(xiǎn)最小化(增加向下兼容);

空前的可升級(jí)性和靈活性;

節(jié)省片上資源。

MicroSD卡有8個(gè)引腳,2種工作方式,分別為SD模式,和SPI模式,

本實(shí)驗(yàn)采用相對(duì)簡(jiǎn)單的SP1工作模式,電路原理圖如下圖2所示。SD卡可

以通過(guò)SPI接口或者GPTO模擬SPI方式和大多數(shù)微控制器相連,適用于低

開(kāi)銷嵌入式應(yīng)用。在SPT模式下,信號(hào)線上的數(shù)據(jù)方向是固定的,并且數(shù)據(jù)以

字節(jié)為單位傳輸。從主機(jī)到TF卡的命令幀是一個(gè)固定長(zhǎng)度的數(shù)據(jù)包,占6個(gè)

字節(jié),如下圖3所示,一般叫做CMDx或ACMDxo當(dāng)將D0置高,TF卡準(zhǔn)備好

接收命令幀,接收完成后,從卡返回一個(gè)應(yīng)答信號(hào)。命令參數(shù)占4個(gè)字節(jié),不

是所有的命令都有參數(shù)。每次發(fā)送完一個(gè)命令后,SD卡都會(huì)有回應(yīng),回應(yīng)有多

種格式,1字節(jié)的Rl,2字節(jié)的R2等,一般在SPI模式下,我們只用到Rio

當(dāng)R1返回的值為0x00時(shí),說(shuō)明操作成功,否則,出現(xiàn)對(duì)應(yīng)的錯(cuò)誤,R1對(duì)應(yīng)

錯(cuò)誤如下圖4所示。

g

PA3/SSI0FSS_S(XS_-csw

PA5/SSI0TX_SDDI

VDD

PA2/SSI0CLK_SDCLKCLK

vsgs

PA4/SSI0RX_SECQ_------------------

8

+3.3V

—^R7

->10K

-^O.lUF

I

圖2SD卡電腦原理圖

SCLK

DO

圖3SD命令幀格式

R1Response

Q|IIIIIII

?—InIdleState

-------EraseReset

-------llligalCommand

----------------CommandCRCError

--------------------EiaseSequenseError

I------------AddiessError

I--------------ParameterError

圖4R1返回對(duì)應(yīng)錯(cuò)誤

對(duì)SD卡操作要注意幾點(diǎn):

1)SD卡的SPT總線,在讀入數(shù)據(jù)時(shí)SD卡的SPI是CLK的上升沿輸入

鎖存,輸出數(shù)據(jù)也是在上升沿;

2)寫(xiě)CMD命令過(guò)程為先拉低CS使能SD卡,其次在SD卡的DIN寫(xiě)入

指令,并附加8個(gè)填充時(shí)鐘,使SD卡完成內(nèi)部操作,之后在SD卡的D0UT

上接受回應(yīng),回應(yīng)接受完畢使CS為低電平,再附加8個(gè)填充時(shí)鐘;

3)在SD卡的D:N沒(méi)有數(shù)據(jù)寫(xiě)入時(shí),應(yīng)使DIN保持高電平。

3.TM4C129xSeriesCortex-M4的同步串口QSSI工作原理與方式

1294有4個(gè)同步串行接口(QSSI,Quad-SynchronousSerialInterface)

模塊,所有4個(gè)模塊都支持單SSI,雙SSI接口,也支持4SSI接口增強(qiáng),

以提供更快的數(shù)據(jù)吞吐能力。QSSI模塊作為與外設(shè)同步串口通信的主或從接

口,例如FreescaleSPI,或者TI同步串行接口。發(fā)送和接收采用內(nèi)部獨(dú)立

FIFO緩沖器,允許存儲(chǔ)最多8個(gè)16位的值。CPU能獲取這些數(shù)據(jù),也能獲

取QSST的控制和狀態(tài)信息。QSST模塊也提供了DMA接口,允許在uDMA模

式下設(shè)置發(fā)送和接收FIFO作為源或目的地址。

QSSI模塊有以下主要特性:

4路QSSI通道,都支持單SSI,雙SS:利4ssi功能;

可編程的時(shí)鐘頻率和預(yù)分頻器;

數(shù)據(jù)幀大小從4位到16位可編程:

標(biāo)準(zhǔn)FIFO中斷和發(fā)送結(jié)束中斷;

采用UDMA控制器高效地傳輸數(shù)據(jù);

輸出時(shí)鐘頻率定義為:SSInClk=SysClk/(CPSDVSRX(1+SCR)),其

中,SysCLK或ALTCLK作為SSInCLK的時(shí)鐘源,CPSDVSR為預(yù)分頻寄存器

(SSICPSR)中的值,從2到254,SCR是SSI控制寄存器0(SSICRO)中的

值,從0到255o圖5為SSI模塊框圖。

DMARequestDMAControl

SSIDMACTL

Interrupt

<■

TxFIFO

SSIIM8x16

SSIMIS

SSIRIS

SSIICR

Control/Status

SSI0XDAT3

SSICROSSInXDAT2

SSICR1

SSISR

SSInXDAT1/RX

SSIDRTransmit/

Receive

LogicSSInXDATO/TX

RxFIFO

8x16SSInCHt

SSInFss

ClockControl

SystemClock

SSICC

ALTCLK

SSIBaudClock

IdentificationRegisters

SSIPCeWDOSSIPedphlDOSSIPeriphlD4

SSIPCellDISSIPeriphlDISSIPeriphlD5

SSIPCeWD2SSIPenphlD?-SSIPenphlD6

SSIPCellD3SSIPeriphlD3SSIPeriphlD7

圖5ssi模塊框圖

4.實(shí)驗(yàn)用到的主要庫(kù)函數(shù)簡(jiǎn)介

voidSSIConfigSctExpClk(uint32_tui32Base,uint32_tui32SSIClk,

uint32_tui32Protocol,uint32_tui32Mode,

uint32_tui32BitRate,

uint32_tui32DataWidth)

函數(shù)用于配置SS:的工作模工3ui32Base為SSI模塊的基地址;

ui32SSTClk是SST模塊的時(shí)鐘頻率;ui32Protocol指定傳輸協(xié)議例如

SSI_FRF_MOTO_MODE_O.SSI_FRF_TI;ui32Mode指定SSI模塊工作于主模式

還是從模式;ui32BitRate指定傳輸?shù)臅r(shí)鐘頻率;ui32DataWidth指定傳輸數(shù)

據(jù)幀的數(shù)據(jù)寬度,可以為4~16中間的數(shù)字。

voidSSlEnable(uint32_tui32Base)函數(shù)用于使能SS1模塊,ui32Base

為SST模塊的基地址.

voidSSIDataPut;uint32_tui32Base,uint32_tui32Data)函數(shù)用于輸出

一個(gè)數(shù)據(jù)到FIFOoui32Basc為SSI模塊的基地址;ui32Data為需要輸出的

數(shù)據(jù)。

voidSSIDataGet;uint32_tui32Base,uint32_t*pui32Data)函數(shù)用于從

接收FIFO中獲取一個(gè)數(shù)據(jù)。ui32Base為SSI模塊的基地址;*pui32Data

為指向數(shù)據(jù)接收的地址。

5.簡(jiǎn)化的SSI模塊配置步驟

四、實(shí)驗(yàn)代碼、注釋

實(shí)驗(yàn)代碼:

、卜V,、>,、>、>7/、、>,、>7/、>>、

一.、rT?KIZ7,,v卜iz》J、.x[i、*:*/、z,?卜A*,1、■?、V■v1i、z1*A、z,sji、*?A*??TA?*xl*,*;A、z??1?*?,7卜/,\J;、z(、.?;A、*:、,v[l、*rs?i?*?;、?v卜iz<*?、z?*卜lz(x'、z,?[A、*i*?sTi*x■,、*VJ、■*]J、z:?A、Z■*[1、*:*i、z,*卜j1、*,卜■,、,卜,v;i、z“4、,.s[i、*:*i、*vizKSZ,s(l、z.*卜1**Az■vi卜z:?5、z,v卜iz一?A.、*,*卜1*v.?t、z,S[*、*j、,]、K.,1、Z7/■vi卜z/、?*;l、zrj*,?卜Jzx,tz卜*2,?J、z

//

//sd_card.c-ExampleprogramforreadingfilesfromanSDcard.

//

//Copyright(c)2011TexasInstrumentsIncorporated.Allrightsreserved.

//SoftwareLicenseAgreement

//

//TexasInstruments(TI)issupplyingthissoftwareforusesolelyand

//exclusivelyonTI'smicrocontrollerproducts.Thesoftwareisownedby

//TIand/oritssuppliers,andisprotectedunderapplicablecopyright

//laws.Youmaynotcombinethissoftwarewith,viral"open-source

//softwareinordertoformalargerprogram.

//

//THISSOFTWAREISPROVIDED"ASIS"ANDWITHAllFAULTS.

//NOWARRANTIES,WHETHEREXPRESS,IMPLIEDORSTATUTORY,INCLUDING,BUT

//NOTLIMITEDTO,IMPLIEDWARRANTIESOFMERCHANTABILITYANDFITNESSFOR

//APARTICULARPURPOSEAPPLYTOTHISSOFTWARE.TISHALLNOT,UNDERANY

//CIRCUMSTANCES,BELIABLEFORSPECIAL,INCIDENTAL,ORCONSEQUENTIAL

//DAMAGES,FORANYREASONWHATSOEVER.

//

//Thisispartofrevision8049oftheEK-LM4F232FirmwarePackage.

//

#include<string.h>

#include<stdint.h>

^include<stdbool.h>

#includez,inc/hw_memmap.h,z

^include“inc/hw_types,h”

#include"driverlib/fpu.h"

Sinclude"driverlib/gpio.h"

#includez,driverlib/interrupt.hw

^include^drivcrlib/rom.h,z

^include"driverlib/sysctl.h"

#include"driver1ib/systick,h”

#include"driveriib/pin_map.h"

#include"grlib/grlib.h"

Sinclude“utils/cmdlin已h”

#include“utiIs/uartstdio.h"

^include^thirdparty/fatfs/sre/ff.h,z

#includethird_party/fatfs/src/diskio.h,z

^include"driverlib/ssi.h"

Sinclude"driveriib/rom_map.h"

#includeZ,TFTinit/TFT_100x240_0TM4001A_16bit.h"

^include"EPIinit/EPIinit.h"

#ifndefM_PI

^defineM_P13.I4159265358979323846F

ttendif

uint32_tgui32SysClock;

^definePATHBUFSIZE80

SdefineCMDBUFSIZE64

staticcharg__cCwdBuf'[PATHBUF_SIZE]="/

staticcharg_cTmpBuf[PATH_BUF_SIZE];

staticchargcCmdBuf[CMDBUb_SlZt];

staticFATFSg_sFatFs;

staticDIRg_sDirObject;

staticFILINFOg_sFileInfo;

staticFILgsFileObject;

typedefstruct

{

FRESULTfresult;

char*pcResultStr;

}

tFresultString;

defineFRESULT_ENTRY(f){(f),(#f)}

tFresultStringg_sFresultStrings[]=

FRESUI/r_ENTRY(FRJ)K),

FRESULT_ENTRY(FR_DISK_ERR),

FRESULT_ENTRY(FR_INT_ERR),

FRESULTENTRY(FRNOTREADY),

FRESULT_ENTRY(FRNO_FILE),

FRESULT_ENTRY(FR_N0_PATH),

FRESULT_ENTRY(FR_INVALID_NAME),

FRESULT_ENTRY(FR_DENIED),

FRESULT_ENTRY(FR_EXIST),

FRESULT.ENTRY(FR_INVALID_OBJECT),

FRESULT_ENTRY(FRWRITE_PROTECTED),

FRESULT_ENTRY(FR_INVALID_DRIVE),

FRESULT_ENTRY(FR_NDT_ENABLED),

FRESULT_ENTKY(FILNO_FILESYSTEM),

FRESULT_ENTRY(FR_MKFS_ABORTED),

FRESULT_ENTRY(FR_TIMEOUT),

FKtSlL1_EMKY(EKLOCKED),

FRESULT_ENTRY(FR_NOT_ENOUGH_CORE),

FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES),

FRESULTENTRY(FR_INVALIDPARAMETER)

};

#defineNUMFRESULTCODES(sizeof(gsFresultStrings)/sizeof(tFresultString))

tContcxtgsContcxt;

constchar*

StringFromFresult(FRESULTfresult)

(

unsignedintuldx;

for(uldx=0;uldx<NUM_FRESULT_CODES;uldx++)

(

if(gsFresultStrings[uldx].fresult==frcsult)

(

return(g_sFresultStrings[uldx].pcResultStr);

}

)

return("UNKNOWNERRORCODE");

)

void

SysTickHandler(void)

(

disk_timerproc();

}

int

Cmd_ls(intargc,char*argv口)〃顯示文件列表

(

unsignedlongulTotalSize;

unsignedlongulFileCount;

unsignedlongulDirCount;

FRESULTfresult;

FATFS*pFatFs;

fresult=f_opendir(&g_sDirObject,g_cCwdBuf);

if(fresult!=FROK)

(

rcturn(fresult);

)

ulTotalSize=0;

ulFileCount=0;

ulDirCount=0;

UARTprintf("\n");

for(::)

(

fresult=f_readdir(&g_sl)irObject,&g_sFi1eInfo);

if(fresult!=FR_OK)

(

return(fresult);

)

if(!g_sFileInfo.fname[0])

(

break;

)

if(g_sFileInfo.fattrib&AM_DIR)

(

ulDirCount++;

)

else

(

ulFileCount++;

ulTotalSize+=g_sb'ilelnfo.fsize;

)

UARTprintfC%c%c%c%c%c%u/%02u/%02u%02u:%02u%9u%s\n?,,

(g_sFileInfo.fattrib&AMDIR)?'D'

(g_sFileInfo.fattrib&AMRDO)?'R'

(g_sFileInfo.fattrib&AM_HID)?'H'

(g_sFildnfo.fattrib&AM_SYS)?'S'

(g_sFilelnfo.fattrib&AMARC)?'A'

(g.sFilelnfo.fdate?9)+1980,

(g_sFilelnfo.fdate?5)&15,

gsFilelnfo.fdate&31,

(g_sFileInfo.ftime?11),

(g_sFileInfo.ftime?5)&63,

gsFildnfo.fsize,

g_sFilelnfo.fname);

)

UARTprintf(z,\n%4uFile(s),%10ubytestotal\n%4uDir(s)

ulFileCount,ulTotalSize,ulDirCount);

fresult=f_getfree&ulTotalSize,&pFatFs);

if(fresult!=FROK)

(

return(fresult);

)

UARTprintf(",%10uKbytesfree\n",ulTotalSize*pFatFs->csize/2);

ieturn(0);

)

int

Cmd_cd(intargc,char*argv口)

unsignedintuldx;

FRESULTfresult;

strcpy(g_cTmpBuf,g_cCwdBuf);

if(argv[l][0]=='/')

if(strlen(argv[l])+1>sizeof(g_cCwdBuf))

(

UARTprintf(""Resultingpathnameistoolong\nw);

return(0);

)

else

(

strncpy(gcTmpBuf,argv[l],sizeof(gcTmpBuf));

)

)

elseif(Istrcmp(argv[l],

{

uldx=strlen(g_cTmpBuf)-1;

while((g_cTmpBuf[uIdx]!=’/')&&(uldx>1))

(

uldx一;

}

g_cTrnpBuf[uldx]=0;

)

else

{

if(strlen(gcTmpBuf)+strlen(argv[l])+1+1>sizeof(gcCwdBuf))

(

UARTprintf(^Resultingpathnameistoolong'n");

return(0);

)

else

if(strcmp(g_cTmpBuf,"/"))

strcat(g_cTmpBuf,"/");

strcat(gcTmpBuf,argv[1]);

)

fresult=f_opendir(&g_sDirObject,g_cTmpBuf);

if(fresult!=FR_OK)

{

UARTprintf(^cd:g_cTmpBuf):

return(fresult);

strnepy(gcCwdBuf,gcTmpBuf,sizeof(gcCwdBuf));

return(0);

Cmd_pwd(intargc,char*argv[])

UARTpiiulf(/,%5\n/,,g_uCwdBuf);

return(0);

Cmd_cat(intargc,char*argv口)〃讀取文本文件的內(nèi)容,打印到控制臺(tái)

卜RESULTfresult;

unsignedintusBytesRead;

if(strlen(g_cCwdBuf)+strlen(argv[l])+1+1>sizeof(g_cTmpBuf))

(

UARTprintf(*Resultingpathnameistoolong\n^);

return(0);

)

strcpy(gcTmpBuf,gcCwdBuf);

if(strcmp(*/*,g_cCwdBuf))

{

strcat(g^cTmpBuf,;

)

strcat(g_cTmpBuf,argv[1]):

fresult=fopcn(&g_sFi1eObjcct,gcTmpBuf,FAREAD);

if(fresult!=FR_OK)

{

return(fresult);

)

do

(

fresult=frcad(ftgsFiIcObjcct,gcTmpBuf,sizeof(gcTmpBuf)-1,

&usBytesRead);

if(fresult!=FR_OK)

(

UARTpiiulfC*Xir);

return(fresult);

)

g_cTmpBuf[usBytesRead]=0;

UARTprintfg_cTmpBuf);

)

while(usBytesKead==sizeof(g_cTmpBuf)-1);

return(0);

)

int

Cmdhelp(intargc,char*argv口)〃幫助命令

(

tCmdLincEntry*pEntry;

UARTprintf(^XnAvaitablecommands\nz,);

UARTprintfC----------------------\n");

pEntry=&g_psCmdTable[0];

while(pEntry->pcCmd)

{

UARTprintf("%s$s\n",DEntry->pcCmd,pEntry->pcHelp):

pEntry++;

)

return(0);

}

tCmdLineEntrygpsCmdTablet]=

(

{"help”,Cmdhclp,”:Displaylistofcommands"),

(〃h〃,Cmdhclp,:aliasforhelp"},

{”?〃,Cmd_help,:aliasforhelp"},

{“l(fā)s〃,Cmd_ls.:Displaylistoffiles"),

{“chdir”,Cmd_cd.”:Changedirectory"},

{3,Cmdcd::aliusforuhdii*},

{〃pwd〃,Cmdpwd,”:Showcurrentworkingdirectory"),

{"cat”,Cmdcat,”:Showcontentsofatextfile"),

{0,0,0)

};

#ifdefDEBUG

void

error_(char*pcFilename,unsignedlongulLine)

)

#endif

void

ConfigureUART(void)

(

SysCt1Periphera1Enab1e(SYSCTL_PERIPH_GPiOA);

SysCtlPeripheralEnab1e(SYSCTL.PERIPH_UARTO);

GPIOPinConfigure(GPIOPAOUORX);

GPIOPinConfigureCGPIOPAIUOTX);

GPIOPinTypeLART(GPIO_PORTA_BASE,GPIO_PIN_OIGPIO_PIN_1):

UARTStdioConfig(0,115200,g_ui32SysClock);

}

int

main(void)

(

intnStatus;

FRESULTfresult;

/*應(yīng)該啟用FPU,因?yàn)橛行┚幾g器將使用浮點(diǎn)寄存器,即使對(duì)于非浮點(diǎn)代碼也是如此。

*如果未啟用FPU,則會(huì)導(dǎo)致故障。這也確保了浮點(diǎn)操作可以添加到此應(yīng)用程序中,

*并且可以正常工作并使用硬件浮點(diǎn)單元。最后,為中斷處理程序啟用了延遲堆棧。

*這允許在中斷處理程序中使用浮點(diǎn)指令,但要犧牲額外的堆棧使用。*/

FPUEnableO;

FPULazyStackingEnableO;

//從鎖相環(huán)以120兆赫的頻率運(yùn)行。

g_ui32SysClock=SysCtIClockFreqSet((SYSCTL_XTAL_25MHZ|

SYSCTL_()SC_MAIN|SYSCTL_USE_PLL|

SYSCTL_CFG_VC0_480),120000000);

〃啟用此示例使用的外圍設(shè)備。

〃為100赫茲中斷配置SysTick。

ROMSysTickPeriodSet(gui32SysClock/100);

ROMSysTickEnableO;

ROMSysTicklntEnable();

〃啟用中斷

ROMIntMasterEnable();

ConfigureUARTO;〃UART初始化

UARTprintf(z/\n\nSDCardExampleProgram'll");

UARTprintf("Type\'help、'forhelp.\n");

//使用邏輯磁盤0裝載文件系統(tǒng)。

fresult=f_mount(0,&g_sFatFs):

if(frcsult!=FROK)

(

UARTprintf(,zf_mounterror:%s\n”,StringFromEresult(fresult));

return(1);

)

whi1e(1)

(

//向控制臺(tái)打印提示。顯示CM)。

UARTprintf(w\n%s>〃,g_cCwdBuf);

//從用戶處獲取一行文本。

UARTgets(g_cCmdBuf,sizeof(g_cCmdBuf));

〃將行從用戶傳遞到命令處理器。它將被解析并執(zhí)行有效的命令。

nStatus=CmdLineProcess(gcCmdBuf);

〃處理命令錯(cuò)誤的情況。

if(nStatus==CMDLINE_BAD_CMD)

UARTprintf(,zBadcommand!\n");

}

〃處理參數(shù)過(guò)多的情況。

elseif(nStatus==CMDLINE_TOO_mY_ARGS)

(

UARTprintfC^Toomanyargumentsforcommandprocessor!\n?/);

)

〃否則命令被執(zhí)行。如果返回錯(cuò)誤代碼,則打印錯(cuò)誤代碼。

elseif(nStatus!=0)

(

UARTprini『("Commandreturnederrorcode%s\n”,

StringFromFresult((FRESULT)nStatus));

}

)

}

實(shí)驗(yàn)現(xiàn)象:

程序運(yùn)行后,在串口調(diào)試助手顯示相應(yīng)的字符串,輸入對(duì)應(yīng)的字符,會(huì)顯示

不同的內(nèi)容,顯示結(jié)果如下:

■山外零功能ilS試助手VI.1.9

串口網(wǎng)試助手部彘車助手GSM謂試助手GPS3:位系統(tǒng)網(wǎng)絡(luò)調(diào)試f

審口配置接收區(qū):共接收5787字節(jié),速度。字節(jié)/秒。共發(fā)送18字彳

戰(zhàn)n??

波特隼:1,2匚?/>help

做據(jù)立:8_

Availablecoa>ands

停止立:」■help:Displaylistofcoa>ards

關(guān)閉串口h:aliasforhelp

?:aliasforhelp

□新開(kāi)不提示出Is:Displaylistoffiles

團(tuán)出錯(cuò)看連chdir:Changedirectory

cd:aliasforchdir

出口鋪助pvd:Shovcurrentworkingdirectory

cat:Shovcontentsofatextfile

口16進(jìn)制顯示

五、思考題

1、嘗試編寫(xiě)嘗試將發(fā)送到UART上的信息,顯示在液晶屏上。

實(shí)驗(yàn)代碼:

intCmdls(intargc,char*argv[])

{

unsignedlongulTotalSize;

unsignedlonguIEi1eCounI;

unsignedlongulDirCount;

FRESULTfresult;

FATFS*pFatFs;

//

//Openthecurrentdirectoryforaccess.

//

fresult=fopendir(&g_sDirObject,gcCwdBuf);

//

//Checkforerrorandreturnifthereisaproblem.

//

ifCfresult!=FR_OK)

(

return(fresult):

)

ulTotalSize=0;

ulFileCount=0;

ulDirCount=0;

//

//Giveanextrablanklinebeforethelisting.

//

UARTprintfC\n");

zz+=16;

//

//Enterlooptoenumeratethroughalldirectoryentries.

//

for(;;)

(

//

//Readanentryfromthedirectory.

//

fresult=f_readdir(&g_sDirObject,&g_sbileinfo);

//

//Checkforerrorandreturnifthereisaproblem.

//

if(fresult!=FR_OK)

(

return(fresult);

}

//

//Ifthefilenameisblank,thenthisistheendofthelisting.

//

if(!g_sFileInfo.fname[0])

(

break;

}

//

//Iftheattribueisdirectory,thenincrementthedirectorycount.

//

if(gsFilelnfo.fattrib&AMDIR)

(

ull)irCount++;

)

//

//Otherwise,itisafile.Incrementthefilecount,andaddinthe

//filesizetollielolal.

//

else

(

ulFileCount++;

ulTotalSize+=g_sFileInfo.fsize;

}

//

//Printtheentryinformationonasinglelinewithformattingtoshow

//theattributes,date,time,size,andname.

//

UARTprintf("%c%c%c%c%c%u/%02u/%02u%02u:%02u%9u%s\n”,

(gsFilelnfo.fattrib&AM_DIR)?,D,

(g_sFilelnfo.fattrib&AM_RD0)?'R'

(g_sFileInfo.fattrib&AM_HID)?'H'

(g_sFilelnfo.fattrib&AM.SYS)?'S'

(gsFilelnfo.fattrib&AMARC)?'A'

(gsFilelnfo.fdate?9)+1980,

(g_sFilelnfo.fdate?5)&15,

g_sFilelnfo.fdate&31,

(g_sFilelnfo.ftime?11),

(g_sFileInfo.ftime?5)&63,

gsFilelnfo.fsize,

gsFilelnfo.fname);

TFTLCDShowChar(0,zz,((gsFilelnfo.fattrib&AM_DIR)?'D'

?),CYAN,LIGHTBLUE);

TFTLCD_ShowChar(0+8,zz((g_sEilelnfo.fattrib&AM_RDO)?'R'

3,CYAN,LIGHTBLUE);

TFTLCD_ShowChar(0+16,zz((gsFilelnfo.fattrib&AMHID)?'H,:,

'),CYAN,LIGHTBLLE);

TFTLCDShowChiir(0+24,zz,((g_sFilelnfo.fallrib&AMSYS)?‘S'

J),CYAN,LIGHTBLUE);

TFTLCDShowChar(0+32,zz,((gsFildnfo.fattrib&AM_ARC)?'A':

J,CYAN,LIGHTBLUE);

TFTLCD_Showl)ata(0+40,zz(g_sFilelnfo.fdate?9)

1980,CYAN,LIGHTBLUE);

mLCD_ShowChar(0+80,zz,'/',CYAb,LIGHTBLUE);

TFTLCD_ShowData(0+88,zz,(g.sFilelnfo.fdate?5)&15,CYAN,LIGHTBLUE);

TFTLCD_ShowChar(0+128,zz,'/',CYAN,LIGHTBLUE);

TFTLCDShowData(0+136,zz,g_sFileInfo.fdate&31,CYAN,LIGHTBLUE);

TFTLCD_ShowData(0+160,zz,(g_sFileInfo.ftimc?11),CYAN,LIGHTBLUE);

TFTLCD_ShowChar(0+168,zz,':',CYAN,LIGHTBLUE);

TFTLCD_ShowData(0+174,zz,(g.sFilelnfo.ftime?5)&63,CYAN,LIGIITBLUE);

zz+=16;

TFTLCD_ShowData(0,zz,g.sFilelnfo.fsize,CYAN,LIGHTBLUE);

TFTLCD_ShowString(0+88,zz,g_sFileInfo.fname,CYAN,LIGHTBLUE);

zz+=16;

)

//

//Printsummarylinesshowingthefile,dir,andsizetotals.

//

UARTprintf(z,\n%4uFile(s),%10ubytestotal\nMuDir(s)”,

ulFileCount,ulTotalSize,ulDirCount);

TFTLCD_ShowData(0,zz,ulFileCount,CYAN,LIGHTBLLE);

TFTLCD_ShowString(10,zz,"File(s),”,CYAN,LIGHTBLUE);

TFTLCD_ShowData(96;zz,ulTotalSize,CYAN,LIGHTBLUE);

TF7LCD_ShowString(136,zz,〃bytestotal",CYAN,LIGHTBLUE);

zz+=16;

TFTLCD_ShowData(0,zz,ulDirCount,CYAN,LIGHTBLUE);

TFTLCDShowString(40,zz,"Dir(s)\CYAN,LIGHTBLLE);

//

//Getthefreespace.

//

fresult=&ulTotalSize,&pFatFs);

//

//Checkforerrorandreturnifthereisaproblem.

//

if(fresult!=FR_OK)

return(fresult);

)

//

//Displaytheamountoffreespacethatwascalculated.

//

UARTprintf(z,,%10uKbytesfree\n",ulTotalSize*pFatFs->csize/2);

TFTLCD_ShowData(100,zz,ulTotalSize*pFatFs->csize

2/10000,CYAN,LIGHTBLUE);

TFTLCD_ShowData(140,zz,(ulTotalSize*pFatFs->csize

2)%10000.CYAN,LIGHTBLUE):

TFTLCD_ShowString(180,zz,bytesfree”,CYAN,LIGHTBLUE);

zz+=16;

//

//Madeittohere.returnwithnoerrors.

//

return(0);

}

int

Cmdcd(intargc,char*argv[])

(

unsignedintuldx;

FRESULTfrcsult;

//

//Copythecurrentworkingpathintoatemporarybuffersoitcanbe

//mcinipulated.

//

strcpy(g_cTmpBuf,g_cCwdBuf);

//

//Ifthefirstcharacteris/,thenthisisafullyspecifiedpath,andit

//shouldjustbeusedas-is.

//

if(argv[l][0]=='/')

{

//

//Makesurethenewpathisnotbiggerthanthecwdbuffer.

//

if(strlen(argv[l])+1>sizeof(gcCwdBuf))

(

UARTprintf(''Resultingpathnameistoolong'n");

TFTLCD_ShowString(0,zz,^Resultingpathnameistoo

long”,CYAN,LIGHTBLUE);

zz+=16;

return(0);

)

//

//Ifthenewpathname(inargv[l])isnottoolong,thencopyit

//intothetemporarybuffersoitcanbeche

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論