目前想把图片文件从SD卡搬至nand flash,写了个判断就直接跳离了用仿真后才知道是打开源目录(错误5),
第一次使用有点不知道该如何下手,也参考了综合范例,还请大老们帮小弟看看看哪里出了错~
int main(void)
{
u8 cnt_over = 0;
u8 res;
DIR picdir; //图片目录
FILINFO *picfileinfo;//文件信息
u8 *pname; //带路径的文件名
u8 *dname; //
u16 totpicnum; //图片文件总数
u16 curindex; //图片当前索引
u8 key; //键值
u8 pause=0; //暂停标记
u8 t;
u16 temp;
u32 *picoffsettbl; //图片文件offset索引表
u32 picture_ize;
Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(90,115200); //初始化串口波特率为115200
usmart_dev.init(90);
LED_Init(); //初始化与LED连接的硬件接口
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
KEY_Init(); //初始化按键
W25QXX_Init(); //初始化W25Q256
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMEX); //初始化外部内存池
my_mem_init(SRAMCCM); //初始化CCM内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
f_mount(fs[1],"1:",1); //挂载FLASH.
f_mount(fs[2],"2:",1); //挂载NAND FLASH.
POINT_COLOR=RED;
while(font_init()) //检查字库
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//清除显示
delay_ms(200);
}
Show_Str(30,50,200,16,"阿波罗STM32F4/F7开发板",16,0);
Show_Str(30,70,200,16,"图片显示程序",16,0);
Show_Str(30,90,200,16,"KEY0:NEXT KEY2 REV",16,0);
Show_Str(30,110,200,16,"KEY_UP AUSE",16,0);
Show_Str(30,130,200,16,"正点原子@ALIENTEK",16,0);
Show_Str(30,150,200,16,"2016年1月7日",16,0);
while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹
{
Show_Str(30,170,240,16," ICTURE文件夹错误!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//清除显示
delay_ms(200);
}
totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数
while(totpicnum==NULL)//图片文件为0
{
Show_Str(30,170,240,16,"没有图片文件!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//清除显示
delay_ms(200);
}
picfileinfo=(FILINFO*)mymalloc(SRAMIN,sizeof(FILINFO)); //申请内存
pname=mymalloc(SRAMIN,_MAX_LFN*2+1); //为带路径的文件名分配内存
picoffsettbl=mymalloc(SRAMIN,4*totpicnum); //申请4*totpicnum个字节的内存,用于存放图片索引
while(!picfileinfo||!pname||!picoffsettbl) //内存分配出错
{
Show_Str(30,170,240,16,"内存分配失败!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//清除显示
delay_ms(200);
}
//记录索引
res=f_opendir(&picdir,"0:/PICTURE"); //打开目录
if(res==FR_OK)
{
curindex=0;//当前索引为0
while(1)//全部查询一遍
{
temp=picdir.dptr; //记录当前dptr偏移
res=f_readdir(&picdir,picfileinfo); //读取目录下的一个文件
if(res!=FR_OK||picfileinfo->fname[0]==0)break; //错误了/到末尾了,退出
res=f_typetell((u8*)picfileinfo->fname);
if((res&0XF0)==0X50)//取高四位,看看是不是图片文件
{
picoffsettbl[curindex]=temp;//记录索引
curindex++;
}
}
//==============================================================
//copy file to nand flash.
res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); //打开目录
dir_sdi(&picdir,picoffsettbl[0]); //改变当前目录索引
res=f_readdir(&picdir,picfileinfo); //读取目录下的一个文件
dname = mymalloc(SRAMIN,_MAX_LFN*2+1); //为带路径的文件名分配内存
strcpy((char*)pname,"0:/PICTURE/"); //复制路径(目录)
strcat((char*)pname,(const char*)picfileinfo->fname);//将文件名接在后面
strcpy((char*)dname,"2:/PICTURE/"); //复制路径(目录)
strcat((char*)dname,(const char*)picfileinfo->fname);//将文件名接在后面
picture_ize = (u32)picfileinfo->fsize;
while(1)
{
if( (exf_fdcopy(NULL,(u8*)pname,(u8*)dname,0,&picture_ize,0) == 0) //copy success
)
{
Show_Str(30,190,240,16,"OK...",16,0);
break;
}
if(++cnt_over >=5)
{
Show_Str(30,190,240,16,"Fail...",16,0);
break;
}
}
//==============================================================
}
Show_Str(30,170,240,16,"开始显示...",16,0);
delay_ms(1500);
piclib_init(); //初始化画图
curindex=0; //从0开始显示
res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); //打开目录
while(res==FR_OK)//打开成功
{
dir_sdi(&picdir,picoffsettbl[curindex]); //改变当前目录索引
res=f_readdir(&picdir,picfileinfo); //读取目录下的一个文件
if(res!=FR_OK||picfileinfo->fname[0]==0)break; //错误了/到末尾了,退出
strcpy((char*)pname,"0:/PICTURE/"); //复制路径(目录)
strcat((char*)pname,(const char*)picfileinfo->fname);//将文件名接在后面
LCD_Clear(BLACK);
ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片
//ai_load_picfile(pname,150,10,100,100,1);//显示图片
Show_Str(2,2,lcddev.width,16,pname,16,1); //显示图片名字
t=0;
while(1)
{
key=KEY_Scan(0); //扫描按键
if(t>250)key=1; //模拟一次按下KEY0
if((t%20)==0)LED0=!LED0;//LED0闪烁,提示程序正在运行.
if(key==KEY2_PRES) //上一张
{
if(curindex)curindex--;
else curindex=totpicnum-1;
break;
}else if(key==KEY0_PRES)//下一张
{
curindex++;
if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始
break;
}else if(key==WKUP_PRES)
{
pause=!pause;
LED1=!pause; //暂停的时候LED1亮.
}
if(pause==0)t++;
delay_ms(10);
}
res=0;
}
myfree(SRAMIN,picfileinfo); //释放内存
myfree(SRAMIN,pname); //释放内存
myfree(SRAMIN,picoffsettbl); //释放内存
myfree(SRAMIN,dname); //释放内存
}
|