




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Cortex-M4原理與實踐實驗報告
題目:MicroSD卡操作實驗
作者姓名
指導教師
專業班級自動化1901
學院信息工程學院
提交日期交21年12月14日
一、實驗目的
1.了解FAT文件系統原理。
2.了解MicroSD卡的原理與控制方式。
3.學習TM4C129xSeriesCortex-M4的同步串口QSSI操作方式。
4.學習QSSI相關庫函數的使用。
二、實驗設備
1.計算機一臺,操作系統為WindosXP或Windos7,裝有CCSvll.O軟件。
2.EK-TM4C1294XL實驗開發板一塊。
3.USB連接線一條。
三、實驗原理和流程
1.FAT文件系統原理簡介
FAT文件起源于70年代末80年代初,用于微軟的MS-DOS操作系統。它
開始被設計成一個簡單的文件系統用于小于500K的軟件盤。后來被功能被大
大增強用于支持越來越大的媒質。現在的文件系統有FAT12,FAT16和FAT32
三種子類。本實驗所用的FatFs是用于小型嵌入式系統的通用FAT文件系統。
FatFs服從ANSIC標準,并且完全和磁盤10脫離。能編入資源有限的小型
微處理器,像AVR,8051,PIC,ARM等等。
FatFs模塊擁有以下主要特性:
兼容Windows的FAT文件系統;
包括DBCS在內的多種ANSI/0EM字符集和字符編碼方案;
在ANSI/0EM或Unicode下,支持長文件名;
支持實時時鐘;
支持多種扇區大小。
FatFs模塊是一個文件系統層,完全和諸如存儲三,硬盤以及其他任何種類的存
儲器件分離下圖1顯示了文件層和其他層之間的關系。
圖1文件層和其他層關系
2.MicroSD卡的原理與控制方式簡介
MicroSDCard原名TF卡(Trans-flashCard)2004年正式更名為Micro
SDCard,由SanDisk(閃迪)公司發明,被廣泛應用于手機,PDA,數碼相機,
MP3等等移動電子產品°MicroSD卡體積小,容量大,相比傳統Flash存儲元
件,MicroSD卡在設計與制造上有諸多優勢,例如:
相同的尺寸大小,可以有多種不同的容量;
采用片上控制器,不需要主機的內存管理,并且將軟件開發從ECC和磨
損均衡中分離;
無縫內存組件技術的轉變;
采用行業標準串口,將風險最小化(增加向下兼容);
空前的可升級性和靈活性;
節省片上資源。
MicroSD卡有8個引腳,2種工作方式,分別為SD模式,和SPI模式,
本實驗采用相對簡單的SP1工作模式,電路原理圖如下圖2所示。SD卡可
以通過SPI接口或者GPTO模擬SPI方式和大多數微控制器相連,適用于低
開銷嵌入式應用。在SPT模式下,信號線上的數據方向是固定的,并且數據以
字節為單位傳輸。從主機到TF卡的命令幀是一個固定長度的數據包,占6個
字節,如下圖3所示,一般叫做CMDx或ACMDxo當將D0置高,TF卡準備好
接收命令幀,接收完成后,從卡返回一個應答信號。命令參數占4個字節,不
是所有的命令都有參數。每次發送完一個命令后,SD卡都會有回應,回應有多
種格式,1字節的Rl,2字節的R2等,一般在SPI模式下,我們只用到Rio
當R1返回的值為0x00時,說明操作成功,否則,出現對應的錯誤,R1對應
錯誤如下圖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返回對應錯誤
對SD卡操作要注意幾點:
1)SD卡的SPT總線,在讀入數據時SD卡的SPI是CLK的上升沿輸入
鎖存,輸出數據也是在上升沿;
2)寫CMD命令過程為先拉低CS使能SD卡,其次在SD卡的DIN寫入
指令,并附加8個填充時鐘,使SD卡完成內部操作,之后在SD卡的D0UT
上接受回應,回應接受完畢使CS為低電平,再附加8個填充時鐘;
3)在SD卡的D:N沒有數據寫入時,應使DIN保持高電平。
3.TM4C129xSeriesCortex-M4的同步串口QSSI工作原理與方式
1294有4個同步串行接口(QSSI,Quad-SynchronousSerialInterface)
模塊,所有4個模塊都支持單SSI,雙SSI接口,也支持4SSI接口增強,
以提供更快的數據吞吐能力。QSSI模塊作為與外設同步串口通信的主或從接
口,例如FreescaleSPI,或者TI同步串行接口。發送和接收采用內部獨立
FIFO緩沖器,允許存儲最多8個16位的值。CPU能獲取這些數據,也能獲
取QSST的控制和狀態信息。QSST模塊也提供了DMA接口,允許在uDMA模
式下設置發送和接收FIFO作為源或目的地址。
QSSI模塊有以下主要特性:
4路QSSI通道,都支持單SSI,雙SS:利4ssi功能;
可編程的時鐘頻率和預分頻器;
數據幀大小從4位到16位可編程:
標準FIFO中斷和發送結束中斷;
采用UDMA控制器高效地傳輸數據;
輸出時鐘頻率定義為:SSInClk=SysClk/(CPSDVSRX(1+SCR)),其
中,SysCLK或ALTCLK作為SSInCLK的時鐘源,CPSDVSR為預分頻寄存器
(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.實驗用到的主要庫函數簡介
voidSSIConfigSctExpClk(uint32_tui32Base,uint32_tui32SSIClk,
uint32_tui32Protocol,uint32_tui32Mode,
uint32_tui32BitRate,
uint32_tui32DataWidth)
函數用于配置SS:的工作模工3ui32Base為SSI模塊的基地址;
ui32SSTClk是SST模塊的時鐘頻率;ui32Protocol指定傳輸協議例如
SSI_FRF_MOTO_MODE_O.SSI_FRF_TI;ui32Mode指定SSI模塊工作于主模式
還是從模式;ui32BitRate指定傳輸的時鐘頻率;ui32DataWidth指定傳輸數
據幀的數據寬度,可以為4~16中間的數字。
voidSSlEnable(uint32_tui32Base)函數用于使能SS1模塊,ui32Base
為SST模塊的基地址.
voidSSIDataPut;uint32_tui32Base,uint32_tui32Data)函數用于輸出
一個數據到FIFOoui32Basc為SSI模塊的基地址;ui32Data為需要輸出的
數據。
voidSSIDataGet;uint32_tui32Base,uint32_t*pui32Data)函數用于從
接收FIFO中獲取一個數據。ui32Base為SSI模塊的基地址;*pui32Data
為指向數據接收的地址。
5.簡化的SSI模塊配置步驟
四、實驗代碼、注釋
實驗代碼:
、卜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口)〃讀取文本文件的內容,打印到控制臺
卜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"},
{“ls〃,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;
/*應該啟用FPU,因為有些編譯器將使用浮點寄存器,即使對于非浮點代碼也是如此。
*如果未啟用FPU,則會導致故障。這也確保了浮點操作可以添加到此應用程序中,
*并且可以正常工作并使用硬件浮點單元。最后,為中斷處理程序啟用了延遲堆棧。
*這允許在中斷處理程序中使用浮點指令,但要犧牲額外的堆棧使用。*/
FPUEnableO;
FPULazyStackingEnableO;
//從鎖相環以120兆赫的頻率運行。
g_ui32SysClock=SysCtIClockFreqSet((SYSCTL_XTAL_25MHZ|
SYSCTL_()SC_MAIN|SYSCTL_USE_PLL|
SYSCTL_CFG_VC0_480),120000000);
〃啟用此示例使用的外圍設備。
〃為100赫茲中斷配置SysTick。
ROMSysTickPeriodSet(gui32SysClock/100);
ROMSysTickEnableO;
ROMSysTicklntEnable();
〃啟用中斷
ROMIntMasterEnable();
ConfigureUARTO;〃UART初始化
UARTprintf(z/\n\nSDCardExampleProgram'll");
UARTprintf("Type\'help、'forhelp.\n");
//使用邏輯磁盤0裝載文件系統。
fresult=f_mount(0,&g_sFatFs):
if(frcsult!=FROK)
(
UARTprintf(,zf_mounterror:%s\n”,StringFromEresult(fresult));
return(1);
)
whi1e(1)
(
//向控制臺打印提示。顯示CM)。
UARTprintf(w\n%s>〃,g_cCwdBuf);
//從用戶處獲取一行文本。
UARTgets(g_cCmdBuf,sizeof(g_cCmdBuf));
〃將行從用戶傳遞到命令處理器。它將被解析并執行有效的命令。
nStatus=CmdLineProcess(gcCmdBuf);
〃處理命令錯誤的情況。
if(nStatus==CMDLINE_BAD_CMD)
UARTprintf(,zBadcommand!\n");
}
〃處理參數過多的情況。
elseif(nStatus==CMDLINE_TOO_mY_ARGS)
(
UARTprintfC^Toomanyargumentsforcommandprocessor!\n?/);
)
〃否則命令被執行。如果返回錯誤代碼,則打印錯誤代碼。
elseif(nStatus!=0)
(
UARTprini『("Commandreturnederrorcode%s\n”,
StringFromFresult((FRESULT)nStatus));
}
)
}
實驗現象:
程序運行后,在串口調試助手顯示相應的字符串,輸入對應的字符,會顯示
不同的內容,顯示結果如下:
■山外零功能ilS試助手VI.1.9
串口網試助手部彘車助手GSM謂試助手GPS3:位系統網絡調試f
審口配置接收區:共接收5787字節,速度。字節/秒。共發送18字彳
戰n??
波特隼:1,2匚?/>help
做據立:8_
Availablecoa>ands
停止立:」■help:Displaylistofcoa>ards
關閉串口h:aliasforhelp
?:aliasforhelp
□新開不提示出Is:Displaylistoffiles
團出錯看連chdir:Changedirectory
cd:aliasforchdir
出口鋪助pvd:Shovcurrentworkingdirectory
cat:Shovcontentsofatextfile
口16進制顯示
五、思考題
1、嘗試編寫嘗試將發送到UART上的信息,顯示在液晶屏上。
實驗代碼:
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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家具水濂柜供貨合同5篇
- 專業設計服務項目績效評估報告
- 非臨床安全性評價服務項目績效評估報告
- 信息化教學大賽方案設計
- 中華優傳統文化 課件 第五章 中國傳統哲學
- 婦科疾病超聲診斷應用與規范
- 2025西安建筑科技大學華清學院輔導員考試試題及答案
- 2025貴州護理職業技術學院輔導員考試試題及答案
- 2025石家莊信息工程職業學院輔導員考試試題及答案
- 衛生院安全培訓
- 人教版小學數學四年級下冊課件:《平均數》課件
- 棗莊事業單位統一招聘考試真題
- 高考語文作文:二元關系分析類思辨作文
- 《教育心理學(第3版)》全套教學課件
- 【年產2000噸色氨酸發酵工廠的計算與設計(附布置圖流程圖)15000字(論文)】
- 2024年倉儲、物流等貨物管理員資格知識考試題庫(附含答案)
- 提高病人吸氧的依從性品管圈
- DL∕T 1917-2018 電力用戶業擴報裝技術規范
- 邊溝施工技術交底滑模
- 向最高檢察院提起申訴書范文
- 網孔電流法 (1)講解
評論
0/150
提交評論