机缘

在做一个单片机嵌入操作系统,需要使用文件系统,移植了开源的ff文件系统,感觉还是有很多问题,刚好疫情居家办公,4月1日愚人节这天从头开始写了这个单片机文件系统,已经有了FAT12,FAT16,FAT32,
这个文件系统足够小,几乎目前所有单片机都可以用,所以我就命名为FAT8,今天是第一个版本就叫V0.0.1吧。
直接上代码:

#include "fat8.h"
/*
单片机简易文件系统FAT8  v 0.0.1 适合小容量单片机文件存取
第一个块做为文件分配表,每16个字节一个分区,
第0个分区做为磁盘卷,记录卷名,文件数量,
第1个分区以后记录每个文件使用块,文件大小
删除文件只要把文件分区第一个字节清0就可以释放空间
每个文件最大4094个字节,预留下一个版本超过一个块,
最后两个字节为下一个块。
Copyright Quanzhou wuxin technology co.,ltd 2022-4-1 DaixiaoBin Email:949000@qq.com
*///根据Flash 类型在这里配置好多少块,每个块多少字节开始地址
#define FS_SECTOR_NUM     74
#define FS_SECTOR_SIZE    4096
#define FS_START_ADDRESS  0x11036000u32 disk_size=FS_SECTOR_NUM*FS_SECTOR_SIZE;
u32 falsh_fat_start=FS_START_ADDRESS;
u8 fat8_buff[FS_SECTOR_SIZE];u8  disk_read (u8 *buff, int sector, int count){int result;//  printf("R:%d ", sector);if (sector>=FS_SECTOR_NUM){printf("\r\nwrtie err sector",sector);}result = hal_flash_read(FS_START_ADDRESS+sector*FS_SECTOR_SIZE,buff,count);return result;
}#if 1 //FAT8_READONLY==0
u8 disk_write (u8 *buff, int sector, int count){int result,x;//  LOG("\r\nW:%d:", sector);if (sector>=FS_SECTOR_NUM){printf("\r\nwrtie err sector",sector);}hal_flash_erase_sector(FS_START_ADDRESS+sector*4096);  result = hal_flash_write(FS_START_ADDRESS+sector*FS_SECTOR_SIZE,buff,count);printf("**result=%d**\r\n",result);    return result;
}#endifvoid read_sec(int sector){int x;disk_read(fat8_buff,sector,256);
printf("\r\nRead sector (%d)\n",sector);for (x=0;x<256;x++){if (x%16==0)printf("\n[%02X]:",x);printf("%02X ",fat8_buff[x]);}printf("\r\n____________________\r\n");}void mx_format(u32 add,int sector){int x;printf("\r\nFormating.");falsh_fat_start=add;memset(fat8_buff,0,4096);strcpy(fat8_buff,"microio\0");disk_write(fat8_buff,0,FS_SECTOR_SIZE);//擦除所有文件区域
#if 1
for (x=1;x<sector;x++){hal_flash_erase_sector(FS_START_ADDRESS+sector*4096);
//  disk_write((u8 *)&FAT0,x,FS_SECTOR_SIZE);printf(".");}
#endif  printf("\r\nformat success Sector %d disk free %d",sector,sector*FS_SECTOR_SIZE);}void mx_del(u8 fid){//读出文件分配表
if (fid==0)return;disk_read(fat8_buff,0,FS_SECTOR_SIZE);
printf("\r\ndel %s",fat8_buff[fid*16]);//删除掉指定的fid
fat8_buff[fid*16]=0;
//文件数量减1
fat8_buff[12]=fat8_buff[12]-1;
//写回去文件分配表
disk_write(fat8_buff,0,FS_SECTOR_SIZE); }u8  mx_creat(u8 * name,int len){u8 fid=0;disk_read(fat8_buff,0,FS_SECTOR_SIZE);printf("\r\ncreat %s",name);for(fid=1;fid<255;fid++){if (strcmp((char *)&fat8_buff[fid*16],name)==0){printf("\r\nError %s file is exist");
return 0;}  }for(fid=1;fid<255;fid++){//判断是否有文件if (fat8_buff[fid*16]==0){//没有文件创建文件memcpy(&fat8_buff[fid*16],name,8);//写入第一个块为文件开始,如果文件超过4K最后2个字节指定到另外一个块fat8_buff[fid*16+8]=fid;fat8_buff[12]=fat8_buff[12]+1;//写回FAT表disk_write(fat8_buff,0,FS_SECTOR_SIZE);   //返回文件开始块return fid;}
}   return fid;
}//打开文件,如果不存在就创建
u8  mx_open(u8 * name,u8 mode){u8 fid=1;
disk_read(fat8_buff,0,FS_SECTOR_SIZE);
printf("\r\nopen %s",name);for(fid=1;fid<16;fid++){if (strcmp((char *)fat8_buff[fid*16],(char *)name)==0)return fid;}if (mode==1){fid=mx_creat(name,0);read_sec(0);}
return fid;
}int mx_read(u8 fid,u8 * buff,int len){if (fid==0)return 0;  disk_read(buff,fid,len);
return len;
}int mx_write(u8 fid,u8 * buff,int len){//disk_read(fat8_buff,0,FS_SECTOR_SIZE);printf("\r\nwirte len=%d:",len);if ((len>FS_SECTOR_SIZE)||(fid==0)){printf("\r\nError file len max is %d fid=%d",FS_SECTOR_SIZE,fid);return 0;}disk_write(buff,fid,len);disk_read(fat8_buff,0,FS_SECTOR_SIZE);fat8_buff[fid*16+11]=len>>8;fat8_buff[fid*16+10]=len&0xff;disk_write(fat8_buff,0,4096);return len;
}int  mx_colse(u8 file){return 0;}//查看剩余容量
int mx_free(void){disk_read(fat8_buff,0,FS_SECTOR_SIZE);printf("\r\n\r\nDisk Volume:%s %d files ,use %d Bytes\r\nFree %d Bytes!",fat8_buff,fat8_buff[12],fat8_buff[12]*4096,(FS_SECTOR_NUM-fat8_buff[12])*4096);return (FS_SECTOR_NUM-fat8_buff[12])*4096;}int  mx_dir(void){u8 fid;
u8 files=0;
char temp[10]={0};
int len;
printf("\r\n_______________________________________\r\n\r\n");disk_read(fat8_buff,0,FS_SECTOR_SIZE);printf("Volume:%s direcort\r\nM:\\",(char *)fat8_buff);for(fid=1;fid<255;fid++){//    printf(" %c ",fat8_buff[fid*16]);if(fat8_buff[fid*16]>0){files++;memcpy(temp,&fat8_buff[fid*16],8);temp[8]=0;len=fat8_buff[fid*16+11];len=len<<8|fat8_buff[fid*16+10];printf("\r\n %d . [%d] %s.mio  %dbytes  ",files,fid,(char *)temp,len);}}mx_free();printf("\r\n_______________________________________\r\n");return files;}void fat_test(void){u8 tbuff[100];u8 fil=0;  read_sec(0);//判断是否有文件分配表if ((fat8_buff[0]!='m')||(fat8_buff[8]==0xff)){//没有文件表格式化          mx_format(FS_START_ADDRESS,FS_SECTOR_NUM);}mx_free();fil=mx_open("abcd",1);//第一次写文件mx_write(fil,"wuxin ",6);mx_read(fil,tbuff,6);LOG(tbuff);mx_free();
//第二次写文件for (fil=0;fil<100;fil++)tbuff[fil]=fil;fil=mx_open("abcd",1);if (fil)mx_write(fil,tbuff,100);mx_free();
//第三次写入for (fil=100;fil<200;fil++)tbuff[fil-100]=0xaa;fil=mx_open("xxxx",1);if (fil)mx_write(fil,tbuff,100);
//读出read_sec(fil);fil=mx_open("yyyy",1);fil=mx_open("zzzz",1);//mx_del(fil);mx_dir();}/* Copyright Quanzhou wuxin technology co.,ltd 2022-4-1 DaixiaoBin Email:949000@qq.com*/

下面是fat8.h

#ifndef __FAT8H__
#define __FAT8H__
#include "mx_inc.h"#define FAT8_READONLY (0)typedef struct {char file_name[8];
u32 start_add;
u32 use_len;
}FAT_FILE;typedef struct {char volume[8];
u32 total_len;
u32 use_len;
FAT_FILE  files[255];
}FAT8;
u8  disk_read (u8 *buff, int sector, int count);
u8 disk_write (u8 *buff, int sector, int count);
void format(u32 add,int sector);
void read_sec(int sector);
void fat_test(void);#endif

就一天时间,时间比较匆忙,还没来的及整理代码,有喜欢的朋友整理好可以交流。
QQ:949000

原创:FAT8单片机 Flash文件系统V0.0.1相关推荐

  1. ARM单片机FATFS文件系统的移植

    ARM单片机FATFS文件系统的移植 测试效果 前提条件 下载所需源码 FATFS 文件系统 SFUD万能驱动 加入工程 接口驱动 测试代码 FreeRTOS10.0.1 FATFS FF14A SF ...

  2. linux flash文件读取,一种基于Linux的flash文件系统存储策略

    摘要:随着嵌入式系统的广泛应用,嵌入式系统中的数据存储和数据管理显得日益重要.本文主要介绍flash存储器的存储特点,Linux文件系统的两类存储策略:块式存储和线性存储,并在此基础上提出了一种改进的 ...

  3. 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...

    (原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询) /************************************************************ ...

  4. c语言中flash文件系统,适宜于嵌入式多媒体应用的Flash文件系统

    随着电子技术的不断发展,嵌入式系统越来越多地在控制类.消费类.通讯类等电子产品广泛应用,并且随着数字信号处理与人机交互界面等相关技术的不断成熟,嵌入式多媒体应用数量也逐渐上升.多媒体业务的数据量大,数 ...

  5. flash文件系统实现原理

    flash文件系统实现原理 http://www.dpj.com.cn/  网址 摘要:在深入分析TI为开发DSP提供的RTS.LIB(RTS.SRC为源泉代码)的基础上,介绍对自定义的文件和设备的操 ...

  6. 矩阵键盘逐行扫描C语言,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf...

    (原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf /***************************************************** ...

  7. 串行FLASH文件系统FatFs---转自野火论坛

    为了支持长文件名,需要用到FATFS源码中的cc936.c的两个函数ff_convert,ff_wtoupper:这里面直接用了两个大数组(127KB)来做unicode转gbk(OEM)的对照表,这 ...

  8. STM32-串行FLASH文件系统FatFs

    串行FLASH文件系统FatFs FatFs官方链接 FatFs文件系统的源码可以从FatFs官方下载:官方链接http://elm-chan.org/fsw/ff/00index_e.html Fa ...

  9. Linux flash 文件系统剖析

    文章出自:http://www.ibm.com/developerworks/cn/linux/l-flash-filesystems/ 您之前可能听说过 Journaling Flash File ...

最新文章

  1. 安卓音乐播放器开发实例
  2. java 异常何时抛出_何时适合抛出异常?
  3. MQTT再学习 -- 安装MQTT客户端及测试
  4. VTK:点定位器可视化用法实战
  5. 学习笔记(44):Python实战编程-单击事件
  6. linux kill进程后黑屏,Linux中Kill进程的N种方法
  7. NOIP模拟测试28「阴阳·虎·山洞」
  8. 怎么在QQ浏览器上使用微信聊天?
  9. 医学专业考计算机三级,2020年9月中国医科大学计算机等级考试报名通知
  10. 深度拷贝 java_java 深度拷贝 复制 深度复制
  11. DateUtils工具类
  12. matlab神经网络训练方法,matlab神经网络训练图
  13. 电脑版微信不显示头像
  14. uni-app中$navigateTo失效
  15. DBeaver解决连接Oracle之后出现库名为数字问题
  16. 空调遥控器c语言源码,51单片机格力空调遥控器设计源码
  17. 王浩:哥德尔思想概说
  18. 会声会影2020软件新增功能详情
  19. 电子琴节奏包制作_制作MIDI电子音乐离不开的三件“法宝”
  20. proe服务器高速缓存位置,Proe优化设置教程,教你proe提高显示速度及质量的设置方法...

热门文章

  1. 帝国CMS后台登陆验证码不显示的解决方法
  2. 如何开发React Native 原生模块(Native Modules)?看完这篇文章就够了(Android)
  3. 对于CRITICAL_SECTION用法的介绍和理解
  4. 服务器上运行Selenium
  5. 值得收藏,PADS转Allegro详解
  6. FLV视频封装格式详解
  7. 用了这么久的热插拔 才知道原理是什么
  8. dvi显卡连接html显示器,显示器中的DVI接口显卡怎么切换成VGA接口?
  9. office2007 doc 转 pdf
  10. iPad 上 PDF-Expert 同步坚果云中的 pdf