[STM32F3] F3标准库驱动SD卡的驱动

[复制链接]
1583|5
 楼主| eurphan 发表于 2015-12-31 10:56 | 显示全部楼层 |阅读模式
弄了三天了,还是驱动不了,哪位好心人有程序的能共享下吗
gejigeji521 发表于 2015-12-31 11:48 | 显示全部楼层
stm32 sd卡驱动程序,你看看可以用不。 For STM32.rar (2.6 MB, 下载次数: 17)



wahahaheihei 发表于 2015-12-31 13:50 | 显示全部楼层
  1. /******************************************************************************

  2. * SD_driver.h

  3. * 定义与SD卡操作相关的硬件平台配置
  4.   并对SD卡底层驱动函数进行声明
  5.   
  6. * 第一作者:  纪成   (第四届摄像头)
  7.   完善与整理:孙文健 (第六届摄像头)
  8. * 版本:V1.15 (与V1.13、v1.14版相兼容,不使能双缓存时与V1.10之后的版本相兼容)
  9. * 版本更新时间:2012年1月30日
  10.   
  11. * 主控芯片:MK10N512VMD100
  12.   开发平台:CodeWarrior 10.1

  13. * (!!!更改硬件平台后必须修改!!!)

  14. ******************************************************************************/

  15. #ifndef _SD_PLATFINTERFACE_H_
  16. #define _SD_PLATFINTERFACE_H_

  17. #include "stm32f10x.h"    /***********包含spi.c*********/

  18. /**************************************硬件配置定义**************************************/           
  19. /* STM32F107SPI1端口配置 */
  20. #define SPI_SD                      SPI2
  21. #define SPI_SD_CLK                  RCC_APB1Periph_SPI2

  22. #define SPI_SD_SCK_PIN              GPIO_Pin_13
  23. #define SPI_SD_SCK_PORT             GPIOB
  24. #define SPI_SD_SCK_CLK              RCC_APB2Periph_GPIOB

  25. #define SPI_SD_MISO_PIN             GPIO_Pin_14
  26. #define SPI_SD_MISO_PORT            GPIOB
  27. #define SPI_SD_MISO_CLK             RCC_APB2Periph_GPIOB

  28. #define SPI_SD_MOSI_PIN             GPIO_Pin_15
  29. #define SPI_SD_MOSI_PORT            GPIOB
  30. #define SPI_SD_MOSI_CLK             RCC_APB2Periph_GPIOB

  31. #define SPI_SD_CS_PIN               GPIO_Pin_1      
  32. #define SPI_SD_CS_PORT              GPIOB   
  33. #define SPI_SD_CS_CLK               RCC_APB2Periph_GPIOB  

  34.            

  35. /*底层参数定义*/
  36. #define DELAY_WaitRead_SD  0   /* 读取1Byte数据时进行的延时(单位10个nop) */
  37. /* 该延时时间的长短视处理器特性与硬件电路稳定性而定,对于K10,若想使SPI时钟超过10M,则需要约2us的延时 */

  38. /**************************数据类型定义**************************/
  39. typedef unsigned char  byte_sd;      /*定义字节型变量*/
  40. typedef unsigned short word_sd;      /*定义字型变量*/
  41. typedef unsigned long  dword_sd;     /*定义双字型变量*/

  42. #define  ON_SD_CS           GPIO_ResetBits(SPI_SD_CS_PORT, SPI_SD_CS_PIN)   /*开启CS(注意0为选通)*/
  43. #define  OFF_SD_CS          GPIO_SetBits(SPI_SD_CS_PORT, SPI_SD_CS_PIN)     /*关闭CS(注意0为选通)*/

  44. #define DELAY_TIME 2000 //SD卡的复位与初始化时SPI的延时参数,根据实际速率修改其值,否则会造成SD卡复位或初始化失败
  45. #define TRY_TIME 200   //向SD卡写入命令之后,读取SD卡的回应次数,即读TRY_TIME次,如果在TRY_TIME次中读不到回应,产生超时错误,命令写入失败

  46. //错误码定义
  47. //-------------------------------------------------------------
  48. #define INIT_CMD0_ERROR     0x01 //CMD0错误
  49. #define INIT_CMD1_ERROR     0x02 //CMD1错误
  50. #define WRITE_BLOCK_ERROR   0x03 //写块错误
  51. #define READ_BLOCK_ERROR    0x04 //读块错误
  52. //-------------------------------------------------------------

  53. extern byte_sd SD_Reset(void);
  54. extern byte_sd SD_Init(void);
  55. extern void SD_driver_Init(void);
  56. extern byte_sd SD_Write_Sector(unsigned long addr,unsigned char *Buffer);
  57. extern byte_sd SD_Read_Sector(unsigned long addr,unsigned char *buffer);

  58. #endif


wahahaheihei 发表于 2015-12-31 13:51 | 显示全部楼层
  1. /******************************************************************************

  2. * SD_System.h

  3. * 定义是否使能SD卡(通过定义"EN_SD");
  4.   定义sd卡系统的相关常量;
  5.   对全局变量以及接口函数进行声明
  6.    
  7. * 第一作者:  纪成   (第四届摄像头)
  8.   完善与整理:孙文健 (第六届摄像头)
  9. * 版本:V1.15 (与V1.13、v1.14版相兼容,不使能双缓存时与V1.10之后的版本相兼容)
  10. * 版本更新时间:2012年1月30日

  11. ******************************************************************************/
  12.                        
  13. #ifndef _SD_SYSTEM_H_   
  14. #define _SD_SYSTEM_H_


  15. #define EN_SD     /* !!!注释掉该句则屏蔽SD卡!!! */

  16. #ifdef EN_SD

  17. /**************************功能配置**************************/
  18. #define EN_SDbuf       /* !!!注释掉该句则不使用SD双缓存模式!!! */
  19. /*
  20. 使用双缓存会增加520字节左右的RAM开销,但在大数情况下会增加SD卡的写入速度
  21. 注意:如果卡的质量太差(即坏扇区过多,这种方法不仅不会加快速度,反而会略微降低写入速度)
  22. */
  23. #define EN_Cnt_SDbuf   /* !!!注释掉该句则不进行SD第二缓存使用情况的统计!!! */
  24. /*
  25. 增加缓存统计功能会额外消耗10字节内存,并略微降低运行速度
  26. */


  27. #include "./SD_driver.h"            

  28. /**************************数据常量定义**************************/
  29. #define SD_MAX_cluster 700  /*一个文件最大可能占的簇数(按8个扇区一簇的话,700大约为1min)*/
  30. #define SD_MAX_segment 35   /*最多的簇组数(一个簇组可能有1-250个簇)*/

  31. #define SD_LONG_Wait   2000000L /*等待SD卡的长延时时限*/
  32. #define SD_SHORT_Wait  5000L    /*等待SD卡的短延时时限*/
  33. #define SD_VST_Wait    4000L    /*等待SD卡的超短延时时限*/

  34. //SD卡错误类型对应表      /************By Sword************/
  35. //(在线仿真时可观察变量flag_err_sd的值,然后按照其值查该表就可知道SD卡出错的具体情况)
  36. #define SD_Normal            0   //SD卡初始化正常
  37. #define SDERR_CMD0           1   //发送CMD0指令时出错
  38. #define SDERR_ACMD41         2   //发送ACMD41指令时出错
  39. #define SDERR_ReadOverTime   3   //读取超时
  40. #define SDERR_StartSector    4   //启动扇区出错
  41. #define SDERR_NoCluster      5   //没有找到足够的簇
  42.    
  43.    
  44. /*IO操作定义*/
  45. #define  ON_SD_CS           GPIO_ResetBits(SPI_SD_CS_PORT, SPI_SD_CS_PIN)   /*开启CS(注意0为选通)*/
  46. #define  OFF_SD_CS          GPIO_SetBits(SPI_SD_CS_PORT, SPI_SD_CS_PIN)     /*关闭CS(注意0为选通)*/

  47.      
  48. /**************************全局变量声明**************************/                     
  49. extern byte_sd sd_yes;          /* 判断是否用SD卡(没有为0,有为1) */
  50. extern byte_sd flag_sdhc;       /* sdhc卡标志,=1有效 */
  51. extern byte_sd flag_test_sd;    /* 调试使用 */  
  52. extern byte_sd flag_err_sd;     /* SD出错标志 */
  53. extern byte_sd Flag_SDRdy;      /* SD卡就绪标志(=1表SD卡就绪) */
  54. extern byte_sd sd_initover;     /* SD卡初始化结束标志 */

  55. #ifdef EN_SDbuf
  56. #ifdef EN_Cnt_SDbuf
  57. extern word_sd Cnt_SDbufS1,Cnt_SDbufS2,Cnt_SDbufS3,Cnt_SDbufS4,Cnt_SDbufS5;
  58. #endif
  59. #endif



  60. /**************************API函数声明**************************/
  61. /*API函数*/
  62. extern void writebyte_ram(byte_sd wdata); /*写字节到ram区*/
  63. extern void write_stop(void);/*停止写*/
  64. extern void SD_System_Init(void); /************By Sword************/
  65. extern void SD_System_Init_Ext(byte_sd * pbuf , word_sd len);
  66. extern void test_sd(void);        /************By Sword************/

  67. /*Fat32操作*/
  68. extern void writeram_sd(void); /*ram区满512时写SD卡*/
  69. extern void search_addr_sd(void); /************By Sword************/
  70. extern void search_fat(void);     /************By Sword************/
  71. extern void fat32_init(void);     /************By Sword************/

  72. #endif

  73. #endif


wahahaheihei 发表于 2015-12-31 13:52 | 显示全部楼层
  1. #ifndef __ZNFAT_H__
  2. #define __ZNFAT_H__

  3. #include "mytype.h" //类型重定义

  4. /*******************************************************

  5.         +-----------------------------------------+
  6.         |振南电子 原创程序模块 znFAT文件系统 5.01 |
  7.         +-----------------------------------------+

  8.   此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
  9.         严禁随意用于商业目的,违者必究,后果自负
  10.          振南电子
  11.              ->产品网站 http://www.znmcu.cn/
  12.              ->产品论坛 http://bbs.znmcu.cn/
  13.              ->产品网店 http://shop.znmcu.cn/
  14.              ->产品咨询 QQ:987582714 MSN:yzn07@126.com
  15.                         WW:yzn07
  16. 说明:znFAT经多方测试,确保其正确性与稳定性,请放心使用,
  17.       如有bug敬请告知,谢谢!!                                  
  18. ********************************************************/

  19. #define SOC(c) (((c-pArg->FirstDirClust)*(pArg->SectorsPerClust))+pArg->FirstDirSector) // 用于计算簇的开始扇区 (c-根目录第一个簇)*每个簇扇区数+根目录的起扇区
  20. #define DEVS 1 //这里表明存储设备的个数,这里只有1个存储设备,就是SD卡

  21. //设备表
  22. #define SDCARD 0 //SD卡
  23. #define UDISK  1 //U盘
  24. #define CFCARD 2 //CF卡
  25. #define OTHER  3 //其它
  26.                                  //这里的存储设备表,可以灵活扩充,以实现对更多存储设备的支持
  27. //-------------------------------------------

  28. #define MAKE_FILE_TIME(h,m,s)        ((((unsigned int)h)<<11)+(((unsigned int)m)<<5)+(((unsigned int)s)>>1))        /* 生成指定时分秒的文件时间数据 */
  29. #define MAKE_FILE_DATE(y,m,d)        (((((unsigned int)y)+20)<<9)+(((unsigned int)m)<<5)+((unsigned int)d))        /* 生成指定年月日的文件日期数据 */

  30. //DPT:分区记录结构如下
  31. struct PartRecord
  32. {
  33. UINT8 Active;         //0x80表示此分区有效
  34. UINT8 StartHead;      //分区的开始磁头
  35. UINT8 StartCylSect[2];//开始柱面与扇区
  36. UINT8 PartType;       //分区类型
  37. UINT8 EndHead;        //分区的结束头
  38. UINT8 EndCylSect[2];  //结束柱面与扇区
  39. UINT8 StartLBA[4];    //分区的第一个扇区
  40. UINT8 Size[4];        //分区的大小
  41. };

  42. //MBR:分区扇区(绝对0扇区)定义如下
  43. struct PartSector
  44. {
  45. UINT8 PartCode[446]; //MBR的引导程序
  46. struct PartRecord Part[4];   //4个分区记录
  47. UINT8 BootSectSig0;  //55
  48. UINT8 BootSectSig1;  //AA
  49. };


  50. //FAT32中对BPB的定义如下  一共占用90个字节
  51. struct FAT32_BPB
  52. {
  53. UINT8 BS_jmpBoot[3];     //跳转指令            offset: 0
  54. UINT8 BS_OEMName[8];     //                    offset: 3
  55. UINT8 BPB_BytesPerSec[2];//每扇区字节数        offset:11
  56. UINT8 BPB_SecPerClus[1]; //每簇扇区数          offset:13
  57. UINT8 BPB_RsvdSecCnt[2]; //保留扇区数目        offset:14
  58. UINT8 BPB_NumFATs[1];    //此卷中FAT表数       offset:16
  59. UINT8 BPB_RootEntCnt[2]; //FAT32为0            offset:17
  60. UINT8 BPB_TotSec16[2];   //FAT32为0            offset:19
  61. UINT8 BPB_Media[1];      //存储介质            offset:21
  62. UINT8 BPB_FATSz16[2];    //FAT32为0            offset:22
  63. UINT8 BPB_SecPerTrk[2];  //磁道扇区数          offset:24
  64. UINT8 BPB_NumHeads[2];   //磁头数              offset:26
  65. UINT8 BPB_HiddSec[4];    //FAT区前隐扇区数     offset:28
  66. UINT8 BPB_TotSec32[4];   //该卷总扇区数        offset:32
  67. UINT8 BPB_FATSz32[4];    //一个FAT表扇区数     offset:36
  68. UINT8 BPB_ExtFlags[2];   //FAT32特有           offset:40
  69. UINT8 BPB_FSVer[2];      //FAT32特有           offset:42
  70. UINT8 BPB_RootClus[4];   //根目录簇号          offset:44
  71. UINT8 FSInfo[2];         //保留扇区FSINFO扇区数offset:48
  72. UINT8 BPB_BkBootSec[2];  //通常为6             offset:50
  73. UINT8 BPB_Reserved[12];  //扩展用              offset:52
  74. UINT8 BS_DrvNum[1];      //                    offset:64
  75. UINT8 BS_Reserved1[1];   //                    offset:65
  76. UINT8 BS_BootSig[1];     //                    offset:66
  77. UINT8 BS_VolID[4];       //                    offset:67
  78. UINT8 BS_FilSysType[11]; //                        offset:71
  79. UINT8 BS_FilSysType1[8]; //"FAT32    "         offset:82
  80. };

  81. struct FAT32_FAT_Item
  82. {
  83. UINT8 Item[4];
  84. };

  85. struct FAT32_FAT
  86. {
  87. struct FAT32_FAT_Item Items[128];
  88. };

  89. struct direntry
  90. {
  91. INT8 deName[8];       // 文件名,不足部分以空格补充        UINT8改成INT8
  92. UINT8 deExtension[3];         // 扩展名,不足部分以空格补充
  93. UINT8 deAttributes;           // 文件属性
  94. UINT8 deLowerCase;            // 0
  95. UINT8 deCHundredth;           // 世纪
  96. UINT8 deCTime[2];             // 创建时间
  97. UINT8 deCDate[2];             // 创建日期
  98. UINT8 deADate[2];             // 访问日期
  99. UINT8 deHighClust[2];  // 开始簇的高字
  100. UINT8 deMTime[2];             // 最近的修改时间
  101. UINT8 deMDate[2];             // 最近的修改日期
  102. UINT8 deLowCluster[2];         // 开始簇的低字
  103. UINT8 deFileSize[4];      // 文件大小
  104. };

  105. //FAT32初始化时初始参数装入如下结构体中
  106. struct FAT32_Init_Arg
  107. {
  108. UINT8 DEV_No;

  109. UINT8 BPB_Sector_No;   //BPB所在扇区号
  110. UINT32 Total_Size;      //磁盘的总容量

  111. UINT32 FirstDirClust;   //根目录的开始簇
  112. UINT32  BytesPerSector;        //每个扇区的字节数
  113. UINT32  FATsectors;      //FAT表所占扇区数
  114. UINT32  SectorsPerClust;         //每簇的扇区数
  115. UINT32 FirstFATSector;         //第一个FAT表所在扇区
  116. UINT32 FirstDirSector;         //第一个目录所在扇区
  117. };

  118. struct Date
  119. {
  120. UINT16 year;
  121. UINT8 month;
  122. UINT8 day;
  123. };

  124. struct Time
  125. {
  126. UINT8 hour;
  127. UINT8 min;
  128. UINT8 sec;
  129. };

  130. // Stuctures
  131. struct FileInfoStruct
  132. {
  133. UINT8  FileName[12];       //文件名            UINT8 改成INT8
  134. UINT32  FileStartCluster;   //文件的开始簇

  135. UINT32  FileCurCluster;
  136. UINT32  FileSize;            //文件的当前簇
  137. UINT32  FileCurSector;            //文件的当前扇区
  138. UINT16   FileCurPos;         //文件在当前扇区中的位置
  139. UINT32  FileCurOffset;            //文件的当前偏移量
  140. UINT32  Rec_Sec;            //文件的文件/目录项所在的扇区
  141. UINT16   nRec;               //文件的文件/目录项所在扇区中的位置

  142. UINT8  FileAttr;            //文件属性                               
  143. struct Time    FileCreateTime;            //文件的创建时间
  144. struct Date    FileCreateDate;            //文件的创建日期
  145. struct Time    FileMTime;          //文件的修改时间
  146. struct Date    FileMDate;          //文件的修改日期
  147. struct Date        FileADate;          //文件的访问日期

  148. };

  149. struct FSInfo //FAT32的文件系统信息结构
  150. {
  151. UINT8 Head[4];
  152. UINT8 Resv1[480];
  153. UINT8 Sign[4];
  154. UINT8 Free_Cluster[4];
  155. UINT8 Last_Cluster[4];
  156. UINT8 Resv2[14];
  157. UINT8 Tail[2];
  158. };

  159. UINT8 FAT32_ReadSector(UINT32 addr,UINT8 *buf); //znFAT的与底层存储设备的驱动接口,读取扇区
  160. UINT8 FAT32_WriteSector(UINT32 addr,UINT8 *buf);//znFAT的与底层存储设备的驱动接口,写入扇区

  161. UINT32 LE2BE(UINT8 *dat,UINT8 len); //小端转大端

  162. UINT8 FAT32_is_MBR(void); //是否存在MBR
  163. void FAT32_Analysis_DPT(void); //分析DPT结构
  164. UINT16 FAT32_Find_DBR(void); //定位DBR

  165. UINT32 FAT32_Get_Total_Size(void); //获取总容量
  166. void FAT32_Init(void); //文件系统初始化

  167. UINT32 Search_Last_Usable_Cluster(void); //从获取FSInfo中的下一个可用空闲簇
  168. UINT32 FAT32_Get_Remain_Cap(void); //获取剩余容量

  169. void FAT32_Update_FSInfo_Free_Clu(UINT32 PlusOrMinus); //更新FSInfo的空闲簇的数量
  170. void FAT32_Update_FSInfo_Last_Clu(UINT32 Last_Clu); //更新FSInfo的下一个可用空闲簇

  171. UINT32 FAT32_GetNextCluster(UINT32 LastCluster); //获取下一个簇
  172. UINT32 FAT32_Enter_Dir(INT8 *path); //进入目录
  173. UINT8 FAT32_Open_File(struct FileInfoStruct *pfi,INT8 *filepath,UINT32 item); //打开文件,支持通配
  174. UINT8 FAT32_Seek_File(struct FileInfoStruct *pfi,UINT32 offset); //文件定位
  175. UINT32 FAT32_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf); //读取文件数据
  176. UINT32 FAT32_Read_FileX(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,void (*pfun)(UINT8)); //读取文件数据并进行数据处理
  177. UINT32 FAT32_Find_Free_Clust(unsigned char flag);        //寻找下一个可用的空闲簇
  178. UINT8 FAT32_Create_Rec(struct FileInfoStruct *pfi,UINT32 cluster,INT8 *name,UINT8 is_dir,UINT8 *ptd); //构建文件/目录项
  179. UINT32 FAT32_Add_Dat(struct FileInfoStruct *pfi,UINT32 len,UINT8 *pbuf); //向文件追加数据
  180. UINT8 FAT32_Create_Dir(struct FileInfoStruct *pfi,INT8 *dirpath,UINT8 *ptd); //创建目录,支持创建时间
  181. UINT8 FAT32_Create_File(struct FileInfoStruct *pfi,INT8 *filepath,UINT8 *ptd); //创建文件,支持创建时间
  182. UINT8 FAT32_Del_File(INT8 *filepath); //删除文件
  183. unsigned char FAT32_XCopy_File(struct FAT32_Init_Arg *pArg1,struct FAT32_Init_Arg *pArg2,INT8 *sfilename,INT8 *tfilename,UINT8 *file_buf,UINT32 buf_size,unsigned char *pt); //文件拷贝,支持多设备中文件互拷
  184. UINT8 FAT32_File_Close(struct FileInfoStruct *pfi); //文件关闭
  185. UINT8 FAT32_Rename_File(INT8 *filename,INT8 *newfilename); //文件重命名

  186. #endif


wahahaheihei 发表于 2015-12-31 13:53 | 显示全部楼层
  1. /**********************************************************************************
  2. *
  3. * STM32F107基于固件3.5的工程模版
  4. *创建者:段胜才
  5. *创建时期:2012-09-04
  6. *说明:本工程是的配置是基于JLINK和MDK联合编程,用户所编写的程序都可以放在Users文件夹里面
  7. *
  8. ***********************************************************************************/

  9. #include "stm32f10x.h"
  10. #include "USART.h"
  11. #include "znfat.h"
  12. #include "SD_driver.h"
  13. #include <string.h>


  14. struct FAT32_Init_Arg Init_Arg_SD;           //初始化参数结构体实体
  15. struct FAT32_Init_Arg *pArg;
  16. struct FileInfoStruct  FileInfo;        //文件信息结构体实体
  17. unsigned char file_buf[80];           //文件数据缓冲区,读取到的文件数据放在其中

  18. unsigned char Dev_No=0; //设备号,SDCARD是SD卡设备号的宏定义,根据设备号,znFAT会将底层存储设备驱动连接到相应的存储设备驱动
  19.                         //动态的切换设备号,就可以实现在各种存储设备之间进行切换,这也是znFAT实现多设备的重要手段。比如,我
  20.                                                 //可以将SD卡上的文件拷贝到CF卡或U盘上,这就是多设备的最典型应用

  21. unsigned char  Create_DT[6]={0x12,0x09,0x0d,0x0d,0x14,0x01}; //日期时间 09年07月0d日0d时14分0f秒
  22. char str[40];

  23. main ()
  24. {
  25.    unsigned long  len=0;
  26.    unsigned char item=0;
  27.    Init_All_Periph();

  28.    Usart_SentString_GTM("串口通信测试....\n"); //如果您看到这句,说明串口通信是正确
  29.    UART_Send_Enter();
  30.    //Usart_SentString_GTM("***************************************************\n");
  31.    //Usart_SentString_GTM("**         振南电子 SD卡上的znFAT 演示1          **\n");
  32.   // Usart_SentString_GTM("**            产品网站 www.znmcu.cn              **\n");
  33.   // Usart_SentString_GTM("***         振南电子论坛  bbs.znmcu.cn          ***\n");
  34.    //Usart_SentString_GTM("***************************************************\n");

  35.   // Usart_SentString_GTM("功能描述:\n");
  36.    //Usart_SentString_GTM("    此程序用于测试znFAT的 获取总容量、获取剩余容量。\n");
  37.    //Usart_SentString_GTM("-------------------------串口输出信息--------------------------\n");

  38.    SD_driver_Init();
  39.    SD_Reset();
  40.    SD_Init(); //让SD卡就绪
  41.    Usart_SentString_GTM("SD卡已就绪\n");//您看到这句话,就说明SD卡已经就绪了,可以对它进行读写操作了
  42.    UART_Send_Enter();

  43.    pArg=&Init_Arg_SD; //pArg是znFAT的“初始参数结构指针”,它所指向的结构体中记录了存储器及其文件系统的重要参数信息
  44.                     //在切换存储设备时,不光要更改设备号,还要将pArg指向相应存储设备的“初始参数结构”
  45.    Dev_No=SDCARD; //设备号为SDCARD,znFAT中将其宏定义为 0
  46.    Usart_SentString_GTM("znFAT当前存储设备为SD卡\n");
  47.    UART_Send_Enter();

  48.    FAT32_Init(); //文件系统初始化,使用znFAT前必须进行初始化,初始化过程中将所使用的存储设备的文件系统的一些重要参数
  49.                //记录到了pArg所指向的结构中,以备后面使用
  50.    Usart_SentString_GTM("znFAT初始化完成\n");
  51.    UART_Send_Enter();

  52.    //UART_Put_Inf("总存储容量为(字节):",FAT32_Get_Total_Size());
  53.    //UART_Put_Inf("剩余容量为(字节):",FAT32_Get_Remain_Cap());

  54. #if 0         //打开根目录下的一个文件并读取其内容

  55. if(!FAT32_Open_File(&FileInfo,"\\dsc.txt",0)) //FileInfo是文件信息结构体,用来记录打开的文件的重要参数信息                                                //
  56. {                                                                                                //打开根目录下的znmcu.txt文件,后面的0表示当有多个文件与文件
  57.                                                 //匹配的时候(当然znmcu.txt这种文件名与之匹配的文件只一个,但
  58.                                                                                                 //znFAT是可以支持通配符的,比如*.txt),我们打开符合条件的第
  59.                                                                                                 //一个文件,当然我也可以打开第1个、第2个等等,这无形之中就已
  60.                                                                                                 //经实现了文件的枚举
  61.   Usart_SentString_GTM("打开文件成功\n");
  62.   Usart_SentString_GTM("文件名为:");Usart_SentString_GTM(FileInfo.FileName);        //通过串口输出FileInfo的一些参数
  63.   //UART_Send_Enter();
  64.   UART_Put_Inf("文件大小(字节):",FileInfo.FileSize);
  65.   UART_Put_Inf("文件当前偏移量(字节):",FileInfo.FileCurOffset);
  66.   Usart_SentString_GTM("文件创建时间:\n");
  67.   UART_Put_Num(FileInfo.FileCreateDate.year);Usart_SentString_GTM("年");
  68.   UART_Put_Num(FileInfo.FileCreateDate.month);Usart_SentString_GTM("月");
  69.   UART_Put_Num(FileInfo.FileCreateDate.day);Usart_SentString_GTM("日");
  70.   UART_Put_Num(FileInfo.FileCreateTime.hour);Usart_SentString_GTM("时");
  71.   UART_Put_Num(FileInfo.FileCreateTime.min);Usart_SentString_GTM("分");
  72.   UART_Put_Num(FileInfo.FileCreateTime.sec);Usart_SentString_GTM("秒");
  73.   //UART_Send_Enter();
  74. }
  75. else
  76. {
  77.   Usart_SentString_GTM("打开文件失败\n");
  78. }

  79. len=FAT32_Read_File(&FileInfo,0,FileInfo.FileSize,file_buf); //读取当前打开的文件的全部数据到file_buf是数据缓冲区
  80. file_buf[len]=0; //为了能够把从文件里读出的内容以字符串方式从串口发送出来,最后加入一个'\0'
  81. if(len)
  82. {
  83.   Usart_SentString_GTM("读取文件成功,已放入缓冲区\n");
  84.   UART_Put_Inf("共读出字节:",len);
  85.   UART_Put_Inf("文件当前偏移量(字节):",FileInfo.FileCurOffset);
  86.   Usart_SentString_GTM("读到的内容是:\n");
  87.   Usart_SentString_GTM(file_buf);         //发送读取的内容
  88.   //UART_Send_Enter();         
  89. }
  90. else
  91. {
  92.   Usart_SentString_GTM("读取文件失败\n");
  93. }

  94. FAT32_File_Close(&FileInfo); //关闭文件
  95. Usart_SentString_GTM("文件已关闭\n");

  96. #endif

  97. //********************枚举根目录下所有文件***********

  98. #if 0
  99. Usart_SentString_GTM("枚举根目录下所有文件\n");
  100. while(!FAT32_Open_File(&FileInfo,"\\*.*",item)) //打开与文件名相匹配的第item个文件,item不断自增,从而实现了文件枚举功能
  101. {
  102.   UART_Put_Inf("文件",item++);
  103.   Usart_SentString_GTM("文件名为:");
  104.   Usart_SentString_GTM(FileInfo.FileName);
  105.   UART_Send_Enter();
  106.   UART_Put_Inf("文件大小(字节):",FileInfo.FileSize);
  107.   Usart_SentString_GTM("文件创建时间:\n");
  108.   UART_Put_Num(FileInfo.FileCreateDate.year);Usart_SentString_GTM("年");
  109.   UART_Put_Num(FileInfo.FileCreateDate.month);Usart_SentString_GTM("月");
  110.   UART_Put_Num(FileInfo.FileCreateDate.day);Usart_SentString_GTM("日");
  111.   UART_Put_Num(FileInfo.FileCreateTime.hour);Usart_SentString_GTM("时");
  112.   UART_Put_Num(FileInfo.FileCreateTime.min);Usart_SentString_GTM("分");
  113.   UART_Put_Num(FileInfo.FileCreateTime.sec);Usart_SentString_GTM("秒");
  114.   UART_Send_Enter();
  115. }
  116. UART_Put_Inf("文件枚举已完成,共有文件(个)",item);
  117. UART_Send_Enter();
  118. Usart_SentString_GTM("-------------------------串口输出信息--------------------------\n");

  119. #endif


  120.   Usart_SentString_GTM("创建文件\n");
  121.   UART_Send_Enter();
  122. if(!FAT32_Create_File(&FileInfo,"\\test1.c",Create_DT)) //在根目录下创建一个sdudsc.txt文件
  123. {
  124.   Usart_SentString_GTM("文件创建成功\n");
  125.   Usart_SentString_GTM("文件名为:");
  126.   Usart_SentString_GTM(FileInfo.FileName);
  127.   UART_Send_Enter();
  128.   UART_Put_Inf("文件大小(字节):",FileInfo.FileSize);  
  129. }
  130. else
  131. {
  132.   Usart_SentString_GTM("文件创建失败\n");
  133. }
  134. strcpy(str,"山东大学 shandong university");
  135. if(len=FAT32_Add_Dat(&FileInfo,strlen(str),str))         //追加数据
  136. {
  137.   UART_Put_Inf("写文件成功,共写入(字节)",len);
  138.   UART_Put_Inf("当前文件大小(字节):",FileInfo.FileSize);
  139. }
  140. else
  141. {
  142.   Usart_SentString_GTM("写文件失败\n");
  143. }
  144. FAT32_File_Close(&FileInfo);
  145. Usart_SentString_GTM("文件已关闭\n");
  146. UART_Send_Enter();
  147. Usart_SentString_GTM("-------------------------串口输出信息--------------------------\n");


  148.   while(1)
  149.    {

  150.                     ;

  151.    }
  152.    
  153. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

244

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部