📄 file.c
字号:
for(Pointer=0;Pointer<512;Pointer++)
{
Page_Buf[Pointer]=*pucBlockBuf;
// *pucBlockBuf=0xff;
pucBlockBuf++;
}
WritePage(current_block,ulPageNum,Page_Buf);
}
pre_block=current_block;
current_block=ulNextBlock;
}
//------------------------------------------------------------------
// 函数名:INT8U read_file(INT8U *pucBlockBuf,INT32 lByteNum)
// 输 入: INT8U *pucBlockBuf -- Block Buffer
// INT32U lByteNum --块buffer
// 输 出: Null
// 功能描述:从当前块读取lByteNum个字节到pucBlockBuf
// 全局变量:Page_Buf
//------------------------------------------------------------------
INT8U read_file(INT8U *pucBlockBuf,INT32 lByteNum)
{
INT32U ulPageNum,Pointer;
//Uart_Printf("\nRead data,Current block is:%d",current_block);
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
ReadPage(current_block,ulPageNum,Page_Buf);
for(Pointer=0;Pointer<512;Pointer++)
{
*pucBlockBuf=Page_Buf[Pointer];
pucBlockBuf++;
lByteNum--;
if(lByteNum==0)
{
current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
return 1;
}
}
}
current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
return 1;
}
//------------------------------------------------------------------
// 函数名:INT32U ReadFileOneBlock(INT8U *pucFileBuf,INT32 OneCluster)----------------------modificated in 3.27
//功 能:将文件的一个Block读入缓冲区中并返回下一个簇号
//输 入:INT32U OneCluster:欲读出的文件的Block号
// INT8U * pucFileBuf:文件缓冲区(should be one Block size)
// 输 出:若正常结束,返回1;出错,返回0;
// 若返回值等于FAT_NO_NEXT_CLUSTER表示文件已读完;
// 全局变量:输出current_block为当前读的block,next_block为该文件下一个block号
//------------------------------------------------------------------
INT32U ReadFileOneBlock(INT8U *pucFileBuf,INT32 OneCluster)
{
INT32U ulPageNum,Pointer;
INT8U *tempval;
tempval=pucFileBuf;
current_block=OneCluster;
//Uart_Printf("\nRead data,Current block is:%d",current_block);
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
ReadPage(OneCluster,ulPageNum,Page_Buf);
for(Pointer=0;Pointer<512;Pointer++)
{
*tempval=Page_Buf[Pointer];
tempval++;
}
}
next_block=Page_Buf[512+14]*256+Page_Buf[512+15];
if (next_block>= FAT32_LAST_CLUSTER)
{
return FAT_NO_NEXT_CLUSTER;
}
else return 1;
}
//------------------------------------------------------------------
// 函数名:INT32U comp_filename(INT8U *pucString1,INT8U *pucString2)
// 输 入: INT8U *pucString1
// INT8U *pucString2
// 输 出: 0--相同
// 1--不相同
// 功能描述:比较两个文件名
// 全局变量:Null
// ***只比较短文件名
//------------------------------------------------------------------
INT32U comp_filename(INT8U *pucString1,INT8U *pucString2)
{
INT32U ulDiffNum=0;
INT32U ulNamePointer;
for(ulNamePointer=0;ulNamePointer<11;ulNamePointer++)
{
if(pucString1[ulNamePointer]!=pucString2[ulNamePointer])
ulDiffNum++;
}
return (ulDiffNum);
}
//------------------------------------------------------------------
// 函数名:INT32U find_file(INT8U *pucFileName)
// 输 入: INT8U *pucFileName --文件名
// 输 出: 该文件在DIR_Flash[ ]中的位置,即第几条记录,若输出为0xffff则表示未找到该文件
// 功能描述:查找文件在root表的位置
// 全局变量:root_buf, DIR_Flash[ ]
// 只支持短文件名当前
//------------------------------------------------------------------
INT32U find_file(INT8U *pucFileName, INT32U ulBlockNum)
{
INT32U Pointer;
INT8U *pucNameCount;
Dir(ulBlockNum, pucNameCount);
for(Pointer=0;Pointer<*pucNameCount;Pointer++)
{
if(comp_filename(&(DIR_Flash[Pointer].ucDirShortName[0]), pucFileName)==0)
return(Pointer);
}
return(0xFFFF);
}
//------------------------------------------------------------------
// 函数名:INT32U FlashWriteFile(INT8U *pucFileName, INT8U *pucFileBuf, INT32U ulFileLen, INT32U ulFlag)
// 输 入: INT8U *pucFileName --文件名
// INT8U *pucFileBuf--缓冲区指针
// INT32U ulFileLen--长度
// INT32U ulFlag--Not really used now
// 输 出: 1--成功
// 0--失败,该文件已经存在
// 功能描述:将缓冲区ulFileLen长的一段写入文件
// 全局变量:Null
//------------------------------------------------------------------
INT32U FlashWriteFile(INT8U *pucFileName, INT8U *pucFileBuf, INT32U ulFileLen, INT32U ulFlag)
{
INT32U i,ulBlockNum,ulRootLocation;
INT8U pucFileInfo[32];
ulRootLocation=find_file(pucFileName, current_block); //需要对find_file函数的长文件名修改
if(ulRootLocation!=FILE_NO_FOUND)
return 0; //This file is already exist!
else
{
ulBlockNum=ulFileLen/(16*1024);
if((ulFileLen%(16*1024))!=0)
ulBlockNum++;
for(i=0;i<32;i++) //copy the file name
{
pucFileInfo[i]=*pucFileName++;
}
pucFileInfo[31]=ulFileLen/16777216; ulFileLen%=16777216;
pucFileInfo[30]=ulFileLen/65536; ulFileLen%=65536;
pucFileInfo[29]=ulFileLen/256; ulFileLen%=256;
pucFileInfo[28]=ulFileLen;
creat_file(pucFileInfo,11,0,0); //将文件信息添加到Root information,应该修改root区,而不是创建--------changed in 3.27
for(i=0;i<ulBlockNum;i++)
{
if(i==(ulBlockNum-1))
write_file(1,pucFileBuf);
else
write_file(0,pucFileBuf);
pucFileBuf+=16*1024;
}
close_file(current_block); ////将修改后的Root information写回Block0
return 1;
}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashFileSize(INT8U *pucFileName)
// 输 入: INT8U *pucFileName --文件名
// 输 出: 文件长度
// 功能描述:获取文件大小
// 全局变量:root_buf
//------------------------------------------------------------------
INT32U FlashFileSize(INT8U *pucFileName)
{
INT32U ulRootLocation,ulFileSize;
ulRootLocation=find_file(pucFileName,current_block);
if(ulRootLocation==FILE_NO_FOUND)
return 0;
else
{
//get the file first cluster//
current_block=root_buf[ulRootLocation][27]*256+root_buf[ulRootLocation][26];
//get the file size
ulFileSize=root_buf[ulRootLocation][28]+
root_buf[ulRootLocation][29]*256+
root_buf[ulRootLocation][30]*65536+
root_buf[ulRootLocation][31]*65536*256;
}
return ulFileSize;
}
//------------------------------------------------------------------
// 函数名:INT32U FlashReadFile(INT8U *pucFileName, INT8U * pucFileBuf)
// 输 入: INT8U *pucFileName --文件名
// INT8U *pucFileBuf--缓冲区指针
// 输 出: 1--成功
// 0--失败,找不到该文件
// 功能描述:读取整个文件到缓冲区中
// 全局变量:Null
//------------------------------------------------------------------
INT32U FlashReadFile(INT8U *pucFileName, INT8U * pucFileBuf)
{
INT32U ulRootLocation;
INT32 lFileSize;
ulRootLocation=find_file(pucFileName,current_block);
if(ulRootLocation==FILE_NO_FOUND)
return 0;
else
{
//get the file first cluster//
current_block=root_buf[ulRootLocation][27]*256+root_buf[ulRootLocation][26];
//get the file size
lFileSize=root_buf[ulRootLocation][28]+
root_buf[ulRootLocation][29]*256+
root_buf[ulRootLocation][30]*65536+
root_buf[ulRootLocation][31]*65536*256;
while(1)
{
if(lFileSize<=0)
break;
else if(lFileSize<(16*1024))
read_file(pucFileBuf,lFileSize);
else
read_file(pucFileBuf,16*1024);
pucFileBuf+=16*1024; //point to next 16KB area
lFileSize-=16*1024;
current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
if(current_block==LAST_BLOCK)
break;
}
return 1;
}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashFormat(void)
// 输 入: Null
// 输 出: 1--成功
// 0--失败,找不到该文件
// 功能描述:格式化Flash
// 全局变量:Page_Buf
//------------------------------------------------------------------
INT32U FlashFormat(void)
{
INT8U VerfyBuf[528];
INT32U ulBlockNum,ulPageNum,Pointer;
/*擦除数据区*/
for(ulBlockNum=Start_Cluster;ulBlockNum<=End_Cluster;ulBlockNum++)
{
if(Erase_Block(ulBlockNum)==0)
{
/*Mark this Block with BAD flag*/
Page_Buf[512]=0x00;
WritePage(ulBlockNum,0,&Page_Buf[0]);
}
}
//verfiy if all data is 0xff
for(ulBlockNum=Start_Cluster;ulBlockNum<=End_Cluster;ulBlockNum++)
{
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
ReadPage(ulBlockNum,ulPageNum,VerfyBuf);
for(Pointer=0;Pointer<512;Pointer++)
{
if(VerfyBuf[Pointer]!=0xff)
Pointer++;
}
}
}
//将root_buf中全部写0x00//
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
for(Pointer=0;Pointer<512;Pointer++)
{
Page_Buf[Pointer]=0;
}
//独立区以0xFF填充//
for(Pointer=512;Pointer<(512+16);Pointer++)
{
Page_Buf[Pointer]=0xFF;
}
WritePage(Root_Cluster,ulPageNum,&Page_Buf[0]);
}
return 1;
}
//------------------------------------------------------------------
// 函数名:INT32U FlashRenameFile(INT8U *pucNewOldFileName)
// 输 入: INT8U *pucNewOldFileName--文件名
// 输 出: 1--成功
// 0--失败,找不到该文件
// 功能描述:修改文件名
// 全局变量:root_Buf
//------------------------------------------------------------------
INT32U FlashRenameFile(INT8U *pucNewOldFileName)
{
INT32U Pointer,i;
Pointer=find_file(pucNewOldFileName, current_block);
if(Pointer==FILE_NO_FOUND)
return 0;
else
{
for(i=0;i<11;i++)
root_buf[Pointer][i]=pucNewOldFileName[11+i];
close_file(current_block);
return 1;
}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashDelFile(INT8U *pucFileName)
// 输 入: INT8U *pucFileName--文件名
// 输 出: 1--成功
// 0--失败,找不到该文件
// 功能描述:删除文件
// 全局变量:root_Buf
//------------------------------------------------------------------
INT32U FlashDelFile(INT8U *pucFileName, INT32U ulBlockNum)
{
INT32U ulRootLocation,ulDelBlockNo,ulSrcLocation,ulDestLocation;
// get the location of this file via look for its file name in Root Directory //
ulRootLocation=find_file(pucFileName, ulBlockNum);
if(ulRootLocation==FILE_NO_FOUND)
return 0;
else
{
//flush this file's recoder in root information//
ulDestLocation=DIR_Flash[ulRootLocation].ulUnitNo;
ulSrcLocation=ulDestLocation+DIR_Flash[ulRootLocation].ucUnitNum;
if(ulSrcLocation>=512)
memset(&(root_buf[ulDestLocation][0]), 0,32*DIR_Flash[ulRootLocation].ucUnitNum);
else
{
for(;ulDestLocation<ulSrcLocation;ulDestLocation++)
{
if(ulSrcLocation>=511) ulSrcLocation=511;
memcpy(root_buf[ulDestLocation],root_buf[ulSrcLocation],32);
ulSrcLocation++;
}
}
//----------------------------------------------------
//get the file first cluster//
ulDelBlockNo=DIR_Flash[ulRootLocation].ulDirFstClus;
while(1)
{
ReadPage(ulDelBlockNo,0,Page_Buf);
Erase_Block(ulDelBlockNo); //不知道是否正常工作,修改独立区的fat参数就可以了吧
//get the next block number//
ulDelBlockNo=Page_Buf[512+14]*256+Page_Buf[512+15];
if(ulDelBlockNo==65535)
break;
}
close_file(ulBlockNum);
return 1;
}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashInit(INT8U *pucFileName)
// 输 入: INT8U *pucFileName--文件名
// 输 出: 1--成功,不会失败
// 功能描述:初始化Flash文件系统
// 全局变量:root_Buf
//------------------------------------------------------------------
INT32U FlashInit(void)
{
INT32U ulPageNum,Pointer;
INT8U pucPageBuf[512+16];
/*读入Root informatiom*/
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
/*将Root information读到root_buf中*/
ReadPage(Root_Cluster,ulPageNum,pucPageBuf);
for(Pointer=0;Pointer<512;Pointer++)
{
root_buf[ulPageNum*16+Pointer/32][Pointer%32]=pucPageBuf[Pointer];
}
}
// LoadFont();
return 1;
}
//------------------------------------------------------------------
// 函数名:void LoadFont(void)
// 输 入: Null
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -