tzz1983 发表于 2024-8-31 10:28:12

最精简的文件系统 Petit FATFS@AI8051U内核

本帖最后由 tzz1983 于 2024-9-1 20:35 编辑

AI8051U, 免费 嵌入式 FAT 文件系统
FATFS 作为一个长期霸榜的免费嵌入式FAT文件系统,其稳定性自然不用多说了。
此贴介绍的是FATFS的一个子集 Petit FATFS 在AI8051U内核上的应用。
引用官网的 Petit FATFS 的介绍:

[*]非常小的内存消耗 44 字节RAM
[*]非常小的代码大小 2K 左右 ROM
[*]支持 FAT12FAT16FAT32

可以看到,Petit FATFS 非常精巧,仅需44字节RAM即可运行,
作为FATFS的子集,仅支持基本读写功能,功能上的限制如下:

[*]只支持一个卷,同一时刻只打开一个文件,(即当打开一个文件的同时,上一个打开的文件自动关闭了)
[*]不支持长文件名,没有格式化功能,不支持时间戳.
[*]写入操作的限制,只能改写现有的文件的内容,不能在文件未尾追加数据而使文件变大,也不能创建新的文件.

移植到AI8051U:

[*]在官网下载最新代码后,将source文件夹复制项目文件夹
[*]项目内添加 pff.c   diskio.c
[*]添加三个磁盘接口函数,官方已给出了框架,只要在函数内填入自己的代码就可以了,比较简单(见例程)

移植感言: 太顺利了,文件拉进项目直接编译就是0错0警,这搞得我有点不太适应啊,^_^

应用笔记: 先挂载文件系统, 接着打开文件
* 读文件比较简单 FRESULT pf_read (void* buff, UINT btr, UINT* br);
* 第一个参数是数据指针, 第二个参数是期盼读取的字节数量, 第三个参数是返回实际读取到的字节数量.
* 函数运行过后,如果 *br<btr, 则说已经读到文件未尾, 没有更多的数据可读了.
* 返回值 0 表示没有错误, 其它为错误编号.
*
* 写操作需要遵守一定的序列:
* 第一步: 用pf_lseek()设定文件指针, 注意, 必须对齐扇区边界.
* 第二步: pf_write()写入数据,参数和读时差不多,函数操作后, 可判断返回值是否发生错误.
* 如果 *bw<btw, 则说已经写到文件未尾, 此版本不可追加数据, 额外的写入将被忽略.
* 可反复调用pf_write()持续写入数据.
* 第三步: 见演示代码, 传入NULL指针和0长度参数,将缓存数据立即写入磁盘,此步不可缺少.
* 三个步骤,缺省任何一步都可能写入失败, 如果缺少第一步, FAT将四舍五入自动对齐到扇区边界,
   如果是这样,你自己都不知道你的数据写到哪去了


动手实践:
由于 Petit FATFS 没有格式化功能, 我们借助AI32G的MSC例程,
将AI32G12K128的最后64KEEPROM 格式化为一个 64KB的小U盘。
MSC例程包:,
硬件为屠龙刀,或任意AI32G12K128为芯片的实验板。
注意以下几个地方要选择正确:


将MSC(Mass Storage Class)协议范例的代码下载到芯片,
用Type-C接口重新上电,电脑上将会看一个64KB的小U盘,
格式化后,顺带将项目的 main.c 复制到U盘,等会可以用Petit FATFS 打开文件查看内容。

以上操作就绪后,重新上电,将本例程的Petit FATFS演示代码烧入。
同时打开ISP桌面软件的CDC串口助手
激动人心的时刻到了:


Petit FATFS 正确的读出了main.c的文件内容,并将其打印到了CDC串口。

代码如下:
    printf("演示Petit FATFS读写文件\n");   
    if( pf_mount(&fs) ){ //第一步: 用 pf_mount() 挂载文件系统
      printf("挂载文件系统失败");
      while(1);
    }
    printf("已挂载文件系统\n");      
    if( pf_open("main.c") ){//第二步,用 pf_open 打开文件,如果文件在根目录,可以省去路径,直接文件名即可
      printf("打开文件失败");
      while(1);
    }
    printf("已打开文件 main.c \n");      
   
    ret = pf_read(text,512,&br);//读文件内容, 请看下面的应用笔记
    if( (ret==RES_OK) && (br>0) ){
      printf("FATFS读取到 main.c 的内容为:\n");
      UartSend(text,br);
    }   

   //写文件
    pf_lseek(512);      //指定文件指针,传入的参数必须对齐扇区边界, 即能整除512, 从扇区的零偏移处开始写入
    pf_write("\n//这是我用 Petit FATFS 改写的内容\n",sizeof("\n//这是我用 Petit FATFS 改写的内容\n"),&bw);
    pf_write("\n//可以反复持续写入\n",sizeof("\n//可以反复持续写入\n"),&bw);
    pf_write(0,0,&bw);//重要!!! 此句不可缺省, 前两个参数为都是0,表示本次写操作已结束,缓存立即写入磁盘
   
    printf("\n\nDEMO END");

演示例程包:


Petit FATFS 是我见过的最为精简的FAT文件系统,44 RAM + 2K ROM ,
太实用了, 当然了,有一些功能限制,但是,没有最好的,只有最适合的。
用它来和电脑交换文件数据,不要太好。

神农鼎 发表于 2024-8-31 11:10:08


把楼主移植的这个文件系统用起来的,
【免费+包邮 送】 超级强大的 AI8051U 实验箱 !!!


AI8051U全球大学计划,研发实验箱原理图定稿
===支持 1T 8051指令集和32位8051指令集
AI8051U 研发演示程序发布,史无前例,无比强大 的 实验程序
===2024/8/26 第4次
AI8051U 将是第20届全国大学生智能汽车竞赛推荐参赛芯片
PWM@135MHz
TFPU@108MHz 以上,实际测试可以到 135MHz
===硬件三角函数,硬件浮点运算器
CPU32@42MHz
DMA 支持外设直接到外设

      AI 32位8051
8 0 5 1凌绝顶,核心算力在哪里 !
算力一日同风起,扶摇直上九万里 !
百兆硬件真浮点,三角函数运算器 !
神州春色三万里,封神榜永远是你 !
===老骥伏枥志在万里,来我们再战三万里

AI8051U最新数据手册下载
深圳国芯人工智能有限公司-产品_AI8051U系列 (stcai.com)


AI8051U实验箱 原理图 / PCB 定稿,研发程序首次发布
从下面这个链接下载原理图/PCB和开源程序
深圳国芯人工智能有限公司-实验箱 (stcai.com)

soma 发表于 2024-8-31 11:59:41

如果能外扩flash就更完美了

tzz1983 发表于 2024-8-31 12:03:12

本帖最后由 tzz1983 于 2024-8-31 12:04 编辑

soma 发表于 2024-8-31 11:59
如果能外扩flash就更完美了
可以外扩flash,就是改接口函数就行了.
这只是个例子呀,用内部EEPROM是为了方便大家体验.

DebugLab 发表于 2024-8-31 13:40:35


wlhet 发表于 2024-11-1 13:59:18

谢谢分享

angalp 发表于 2024-11-2 13:35:15

感谢分享

angalp 发表于 2024-11-2 13:39:40

DebugLab 发表于 2024-8-31 13:40


是个细心的人,音频总线是i2s

lgnstar 发表于 2024-12-7 09:20:58

<p>感谢分享</p>

STC企鹅 发表于 2024-12-8 23:56:49

<p>打卡学习</p>
页: [1]
查看完整版本: 最精简的文件系统 Petit FATFS@AI8051U内核