• shanzhongyu
    了解作者
  • C/C++
    开发工具
  • 154KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 9
    下载次数
  • 2017-09-20 11:28
    上传日期
基于51单片机的FAT32文件系统设计源码。软件为keil。单片机STC
FAT32文件系统.rar
  • 程序
  • SDcard
  • SDcard.c
    7KB
  • SDcard.h
    446B
  • datatype
  • datatype.h
    1.1KB
  • szyFAT32
  • szyFAT32.c
    50.5KB
  • szyFAT32.h
    6.8KB
  • main.c
    139B
  • shanFAT32_uvopt.bak
    5.6KB
  • SDcard.obj
    11.6KB
  • shanFAT32.obj
    1.1KB
  • shanFAT32.lnp
    77B
  • shanFAT32.uvopt
    5.6KB
  • szyFAT32.lst
    78KB
  • shanFAT32.uvproj
    13.4KB
  • shanFAT32.__i
    103B
  • SDcard.lst
    12.1KB
  • shanFAT32.M51
    81.6KB
  • shanFAT32.hex
    69KB
  • szyFAT32.obj
    119.3KB
  • shanFAT32_uvproj.bak
    13.2KB
  • main.LST
    1KB
  • shanFAT32.lst
    1KB
  • shanFAT32.uvgui.shan
    68.8KB
  • shanFAT32.plg
    2.2KB
  • main.OBJ
    11.9KB
  • shanFAT32.uvgui_shan.bak
    68.8KB
  • shanFAT32
    120KB
内容介绍
#include<szyFAT32\szyFAT32.h> //#include "ch375.h" //#include "cf.h" #include<SDcard\SDcard.h> #include "string.h" //全局变量定义 struct direntry idata temp_rec; S8 temp_dir_name[13]; U32 temp_dir_cluster; U32 temp_last_cluster; U8 FAT32_Buffer[512]; //扇区数据读写缓冲区,由外部提供 extern struct FAT32_Init_Arg *pArg; //初始化参数结构体指针,用以指向某一存储设备的初始化参数结构体,由外部提供 U8 (*pRS)(U32,U8 *); //指向实际存储设备的读扇区函数的函数指针,用以实现对设备的支持 U8 (*pWS)(U32,U8 *); //指向实际存储设备的写扇区函数的函数指针,用以实现对设备的支持 U8 Dev_No=0; /****************************************************************** 读取存储设备的addr扇区的512个字节的数据放入buf数据缓冲区中 addr:扇区地址 buf:指向数据缓冲区 返回说明:0表示读取扇区成功,否则失败 - 注:这里加入了天狼星精华板上的三种存储设备,即SD卡(有效)、U盘、 CF卡通过在程序中动态的切换不同的设备驱动,从而实现多设备(即同 时对多种存储设备进行操作,比如从SD卡拷贝文件到U盘等等),不同 驱动的切换,只需要在程序中改变Dev_No这个全局变量的值即可 ******************************************************************/ U8 FAT32_ReadSector(U32 addr,U8 *buf) { switch(Dev_No) { case SDCARD: pRS=SD_Read_Sector; break; case UDISK: //pRS=CH375_Read_Sector; break; case CFCARD: //pRS=CF_Read_Sector; //无 break; case OTHER: //无 break; } return (*pRS)(addr,buf); //替换成实际存储器的扇区读函数,这里是SD卡扇区读函数 } /****************************************************************** - 功能描述:znFAT的存储设备底层驱动接口,将buf数据缓冲区中的512个 字节的数据写入到存储设备的addr扇区中 - 隶属模块:znFAT文件系统模块 - 函数属性:内部(用于与存储设备的底层驱动对接) - 参数说明:addr:扇区地址 buf:指向数据缓冲区 - 返回说明:0表示读取扇区成功,否则失败 - 注:略 ******************************************************************/ U8 FAT32_WriteSector(U32 addr,U8 *buf) { switch(Dev_No) { case SDCARD: pWS=SD_Write_Sector; break; case UDISK: //pWS=CH375_Write_Sector; break; case CFCARD: //pWS=CF_Write_Sector; //无 break; case OTHER: //无 break; } return (*pWS)(addr,buf); //替换成实际存储器的扇区写函数,这里是SD卡扇区写函数 } /****************************************************************** - 功能描述:小端转大端,即LittleEndian转BigEndian - 隶属模块:znFAT文件系统模块 - 函数属性:内部 - 参数说明:dat:指向要转为大端的字节序列 len:要转为大端的字节序列长度 - 返回说明:转为大端模式后,字节序列所表达的数据 - 注:比如:小端模式的 0x33 0x22 0x11 0x00 (低字节在前) 转为大端模式后为 0x00 0x11 0x22 0x33 (高字节在前) 所表达的数值为 0x00112233 (CISC的CPU通常是小端的,所以FAT32也设计为小端,而单片机 这种RISC的CPU,通常来说都是大端的,所以需要这个函数将字 节的存放次序进行调整,才能得到正确的数值) ******************************************************************/ U32 LE2BE(U8 *dat,U8 len) { U32 temp=0; U32 fact=1; U8 i=0; for(i=0;i<len;i++) { temp+=dat[i]*fact; //将各字节乘以相应的权值后累加 fact*=256; //更新权值 } return temp; } /****************************************************************** - 功能描述:将小字字符转为大写 - 隶属模块:znFAT文件系统模块 - 函数属性:内部 - 参数说明:c:要转换为大写的字符 - 返回说明:要转换的字节的相应的大写字符 - 注:只对小写字符有效,如果不是a~z的小写字符,将直接返回 ******************************************************************/ S8 L2U(S8 c) { if(c>='a' && c<='z') return c+'A'-'a'; else return c; } /****************************************************************** - 功能描述:读取0扇区,检测有没有MBR(主引导记录) - 隶属模块:znFAT文件系统模块 - 函数属性:内部 - 参数说明:无 - 返回说明:1表示检测到MBR,0表示没有检测到MBR - 注:有些存储设备格式化为FAT32以后,没有MBR,则0扇区就是DBR 如果有MBR,就需要对其进行解析,以得到DBR的扇区位置,同时MBR中 还含分区、分区容量等信息 ******************************************************************/ U8 FAT32_is_MBR() { U8 result; FAT32_ReadSector(0,FAT32_Buffer); if(FAT32_Buffer[0]!=0xeb) { result=1; } else { result=0; } return result; } /*********************************************************************** - 功能描述:得到DBR所在的扇区号(如果没有MBR,则DBR就在0扇区) - 隶属模块:znFAT文件系统模块 - 函数属性:内部 - 参数说明:无 - 返回说明:DBR的扇区地址 - 注:DBR中包含了很多有用的参数信息,因此正确定位DBR扇区的位置,是极为 重要的,后面将有专门的函数对DBR进行解析,正确解析DBR是实现FAT32的 基础 ***********************************************************************/ U16 FAT32_Find_DBR() { U16 sec_dbr; FAT32_ReadSector(0,FAT32_Buffer); if(FAT32_Buffer[0]!=0xeb) { sec_dbr=LE2BE(((((struct PartSector *)(FAT32_Buffer))->Part[0]).StartLBA),4); } else { sec_dbr=0; } return sec_dbr; } /*********************************************************************** - 功能描述:获取分区的总容量 - 隶属模块:znFAT文件系统模块 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:分区容量值,单位为字节 - 注:这里得到的总容量是FAT32分区的容量,一定小于实际的物理容量 ***********************************************************************/ U32 FAT32_Get_Total_Size() { U32 temp; FAT32_ReadSector(pArg->BPB_Sector_No,FAT32_Buffer); FAT32_ReadSector(pArg->BPB_Sector_No,FAT32_Buffer); temp=((LE2BE((((struct FAT32_BPB *)(FAT32_Buffer))->BPB_TotSec32),4)))*pArg->BytesPerSector; return temp; } /*********************************************************************** - 功能描述:读取FSInfo获取最近的一个可用空闲簇 - 隶属模块:znFAT文件系统模块 - 函数属性:内部 - 参数说明:无 - 返回说明:最近的一个可用空闲簇 - 注:FAT32中的FSInfo扇区(绝对1扇区)中记录了最近的一个可用空闲簇 ***********************************************************************/ U32 Search_Last_Usable_Cluster() { FAT32_ReadSector(1+pArg->BPB_Sector_No,FAT32_Buffer); return LE2BE(((struct FSInfo *)FAT32_Buffer)->Last_Cluster,4); } /*********************************************************************** - 功能描述:FAT32文件系统初始化 - 隶属模块:znFAT文件系统模块 - 函数属性:外部,使用户使用 - 参数说明:FAT32_Init_Arg类型的结构体指针,用于装载一些重要的参数信息, 以备后面使用 - 返回说明:无 - 注:在使用znFAT前,这个函数是必须先被调用的,将很多参数信息装入到 arg指向的结构体中,比如扇区大小、根目录的位置、FAT表大小等等。 这些参数绝大部分是来自于DBR的BPB中,因此此函数主要在作对DBR的参数解析 ***********************************************************************/ void FAT32_Init() { struct FAT32_BPB *bpb; bpb=(struct FAT32_BPB *)(FAT32_Buffer); //将数据缓冲区指针转为struct FAT32_BPB 型指针 pArg->DEV_No=Dev_No; //装入设备号 pArg->BPB_Sector_No =FAT32_Find_DBR(); //FAT32_FindBPB()可以返回BPB所在的扇区号 pArg->BPB_Sector_No =FAT32_Find_DBR(); //FAT32_FindBPB()可以返回BPB所在的扇区号 pArg->Total_Size =FAT32_Get_Total_Size(); //FAT32_Get_Total_Size()可以返回磁盘的总容量,单位是字节 pArg->Total_Size =FAT32_Get_Total_Size(); //FAT32_Get_Total_Size()可以返回磁盘的总容量,单位是兆 pArg->FATsectors =LE2BE((bpb->BPB_FATSz32) ,4);//装入FAT表占用的扇区数到FATsectors中 pArg->FirstDirClust =LE2BE((bpb->BPB_RootClus) ,4);//装入根目录簇号到FirstDirClust中 pArg->BytesPerSector =LE2BE((bpb->BPB_BytesPerSec),2);//装入每扇区字节数到BytesPerSector中 pArg->SectorsPerClust =LE2BE((bpb->BPB_SecPerClus) ,1);//装入每簇扇区数到SectorsPerClust 中 pArg->FirstFATSector =LE2BE((bpb->
评论
    相关推荐