2195|3

3243

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

“玩板”+于振南的STM32开发板实验3 [复制链接]

 




此内容由EEWORLD论坛网友chenbingjy原创,如需转载或用于商业用途需征得作者同意并注明出处
第7章层递删截,通盘格空:文件,目录的删除及磁盘格式化。

文件删除的实现;

#ifdef ZNFAT_DELETE_FILE
UINT8 znFAT_Delete_File(INT8 *filepath) 
{
 UINT8 res=0;
 struct FileInfo fi; 

 struct FDIesInSEC *pitems; //Ö¸ÏòÎļþĿ¼ÏîÉÈÇøÊý¾ÝµÄÖ¸Õë
 struct FDI *pitem; //Ö¸ÏòÎļþĿ¼ÏîÊý¾ÝµÄÖ¸Õë

 res=znFAT_Open_File(&fi,filepath,0,BOOL_TRUE);
 if(res) return res;

 while(!res) //´ò¿ªÎļþ³É¹¦
 {
  znFAT_Device_Read_Sector(fi.FDI_Sec,znFAT_Buffer); //¶ÁÈ¡ÎļþµÄÎļþĿ¼ÏîËùÔÚÉÈÇø
  pitems=(struct FDIesInSEC *)znFAT_Buffer;
  pitem=(pitems->FDIes)+fi.nFDI;

  if(0!=fi.File_StartClust) Destroy_FAT_Chain(fi.File_StartClust); //Ïú»ÙÕûÌõ´ØÁ´

  znFAT_Device_Read_Sector(fi.FDI_Sec,znFAT_Buffer); //¶ÁÈ¡ÎļþĿ¼ÏîËùÔÚµÄÉÈÇø

  pitem->Name[0]=0XE5; //¸øÎļþĿ¼Ïî´òÉÏ"ÒÑɾ³ý"µÄ±ê¼Ç
  pitem->HighClust[0]=pitem->HighClust[1]=0; //¿ªÊ¼´ØµÄ¸ß×ÖÇå0

  znFAT_Device_Write_Sector(fi.FDI_Sec,znFAT_Buffer); //»ØдÉÈÇø

  res=znFAT_Open_File(&fi,filepath,0,BOOL_TRUE);
 }

 znFAT_Close_File(&fi);

 #ifdef RT_UPDATE_FSINFO
 Update_FSINFO();
 #endif

 return ERR_SUCC; 
}
#endif

删除的是dh.mp3。

 

最新回复

感谢分享!楼主继续!   详情 回复 发表于 2020-3-3 09:20
点赞 关注
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 
 

回复
举报

3243

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

第二,删除目录:

删除目录的实现过程主要有三种操作:

1.在当前目录下一次搜索,遇到目录就进入,遇到文件就删除。

2.如果目录为空,则直接返回上一级目录。

3.知道返回顶层目录,将其删除,目录删除操作完成。

#ifdef ZNFAT_DELETE_DIR
UINT8 znFAT_Delete_Dir(INT8 *dirpath) 
{
 UINT32 top_dir_first_cluster=0,sub_dir_first_cluster=0;
 UINT8 res=0;

 struct FDIesInSEC *pitems; //Ö¸ÏòÎļþĿ¼ÏîÉÈÇøÊý¾ÝµÄÖ¸Õë

 struct FileInfo fi;

 res=znFAT_Open_File(&fi,dirpath,0,BOOL_FALSE); //³¢ÊÔ´ò¿ªÄ¿Â¼

 if(res) return res; //Èç¹û´ò¿ªÄ¿Â¼Ê§°Ü£¬ÔòÖ±½Ó·µ»Ø´íÎóÂë

 while(!res) //Ŀ¼´ò¿ª³É¹¦
 {
  top_dir_first_cluster=fi.File_StartClust; //¶¥²ãĿ¼µÄÊ×´Ø
  sub_dir_first_cluster=top_dir_first_cluster;

  //ÒÔÏ´úÂ뽫¶¥¼¶Ä¿Â¼ÏÂËùÓÐÄÚÈÝ(Îļþ¡¢×ÓĿ¼¼°×ÓĿ¼ÖеÄÄÚÈÝ£¬º¬µÝ¹é)Ïú»Ù

  Enter_Deep_Ahead_Dir(&sub_dir_first_cluster); //»ñÈ¡×îÉî×î¿¿Ç°µÄĿ¼Ê×´Ø

  while(sub_dir_first_cluster!=top_dir_first_cluster) //Èç¹û×îÉî×ǰĿ¼Ê״ؾÍÊÇҪɾ³ýµÄ¶¥¼¶Ä¿Â¼
  {                                                   //Ôò˵Ã÷¶¥¼¶Ä¿Â¼ÏµÄËùÓÐÄÚÈݶ¼ÒѾ-Çå¿Õ
   Get_Upper_Dir(&sub_dir_first_cluster); //»ñÈ¡ÉÏÒ»²ãĿ¼Ê×´Ø 
   
   Have_Any_SubDir_With_Del_ForeFile(&sub_dir_first_cluster,BOOL_TRUE); //°ÑÒÑÇå¿ÕÆäÄÚÈݵÄ×ÓĿ¼Ïú»Ù 

   Enter_Deep_Ahead_Dir(&sub_dir_first_cluster); //»ñÈ¡×îÉî×î¿¿Ç°µÄĿ¼Ê×´Ø
  }  

  //Ïú»Ù¶¥¼¶Ä¿Â¼¶ÔÓ¦µÄÎļþĿ¼Ïî¼°Æä´ØÁ´

  znFAT_Device_Read_Sector(fi.FDI_Sec,znFAT_Buffer); //¶ÁÈ¡ÎļþĿ¼ÏîËùÔÚµÄÉÈÇø
  pitems=(struct FDIesInSEC *)znFAT_Buffer;

  Destroy_FDI((pitems->FDIes)+fi.nFDI); //Ïú»Ù¶¥¼¶Ä¿Â¼

  znFAT_Device_Read_Sector(fi.FDI_Sec,znFAT_Buffer); //¶ÁÈ¡ÎļþĿ¼ÏîËùÔÚµÄÉÈÇø
  (pitems->FDIes)[fi.nFDI].Name[0]=0XE5;
  (pitems->FDIes)[fi.nFDI].HighClust[0]=(pitems->FDIes)[fi.nFDI].HighClust[1]=0;

  znFAT_Device_Write_Sector(fi.FDI_Sec,znFAT_Buffer); //»ØдÉÈÇø

  res=znFAT_Open_File(&fi,dirpath,0,BOOL_FALSE); //³¢ÊÔ´ò¿ªÄ¿Â¼
 }
 
 znFAT_Close_File(&fi);

 #ifdef RT_UPDATE_FSINFO
 Update_FSINFO();
 #endif

 return ERR_SUCC; 
}
#endif

工程:

znfattest_72.rar (3.01 MB, 下载次数: 1)

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 
 
 

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

板凳
 


磁盘格式化:

格式化的核心工作是对主要的功能部分进行构造,构造的核心是在于DBR(BPB)。

DBR中的BPB记录了FAT32的重要参数,主要有三项:有效总扇区数,每簇扇区数,FAT表扇区数。

#ifdef ZNFAT_MAKE_FS
UINT8 znFAT_Make_FS(UINT32 tt_sec,UINT16 clu_sz) //¸ñʽ»¯ tt_sec ×ÜÉÈÇøÊý clu_sz Ö¸¶¨µÄ´Ø´óС
{                                          //ÈôΪ0Ôò°´´ÅÅÌ´óСѡ¶¨Ä¬ÈÏÖµ ¸ñʽ»¯²ßÂÔ²ÉÓñȽϼòµ¥µÄSFD²ßÂÔ
                                           //ÎÞMBR£¬²»Ö§³Ö·ÖÇø£¬Ö±½Ó´ÓDBR¿ªÊ¼
 struct DBR      *pdbr;
 struct FSInfo   *pfsinfo;

 UINT32 temp=0,temp1=0,temp2=0;

 tt_sec/=(UINT32)(NSECPERCYLINDER); 
 tt_sec*=(UINT32)(NSECPERCYLINDER);//ÉáÈ¥¡°Ê£ÓàÉÈÇø¡±£¬Ê£ÓàÉÈÇøÊÇÖ¸²»×ãÒ»¸öÖùÃæµÄÉÈÇøÊý

 //=================ºÏ³ÉDBRÉÈÇøÊý¾Ý=============================================================
 PGM2RAM(znFAT_Buffer,_dbr,512); //´ÓÄ£°æÊý×éÖаÑÊý¾Ý°áµ½ÄÚ²¿»º³åÇø
 pdbr=(struct DBR *)znFAT_Buffer;

 pdbr->BPB_SecPerClus=(UINT8)(clu_sz/512); //ÿ´ØÉÈÇøÊý
 if(0==pdbr->BPB_SecPerClus) pdbr->BPB_SecPerClus=Get_Recmd_szClu(tt_sec);
 if(0==pdbr->BPB_SecPerClus) return ERR_FMT_TOO_LOW_VOLUME; //ÈÝÁ¿Ì«Ð¡£¬²»ÄÜÓÃFAT32½øÐиñʽ»¯

 temp1=pdbr->BPB_SecPerClus;

 pdbr->BPB_TotSec32[0]=(UINT8)((tt_sec)    &0X000000FF);
 pdbr->BPB_TotSec32[1]=(UINT8)((tt_sec>>8) &0X000000FF);
 pdbr->BPB_TotSec32[2]=(UINT8)((tt_sec>>16)&0X000000FF);
 pdbr->BPB_TotSec32[3]=(UINT8)((tt_sec>>24)&0X000000FF); //¸Ã·ÖÇøµÄ×ÜÉÈÇøÊý

 temp=(tt_sec-32)/(((UINT32)NITEMSINFATSEC)*((UINT32)(pdbr->BPB_SecPerClus)));
 if((tt_sec-32)%((UINT32)NITEMSINFATSEC)*((UINT32)pdbr->BPB_SecPerClus)) temp++; //((tt_sec-32)-2*FATsz)/(SecPerClus*128)=FATsz ½âÕâ¸öµÈʽ
 temp2=temp;
 
 pdbr->BPB_FATSz32[0]=(UINT8)((temp)    &0X000000FF);
 pdbr->BPB_FATSz32[1]=(UINT8)((temp>>8) &0X000000FF);
 pdbr->BPB_FATSz32[2]=(UINT8)((temp>>16)&0X000000FF);
 pdbr->BPB_FATSz32[3]=(UINT8)((temp>>24)&0X000000FF); //FAT±íµÄÉÈÇøÊý

 znFAT_Device_Write_Sector(0,znFAT_Buffer); //½«ºÏ³ÉºÃµÄDBRÊý¾ÝдÈëµ½0ÉÈÇøÖÐÈ¥

 //===============================ÒÔÉÏ´úÂëÍê³É¶ÔDBRÉÈÇøÊý¾ÝµÄºÏ³É===============================

 //===================================ÒÔÏ´úÂëÍê³É¶ÔFSINFOÉÈÇøÊý¾ÝµÄºÏ³É========================

 Memory_Set(znFAT_Buffer,ZNFAT_BUF_SIZE,0); //½«ÄÚ²¿»º³åÇøÇå0
 PGM2RAM(znFAT_Buffer,_fsinfo_1,4); //½«FSINFOÄ£°åÊý¾ÝµÄµÚÒ»²¿·Ö°á¹ýÀ´
 PGM2RAM(znFAT_Buffer+484,_fsinfo_2,28); //½«FSINFOÄ£°åÊý¾ÝµÄµÚ¶þ²¿·Ö°á¹ýÀ´
                                             //×¢£ºFSINFOÄ£°åÊý¾Ý·ÖΪÁ½²¿·Ö£¬Ö÷ÒªÊÇÒòΪÆäÖÐÓоø´ó
                                             //²¿·ÖÊÇ0£¬ÎªÁ˽ÚÊ¡¹Ì»¯Êý¾ÝÁ¿£¬¼õÉÙFLASHROM¿Õ¼äµÄʹÓÃÁ¿
 pfsinfo=(struct FSInfo *)znFAT_Buffer;
 
 temp=(tt_sec-32-2*temp)/((UINT32)(temp1))-1; //×Ü´ØÊý-1£¬ÒòΪµÚ2´ØΪÊ×Ŀ¼£¬ÒѾ-±»¾í±êÕ¼ÓÃ
 pfsinfo->Free_Cluster[0]=(UINT8)((temp)    &0X000000FF);
 pfsinfo->Free_Cluster[1]=(UINT8)((temp>>8) &0X000000FF);
 pfsinfo->Free_Cluster[2]=(UINT8)((temp>>16)&0X000000FF);
 pfsinfo->Free_Cluster[3]=(UINT8)((temp>>24)&0X000000FF); //Ê£Óà¿Õ´ØÊý

 znFAT_Device_Write_Sector(1,znFAT_Buffer); //½«ºÏ³ÉºÃµÄDBRÊý¾ÝдÈëµ½64ÉÈÇøÖÐÈ¥£¬¼´DBRÉÈÇøµÄºóÒ»¸öÉÈÇø

 //=====================================ÒÔÉÏ´úÂëÍê³É¶ÔFSINFOÉÈÇøÊý¾ÝµÄºÏ³É=====================

 //=====================================ÒÔÏ´úÂëÍê³É¶ÔFAT±íµÄ³õʼ»¯============================

 znFAT_Device_Clear_nSector(temp1,32+2*temp2);
 znFAT_Device_Clear_nSector(temp2-1,33);
 znFAT_Device_Clear_nSector(temp2-1,33+temp2);

 PGM2RAM(znFAT_Buffer,_fatsec,12); //½«FAT±íÄ£°æÊý¾Ý°áµ½ÄÚ²¿»º³åÇø
 znFAT_Device_Write_Sector(32,znFAT_Buffer); //ÏòFAT±í1ÖÐдÈë0
 znFAT_Device_Write_Sector(32+temp2,znFAT_Buffer); //ÏòFAT±í2ÖÐдÈë0

 //=====================================ÒÔÉÏ´úÂëÍê³É¶ÔFAT±íµÄ³õʼ»¯============================

 //=====================================ÒÔÏ´úÂë¶ÔÊý¾ÝÇøÊ×ÉÈÇø½øÐгõʼ»¯£¬Ð´Èë¾í±ê=============

 PGM2RAM(znFAT_Buffer,_1stsec,26); 
 znFAT_Device_Write_Sector(32+2*temp2,znFAT_Buffer); //ÏòÊý¾ÝÇøµÚÒ»¸öÉÈÇøдÈëÊý¾Ý

 //=====================================ÒÔÉÏ.....==============================================
 return ERR_SUCC;
}  
#endif

试的时候,感觉格式化时间比较长。

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 
 
 

回复

661

帖子

18

TA的资源

纯净的硅(初级)

4
 

感谢分享!楼主继续!

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表