小弟菜鸟,初学FatFs,闭门几日略有理解,昨夜便想将原子哥的SD卡读字库存入Flash,结果呢。。。当然是不成功~不知道哪里有错,今天贴出来,大家帮我找找问题啊~理解较浅,代码凌乱,高手勿喷啊,编译提示2个警告,无错误。
const char *folder[2]=
{
"SYSTEM",
"FONT",
};
//系统文件定义
const char *sysfile[3]=
{
"GBK16.FON",
"GBK12.FON",
"UNI2GBK.SYS",
};
//字节0~3, 记录UNI2GBKADDR;字节4~7 ,记录UNI2GBKADDR的大小
//字节8~11, 记录FONT16ADDR ;字节12~15,记录FONT16ADDR的大小
//字节16~19,记录FONT12ADDR ;字节20~23,记录FONT12ADDR的大小
//字体存放,从100K处开始
//100K,存放UNICODE2GBK的转换码
u32 FONT16ADDR ;//16字体存放的地址
u32 FONT12ADDR ;//12字体存放的地址
u32 UNI2GBKADDR;//UNICODE TO GBK 表存放地址
//更新字体文件
//返回值:0,更新成功;
// 其他,错误代码.
//正点原子@ALIENTEK
//V1.1
#ifdef EN_UPDATE_FONT
u8 temp[512]; //零时空间
u8 Update_Font(void)
{
BYTE buffer[512];
FATFS fs;
FIL fl;
FRESULT res;
UINT r;
DIR dir;
FILINFO finfo;
char dir_patch[50]={""};
TCHAR FILENAME[13];
TCHAR FILENAME2[13];
TCHAR SYSNAME[13];
u8 fileflag=0;
u8 fileflag2=0;
u8 i;
float prog;
u8 t;
u32 tempsys[2]; //临时记录文件起始位置和文件大小
/* u32 fcluster=0;
u32 i;
//u8 temp[512]; //零时空间 在这里定义,会内存溢出
FileInfoStruct FileTemp;//零时文件夹 */
//得到根目录的簇号
f_mount(0,&fs);
res = f_opendir(&dir,dir_patch);
if(res == FR_OK)
{
while(f_readdir(&dir,&finfo)== FR_OK)
{
if (res != FR_OK || finfo.fname[0] == 0) break;
if (finfo.fattrib & AM_DIR)
{
SYSNAME = finfo.fname;
i++;
}
}
}
for(i=0;i<13;i++)//循环读出文件名,然后与特定文件名比较匹配,下同
{
if((const char*)SYSNAME==folder[0])
{
res = f_opendir(&dir,(TCHAR*)folder[1]);
if(res != FR_OK)return 1;
else
{
while(f_readdir(&dir,&finfo)== FR_OK)
{
if (res != FR_OK || finfo.fname[0] == 0) break;
if (finfo.fattrib & AM_ARC)
{
fileflag = 0;
FILENAME = finfo.fname;
i++;
}
}
}
}
else fileflag++;
if(fileflag == 13)
{
fileflag = 0;
return 2;
}
}
for(i=0;i<13;i++)
{
if((const char*)FILENAME==sysfile[2])
{
LCD_ShowString(20,90,"Write UNI2GBK to FLASH...");
LCD_ShowString(108,110,"%");
f_open(&fl,"0:/SYSTEM/FONT/UNI2GBK.SYS",FA_OPEN_EXISTING | FA_READ);
while(1)
{
res=f_read(&fl,buffer,sizeof(buffer),&r);
if(res||r==0) continue;
}
if(i<finfo.fsize)//不超过文件大小
{
SPI_Flash_Write(temp,i+100000,512);//从100K字节处开始写入512个数据
i+=512;//增加512个字节
}
prog=(float)i/finfo.fsize;
prog*=100;
if(t!=prog)
{
t=prog;
if(t>100)t=100;
LCD_ShowNum(84,110,t,3,16);//显示数值
}
UNI2GBKADDR=100000;//UNI2GBKADDR从100K处开始写入.
tempsys[0]=UNI2GBKADDR;
tempsys[1]=finfo.fsize; //UNI2GBKADDR 大小
SPI_Flash_Write((u8*)tempsys,0,8);//记录在地址0~7处
delay_ms(1000);
FONT16ADDR=finfo.fsize+UNI2GBKADDR;//F16的首地址
res=f_opendir(&dir,"/SYSTEM/FONT"); //这样写我也不确定!如果不成功,讲此处按照一级一级的文件夹打开方式查询
if(res != FR_OK)return 4;
else
{
while(f_readdir(&dir,&finfo)== FR_OK)
{
if (res != FR_OK || finfo.fname[0] == 0) break;
if (finfo.fattrib & AM_ARC)
{
FILENAME2 = finfo.fname;
i++;
}
}
for(i=0;i<13;i++)
{
if((const char*)FILENAME2==sysfile[0])
{
LCD_ShowString(20,90,"Write FONT16 to FLASH... ");
res =f_open(&fl,"0:/SYSTEM/FONT/GBK16.FON",FA_OPEN_EXISTING | FA_READ);
if(res != FR_OK) return 6;
else
{
while(1)
{
res=f_read(&fl,buffer,sizeof(buffer),&r);
if(res||r==0) continue;
}
if(i<finfo.fsize)//不超过文件大小
{
SPI_Flash_Write(temp,i+FONT16ADDR,512);//从0开始写入512个数据
i+=512;//增加512个字节
}
prog=(float)i/finfo.fsize;
prog*=100;
if(t!=prog)
{
t=prog;
if(t>100)t=100;
LCD_ShowNum(84,110,t,3,16);//显示数值
}
tempsys[0]=FONT16ADDR;
tempsys[1]=finfo.fsize; //FONT16ADDR 大小
SPI_Flash_Write((u8*)tempsys,8,8);//记录在地址8~15处
delay_ms(1000); break;
// FONT12ADDR=finfo.fsize+FONT16ADDR;//F12的首地址
}
}
else fileflag2++;
if(fileflag2 == 13)
{
fileflag2=0;
return 5;
}
}
}
fileflag = 0; break;
}
else fileflag++;
if(fileflag == 13)
{
fileflag = 0;
return 3;
}
}
t=0XAA;
SPI_Flash_Write(&t,24,1);//写入字库存在标志 0XAA
LCD_ShowString(20,90," Font Update Successed ");
delay_ms(1000);
delay_ms(1000);
return 0;//成功
} |