




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度大數(shù)據(jù)處理履行合同安全保密協(xié)議
- 二零二五年度電子商務(wù)運(yùn)營(yíng)咨詢費(fèi)合同
- 二零二五年度環(huán)保廣告投放與綠色營(yíng)銷合同匯編
- 二零二五年度供應(yīng)鏈金融終止協(xié)議通知函
- 二零二五年度變壓器制造技術(shù)培訓(xùn)與轉(zhuǎn)讓協(xié)議
- 二零二五年度農(nóng)村安置房租賃保證金及退還合同
- 2025年度校企深度合作人才培養(yǎng)項(xiàng)目協(xié)議書(shū)
- 建筑公司勞務(wù)合同(2025年度)勞務(wù)人員工資及福利調(diào)整協(xié)議
- 二零二五年度山東省新建商品房買賣合同預(yù)售與社區(qū)教育服務(wù)協(xié)議
- 二零二五年度高利貸借款合同金融科技賦能發(fā)展
- 蘇科版八年級(jí)物理上冊(cè)同步學(xué)與練第14課光的反射(原卷版+解析)
- 2024年上海市中考語(yǔ)文真題卷及答案解析
- 校園直飲水機(jī)供貨安裝及售后服務(wù)方案
- 廢氣處理系統(tǒng)改造及廢水處理系統(tǒng)改造項(xiàng)目可行性研究報(bào)告
- 小學(xué)全體教師安全工作培訓(xùn)
- 大學(xué)物業(yè)服務(wù)月考核評(píng)價(jià)評(píng)分表
- 現(xiàn)代家政導(dǎo)論-課件 1.1.2認(rèn)識(shí)家政學(xué)起源與發(fā)展
- 期末模擬測(cè)試卷(試卷)2024-2025學(xué)年六年級(jí)數(shù)學(xué)上冊(cè)人教版
- 2024屆護(hù)士資格考試必考基礎(chǔ)知識(shí)復(fù)習(xí)題庫(kù)及答案(共170題)
- 工業(yè)大數(shù)據(jù)算法賽項(xiàng)實(shí)際操作部分評(píng)分細(xì)則變更說(shuō)明
- 小學(xué)生防性侵安全教育主題班會(huì)課件
評(píng)論
0/150
提交評(píng)論