OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9597|回复: 1

用FatFs移植原子哥的SD卡字库更新到Flash问题

[复制链接]

16

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-3-20
在线时间
9 小时
发表于 2012-5-23 11:58:59 | 显示全部楼层 |阅读模式
小弟菜鸟,初学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;//成功
}
无往而不胜!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-23 15:38:33 | 显示全部楼层
仿真器跟踪一下,看看在哪里出错的,对症下药才是,否则一把抓,很难定位.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 01:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表