硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2263|回复: 8
收起左侧

[其它] 关于fatfs删除文件问题

[复制链接]

2

主题

8

回帖

30

积分

新手上路

积分
30
发表于 2017-12-25 11:08:31 | 显示全部楼层 |阅读模式
小弟最近接触stm32。在spi flash移植了fatfs来管理.写入/读出音频都正常。但是每次调用f_unlink按文件名删除文件后,文件系统就损坏了,再写音频回放都是快进的那种。哪位盆友用fats删除过flash,求指导。万分感谢
            if(KEY_TYPE==1)
                {
                        res=f_unlink("1:/RECORDER/REC00003.wav");   //é¾3yÎļt
                //        delay_ms(8000);        
                        printf("read delete res:%d\r\n",res);
                        if(res == FR_OK)  break;                        
                }

回复

使用道具 举报

2

主题

8

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2017-12-25 11:11:06 | 显示全部楼层
补充一下:删除前没有打开文件。并且删除函数的返回值是0,表示成功。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2017-12-25 11:21:51 | 显示全部楼层
不确定是不是你的移植问题,需要通过下面的操作排查下,再找两个卡,一个卡没有代表性,先低格一次,然后删除测试下,并看看返回值。
并且注意下面的问题

QQ截图20171225112057.jpg
回复

使用道具 举报

2

主题

8

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2017-12-25 15:22:47 | 显示全部楼层
eric2013 发表于 2017-12-25 11:21
不确定是不是你的移植问题,需要通过下面的操作排查下,再找两个卡,一个卡没有代表性,先低格一次,然后删 ...

群主。我是存在SD卡里面删除调是对的。存在flash删除开始是对的,但是只要下电后,再写入就不对了。求指导啊。在线等
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2017-12-26 01:13:48 | 显示全部楼层
蓝蓝翎 发表于 2017-12-25 15:22
群主。我是存在SD卡里面删除调是对的。存在flash删除开始是对的,但是只要下电后,再写入就不对了。求指 ...

方便的话,贴个你的稍完整的程序看下,看看是不是你的操作有问题。
回复

使用道具 举报

2

主题

8

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2017-12-26 14:04:44 | 显示全部楼层
本帖最后由 蓝蓝翎 于 2017-12-26 14:25 编辑
eric2013 发表于 2017-12-26 01:13
方便的话,贴个你的稍完整的程序看下,看看是不是你的操作有问题。

删除文件的程序是之前贴出来的。下面是写文件的程序。但是现在问题就是删除文件后。再写数据就不对了,当比删掉的文件大后就正常了。感觉是删掉文件的那一块扇区有问题了。


回复

使用道具 举报

2

主题

8

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2017-12-26 14:20:34 | 显示全部楼层
  1. u8 recoder_play(void)
  2. {
  3.         u8 res;
  4.         u8 key;
  5.         u8 rval=0;
  6.         __WaveHeader *wavhead=0;
  7.         u32 sectorsize=0;
  8. //        u8 sectorsize=0;
  9.         FIL* f_rec=0;                                        //Îļt                    
  10.         DIR recdir;                                                 //Ŀ¼
  11.         u8 *recbuf;                                                //êy¾YÄú′æ         
  12.         u16 w;
  13.         u16 idx=0;            
  14.         u8 rec_sta=0;                                        //¼òô×′ì¬
  15.                                                                         //[7]:0,ûóD¼òô;1,óD¼òô;
  16.                                                                         //[6:1]:±£áô
  17.                                                                         //[0]:0,ÕyÔú¼òô;1,ÔYí£¼òô;
  18.         u8 *pname=0;
  19.   
  20.         u32 recsec=0;                                        //¼òôê±¼ä

  21.         u8 playFlag=0;                                        //2¥·Å±êÖ¾
  22.   
  23.         while(f_opendir(&recdir,"1:/RECORDER"))//′ò¿a¼òôÎļt¼D
  24.         {
  25.                 Show_Str(60,230,240,16,"RECORDERÎļt¼D′íÎó!",16,0);
  26.                 delay_ms(20);                                  
  27.                 LCD_Fill(60,230,240,246,WHITE);                //Çå3yÏÔê¾             
  28.                 delay_ms(20);                                  
  29.                 f_mkdir("1:/RECORDER");                                //′′½¨¸ÃĿ¼   
  30.         }
  31.        
  32.           f_rec=(FIL *)mymalloc(sizeof(FIL));        //¿a±ùFIL×Ö½úμÄÄú′æÇøóò
  33.         if(f_rec==NULL)rval=1;        //éêÇë꧰ü
  34.         wavhead=(__WaveHeader*)mymalloc(sizeof(__WaveHeader));//¿a±ù__WaveHeader×Ö½úμÄÄú′æÇøóò
  35.         if(wavhead==NULL)rval=1;
  36.         recbuf=mymalloc(512);        
  37.         if(recbuf==NULL)rval=1;                            
  38.         pname=mymalloc(30);                                        //éêÇë30¸ö×Ö½úÄú′æ,ààËÆ"0:RECORDER/REC00001.wav"
  39.         if(pname==NULL)rval=1;
  40.         if(rval==0)                                                                        //Äú′æéêÇëOK
  41.         {      
  42.                 recoder_enter_rec_mode(1024*recagc);                               
  43.            while(VS_RD_Reg(SPI_HDAT1)>>8);                        //μèμ½buf ½ÏÎa¿ÕÏDÔù¿aê¼  
  44.   //                recoder_show_time(recsec);                                //ÏÔê¾ê±¼ä
  45.         //        recoder_show_agc(recagc);                                //ÏÔê¾agc
  46.                  pname[0]=0;                                                                //pnameûóDèÎoÎÎļtÃû               
  47.                
  48.                              rec_sta|=0X80;        //¿aê¼Â¼òô                                                   //½øμ½Â¼òô½çÃæ¿aê¼Â¼òô£¬μã»÷è·èÏ°′¼ü±£′æ¼òô2¢·μ»ØéÏò»¸ö½çÃ棬¿éòÔμ÷½úéùòô′óD¡£¬ÂË2¨Ä£ê½
  49.                                                 recoder_new_pathname(pname);                        //μÃμ½DÂμÄÃû×Ö
  50.                                         //        Show_Str(60,230,240,16,pname+11,16,0);        //ÏÔê¾μ±Ç°Â¼òôÎļtÃû×Ö
  51.                                                  recoder_wav_init(wavhead);                                //3õê¼»ˉwavêy¾Y       
  52.                                                  res=f_open(f_rec,(const TCHAR*)pname, FA_CREATE_ALWAYS | FA_WRITE);
  53.                         printf("read open res:%d\r\n",res);
  54.                                                 if(res)                        //Îļt′′½¨ê§°ü
  55.                                                 {
  56.                                                         rec_sta=0;        //′′½¨Îļt꧰ü,2»Äü¼òô
  57.                                                         rval=0XFE;        //ìáê¾êÇ·ñ′æÔúSD¿¨
  58.                                                 }else res=f_write(f_rec,(const void*)wavhead,sizeof(__WaveHeader),&bw);//D′èëí·êy¾Y
  59.                                 
  60.                      while(1)
  61.                   {
  62.                                
  63.                                
  64.                                 if(key==KEY0_PRES)     //í£Ö1¼òô°′¼ü°′ÏÂ
  65.                 {
  66.                         if(rec_sta&0X80)//óD¼òô
  67.                                         {
  68.                                                 wavhead->riff.ChunkSize=sectorsize*512+36;        //Õû¸öÎļtμÄ′óD¡-8;
  69.                                            wavhead->data.ChunkSize=sectorsize*512;                //êy¾Y′óD¡
  70.                                                 f_lseek(f_rec,0);                                                        //Æ«òÆμ½Îļtí·.
  71.                                           f_write(f_rec,(const void*)wavhead,sizeof(__WaveHeader),&bw);//D′èëí·êy¾Y
  72.                                                 res=f_close(f_rec);
  73.                                                 printf("read close res:%d\r\n",res);
  74.                                                 sectorsize=0;
  75.                                 //                res=f_closedir(&recdir);
  76.                                 //                printf("close dir :%d\r\n",res);
  77.                                         }
  78.                                         rec_sta=0;
  79.                                         recsec=0;
  80.                                          LED1=1;                                                         //1رÕDS1
  81.                                 //        LCD_Fill(60,230,240,246,WHITE);        //Çå3yÏÔê¾,Çå3y֮ǰÏÔê¾μļòôÎļtÃû             
  82.                                 //        recoder_show_time(recsec);                //ÏÔê¾ê±¼ä
  83.                     break;
  84.                   }
  85.                
  86.                         else if (4==filtermode_Scan(0))    //ÇD»»ÂË2¨Ä£ê½
  87.                         {
  88.                     turn_filtermode();                   //ÇD»»Ä£ê½
  89.                   }
  90.                 else
  91.                         {
  92.                           key=KEY_Scan(0);
  93.                         //        key=KEY1_PRES;
  94.                          switch(key)
  95.                         {               
  96.                                 //case WKUP_PRES:        //STOP&SAVE
  97.                                 case KEY1_PRES:        //AGC+         
  98.                                 case KEY2_PRES:        //AGC-
  99.                                         if(key==KEY1_PRES)recagc++;
  100.                                         else if(recagc)recagc--;
  101.                                         if(recagc>15)recagc=15;                                //·¶Î§ÏT¶¨Îa0~15.0,×Ô¶ˉAGC.ÆäËûAGC±¶êy                                                                                 
  102.                                         OLED_ShowNum(40,4,recagc,2,16);//6       
  103.                                         VS_WR_Cmd(SPI_AICTRL1,1024*recagc);        //éèÖÃÔöòæ,0,×Ô¶ˉÔöòæ.1024Ïàμ±óú1±¶,512Ïàμ±óú0.5±¶
  104.                                         break;
  105.                         }
  106.                 }
  107. ///////////////////////////////////////////////////////////
  108. //¶áè¡êy¾Y                          
  109.                         if(rec_sta==0X80)//òѾ-Ôú¼òôáË
  110.                         {
  111.                                   w=VS_RD_Reg(SPI_HDAT1);       
  112.                                 if((w>=256)&&(w<896))
  113.                                 {
  114.                                          idx=0;                                            
  115.                                           while(idx<512)         //ò&#187;′&#206;&#182;áè&#161;512×&#214;&#189;ú
  116.                                         {         
  117.                                                  w=VS_RD_Reg(SPI_HDAT0);                                               
  118.                                                  recbuf[idx++]=w&0XFF;
  119.                                                 recbuf[idx++]=w>>8;
  120.                                         }                           
  121.                                          res=f_write(f_rec,recbuf,512,&bw);//D′è&#235;&#206;&#196;&#188;t
  122.                                         printf("write:%d\r\n",res);
  123.                                         if(res)
  124.                                         {
  125.                                                 printf("err:%d\r\n",res);
  126.                                                 printf("bw:%d\r\n",bw);
  127.                                                 break;//D′è&#235;3&#246;′í.          
  128.                                         }
  129.                                         sectorsize++;//éè&#199;&#248;êy&#212;&#246;&#188;ó1,&#212;&#188;&#206;a32ms         
  130.           if(sectorsize==0x3e8)                    //ìí&#188;óè&#231;1&#251;ò&#189;éúíü&#188;&#199;1&#216;μ&#244;éè±&#184;£&#172;&#212;ú&#188;&#199;&#194;&#188;32soóéè±&#184;&#189;&#171;×&#212;&#182;ˉí£&#214;1&#194;&#188;ò&#244;·μ&#187;&#216;&#214;÷&#189;&#231;&#195;&#230;
  131.                                         {
  132.                                         wavhead->riff.ChunkSize=sectorsize*512+36;        //&#213;&#251;&#184;&#246;&#206;&#196;&#188;tμ&#196;′óD&#161;-8;
  133.                                   wavhead->data.ChunkSize=sectorsize*512;                //êy&#190;Y′óD&#161;
  134.                                   f_lseek(f_rec,0);                                                        //&#198;&#171;ò&#198;μ&#189;&#206;&#196;&#188;tí·.
  135.                                   f_write(f_rec,(const void*)wavhead,sizeof(__WaveHeader),&bw);//D′è&#235;í·êy&#190;Y
  136.                                         f_close(f_rec);
  137.                                         sectorsize=0;
  138.                                         rec_sta=0;
  139.                                         break;
  140.                                         }                 
  141.                                    
  142.                                 }                       
  143.                         }
  144.                 }
  145.                 }                                          
  146.                                                                   
  147.         myfree(wavhead);
  148.         myfree(recbuf);          
  149.         myfree(f_rec);         
  150.         myfree(pname);
  151.         return rval;
  152. }
复制代码
回复

使用道具 举报

2

主题

8

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2017-12-26 14:21:41 | 显示全部楼层
本帖最后由 蓝蓝翎 于 2017-12-26 14:23 编辑

复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2017-12-27 01:20:10 | 显示全部楼层

先别这么复杂的测试,简单的创建个txt文件文件,写几个字符关闭,然后删除这个文件看看,不要搞什么动态内存,全弄成全局变量测试,这样目的是为了测试你的底层接口是否有问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 18:49 , Processed in 0.208091 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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