最精简的文件系统 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 ,
太实用了, 当然了,有一些功能限制,但是,没有最好的,只有最适合的。
用它来和电脑交换文件数据,不要太好。
把楼主移植的这个文件系统用起来的,
【免费+包邮 送】 超级强大的 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)
如果能外扩flash就更完美了 本帖最后由 tzz1983 于 2024-8-31 12:04 编辑
soma 发表于 2024-8-31 11:59
如果能外扩flash就更完美了
可以外扩flash,就是改接口函数就行了.
这只是个例子呀,用内部EEPROM是为了方便大家体验.
谢谢分享 感谢分享 DebugLab 发表于 2024-8-31 13:40
是个细心的人,音频总线是i2s <p>感谢分享</p>
<p>打卡学习</p>
页:
[1]