OpenEdv-开源电子网

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

从SD卡搬移数据到NAND flash 遇到问题

[复制链接]

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-11-18
在线时间
41 小时
发表于 2019-12-20 18:09:29 | 显示全部楼层 |阅读模式
5金钱
  目前想把图片文件从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 KEY2REV",16,0);                                             
        Show_Str(30,110,200,16,"KEY_UPAUSE",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);                        //释放内存
}

最佳答案

查看完整内容[请看2#楼]

折腾了半天…给有需要的人参考一下 1. 参照综合范例test.c 中的system_init() Nand flash那段代码。 2. 搭配https://www.xiaopingtou.cn/q-131562.html 这位小哥所写的范例就能实作出来了,这边要稍微修改! 3. 目前从SD卡 -> Nand flash ,Nand flash -> SD卡都OK 不过要注意的是Nand flash -> SD卡别重新格式化 否则之前复制的档案就泡汤了。 模块:阿波罗 STM32F429
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-11-18
在线时间
41 小时
 楼主| 发表于 2019-12-20 18:09:30 | 显示全部楼层
折腾了半天…给有需要的人参考一下

1.        参照综合范例test.c 中的system_init() Nand flash那段代码。

2.        搭配https://www.xiaopingtou.cn/q-131562.html 这位小哥所写的范例就能实作出来了,这边要稍微修改!

3.        目前从SD卡 -> Nand flash ,Nand flash -> SD卡都OK
不过要注意的是Nand flash -> SD卡别重新格式化 否则之前复制的档案就泡汤了。

模块:阿波罗 STM32F429
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-11-18
在线时间
41 小时
 楼主| 发表于 2019-12-23 09:48:30 | 显示全部楼层
对于步骤比较不了解,有原子哥能帮忙或给一下建议么? 感激不尽!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-12-25 02:34:31 | 显示全部楼层
建议拷贝之前,先全片擦除NAND FLASH。
然后重新格式化,再拷贝。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-11-18
在线时间
41 小时
 楼主| 发表于 2019-12-25 09:19:14 | 显示全部楼层
这边我再试试看,但出厂预设档案或参数会不会就回不去了 ,tks。
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-11-18
在线时间
41 小时
 楼主| 发表于 2019-12-26 17:24:19 | 显示全部楼层
本帖最后由 CYE工程師 于 2019-12-26 17:27 编辑

     刚刚发现代码会卡在 exf_fdcopy里面的

     fcpymsg(fn,0,0X04);//更新文件夹名

     是我使用错误么?
     
    卡在fcpymsg里面就死机了...
    代码如下:   
     picture_ize = (u32)picfileinfo->fsize;
     strcpy((char*)pname,"0:/PICTURE");                                   //复制路径(目录)
     strcpy((char*)dname,"2:/PICTURE");                                   //复制路径(目录)        
     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;
      }         
     }
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2019-11-18
在线时间
41 小时
 楼主| 发表于 2020-1-8 18:08:37 | 显示全部楼层
折腾了半天…给有需要的人参考一下

1.        参照综合范例test.c 中的system_init() Nand flash那段代码。

2.        搭配https://www.xiaopingtou.cn/q-131562.html 这位小哥所写的范例就能实作出来了,这边要稍微修改!

3.        目前从SD卡 -> Nand flash ,Nand flash -> SD卡都OK
不过要注意的是Nand flash -> SD卡别重新格式化 否则之前复制的档案就泡汤了。

模块:阿波罗 STM32F429
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2014-12-13
在线时间
47 小时
发表于 2021-8-27 09:02:41 | 显示全部楼层
标记一下
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-2-17
在线时间
1 小时
发表于 2022-2-17 14:39:54 | 显示全部楼层
小哥可以發你改完的代碼讓我參考一下嗎,最近改了一些但一直失敗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 03:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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