打印

振南的znFAT-单片机上的FAT32文件系统 研发手记

[复制链接]
楼主: znmcu
手机看帖
扫描二维码
随时随地手机跟帖
21
znmcu|  楼主 | 2009-12-20 01:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
就像computer00的USB一样,他的代码可能用不到商业上,商业用户可能会跟官方直接要例程和技术支持,但他的书让我知道了USB是怎么一回事

使用特权

评论回复
22
jerkoh| | 2009-12-21 21:41 | 只看该作者
吓四方博为旨,极北斗自来朝。挚山河独标新,聚吾来弄天狼。点出发终有始,业何达必亲为。尽峰端难攀登,在你我掌当中

文采 好湿~

使用特权

评论回复
23
andy2003hu| | 2009-12-21 22:29 | 只看该作者
MARK

使用特权

评论回复
24
znmcu|  楼主 | 2009-12-22 00:19 | 只看该作者
签名的诗,只是瞎写的,拽拽文,献丑了,呵

使用特权

评论回复
25
LMCHEN| | 2009-12-22 22:13 | 只看该作者
ZN:快点出书呀!我有点等不急了!
     你的《振南带你从0学单片机》视频教程,我个人觉得非常好,有些章节我至少看了三遍以上,从中真的学到不少的东西,还有很想买你那套天狼星开发板,不知现在又没有最新版的?可否告知邮购方法及价格。谢!

使用特权

评论回复
26
znmcu|  楼主 | 2009-12-22 22:43 | 只看该作者
天狼星在改版,整体结构 和 实验资料都有较大的改动

PS:我现在可能是太多时间了,在哈尔滨忙硕士毕业和论文,过了这阵继续写稿子。
你可以加我,可以给你私下看一些书稿

使用特权

评论回复
27
znmcu|  楼主 | 2009-12-22 22:46 | 只看该作者
刚开始与北航联系的时候,文件系统这方面的需求是最大问题,说白了就是出了书会不会有人买。

现在看起来,比较乐观

使用特权

评论回复
28
dongshan| | 2009-12-23 19:06 | 只看该作者
藏头诗:
振南电子原创无限

使用特权

评论回复
29
znmcu|  楼主 | 2009-12-23 19:30 | 只看该作者
呵,被你看到了,B~B~b~~  动感超人

使用特权

评论回复
30
jimmygaoyang| | 2009-12-28 14:41 | 只看该作者
你好,振南,我把大规模读写做成功了,感觉很爽,谢谢你的帮助,其实我把你的 FAT32_Read_File
UINT32 FAT32_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf)
改成
UINT32 FAT32_Write_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf)
了,这样就可以实现任意位置处的文件刷新了,多谢!!
UINT32 FAT32_Write_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf)
{
UINT32 i,j,k,temp;
UINT32 counter=0;
if(offset<pfi->FileSize)
{
  if(offset+len>pfi->FileSize) len=pfi->FileSize-offset;
  FAT32_Seek_File(pfi,offset);
  
  FAT32_ReadSector(pfi->FileCurSector,FAT32_Buffer);
  for(i=pfi->FileCurPos;i<Init_Arg.BytesPerSector;i++)
  {
   if(counter<len)
   {
   FAT32_Buffer[i]=pbuf[counter];
   counter++;
   pfi->FileCurPos++;
   pfi->FileCurOffset++;
   }
   else
    {FAT32_WriteSector(pfi->FileCurSector,FAT32_Buffer);
        goto end;}
  }
  FAT32_WriteSector(pfi->FileCurSector,FAT32_Buffer);
  if(pfi->FileCurSector-(SOC(pfi->FileCurCluster))!=(Init_Arg.SectorsPerClust-1))
  {
   for(j=pfi->FileCurSector+1;j<(SOC(pfi->FileCurCluster))+Init_Arg.SectorsPerClust;j++)
   {FAT32_ReadSector(j,FAT32_Buffer);
    pfi->FileCurSector=j;
    for(i=0;i<Init_Arg.BytesPerSector;i++)
    {
     if(counter<len)
     {
     FAT32_Buffer[i]=pbuf[counter];
     counter++;
     pfi->FileCurPos++;
     pfi->FileCurOffset++;
     }
   else
    {FAT32_WriteSector(j,FAT32_Buffer);
        goto end;}
    }
   FAT32_WriteSector(j,FAT32_Buffer);
   }
  }
  temp=(len-counter)/(Init_Arg.BytesPerSector*Init_Arg.SectorsPerClust);
  for(k=0;k<temp;k++)
  {
   pfi->FileCurCluster=FAT32_GetNextCluster(pfi->FileCurCluster);
   for(j=(SOC(pfi->FileCurCluster));j<(SOC(pfi->FileCurCluster))+Init_Arg.SectorsPerClust;j++)
   {
    FAT32_ReadSector(j,FAT32_Buffer);
    pfi->FileCurSector=j;
    for(i=0;i<Init_Arg.BytesPerSector;i++)
    {
     if(counter<len)  
         {
     FAT32_Buffer[i]=pbuf[counter];
     counter++;
     pfi->FileCurOffset++;
         pfi->FileCurPos++;
         pfi->FileCurPos%=Init_Arg.BytesPerSector;
         }
        else
    {FAT32_WriteSector(j,FAT32_Buffer);
        goto end;}
    }
   FAT32_WriteSector(j,FAT32_Buffer);
   }   
  }
  pfi->FileCurCluster=FAT32_GetNextCluster(pfi->FileCurCluster);
  temp=(SOC(pfi->FileCurCluster))+((len-counter)/Init_Arg.BytesPerSector);
  pfi->FileCurSector=(SOC(pfi->FileCurCluster));
  for(j=(SOC(pfi->FileCurCluster));j<temp;j++)
  {
   FAT32_ReadSector(j,FAT32_Buffer);
   pfi->FileCurSector=j;
   for(i=0;i<Init_Arg.BytesPerSector;i++)
   {
    if(counter<len)
    {
    pbuf[counter]=FAT32_Buffer[i];
    counter++;
    pfi->FileCurPos++;
    pfi->FileCurPos%=Init_Arg.BytesPerSector;
    pfi->FileCurOffset++;
    }
           else
    {FAT32_WriteSector(j,FAT32_Buffer);
        goto end;}
   }
   FAT32_WriteSector(j,FAT32_Buffer);      
  }
  pfi->FileCurSector=j;
  FAT32_ReadSector(pfi->FileCurSector,FAT32_Buffer);
  temp=len-counter;
  for(i=0;i<temp;i++)
  {
   if(counter<len)
   {

   pbuf[counter]=FAT32_Buffer[i];
   counter++;
   pfi->FileCurPos++;
   pfi->FileCurPos%=Init_Arg.BytesPerSector;
   pfi->FileCurOffset++;
   }
           else
    {FAT32_WriteSector(pfi->FileCurSector,FAT32_Buffer);
        goto end;}
  }
FAT32_WriteSector(pfi->FileCurSector,FAT32_Buffer);
}  
end:
   return len;
}

使用特权

评论回复
31
znmcu|  楼主 | 2009-12-28 21:27 | 只看该作者
好,不错,在znFAT的基础上又有创新

使用特权

评论回复
32
mcuisp| | 2009-12-28 22:10 | 只看该作者
如果不玩长文件名的话,FAT不难。
要多结合嵌入式系统地实际需求。
我碰到过很多需要用文件系统的场合,最后都用巧妙的方法避免了哈希表的缺陷。

使用特权

评论回复
33
znmcu|  楼主 | 2009-12-28 22:37 | 只看该作者
znFAT最初基于51单片机开发,所以作到比较精简,同时功能较为完备



长名我已经实现,不过没有加入到这个版本中。

使用特权

评论回复
34
znmcu|  楼主 | 2009-12-28 22:40 | 只看该作者
znFAT最初基于51,现已经移植到AVR STM32 DSP2812 NIOSII 等CPU上

谢谢关注,其实znFAT的初衷在于研究FAT32内部技术,教学的性质。
后来开始在我自己和别人的项目和实验里使用,比较满意。

使用特权

评论回复
35
hpy013| | 2009-12-28 23:58 | 只看该作者
GOOD MAN, and GOOD WORK

使用特权

评论回复
36
ngyg12| | 2010-11-21 21:18 | 只看该作者
想 问问 znFAT 的速度怎么样啊?

使用特权

评论回复
37
f1038285376| | 2012-4-4 14:43 | 只看该作者
振南阿,有没有DSP2812的SD卡代码呀 ?!能不能发一份到我的邮箱:1038285376@qq.com

使用特权

评论回复
38
sinonion| | 2012-7-26 09:39 | 只看该作者
无声的支持!

使用特权

评论回复
39
sinonion| | 2012-7-26 09:39 | 只看该作者
等待你的书面世: 《振南的znFAT 单片机上的FAT32文件系统 》

使用特权

评论回复
40
eregister| | 2013-5-22 13:40 | 只看该作者
非常感谢,很好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则