【STM32F412-DISCO 开发板试用体验】SD卡FATFS文件系统简单应用

  • 如何
  • 开发
  • 源文件
  • 结构体
  • 动物
  • donatello
  • LV6工程师
  • |      2017-05-26 18:02:00
  • 浏览量 1228
  • 回复:0
调通了SD卡之后,就可以进行基于SD卡的FATFS的学习了。俗话说内行看门道,外行看热闹,平时用STM32插SD卡看图片、播音乐觉得挺好玩,真正自己去调一次FATFS那真不是一般的困难。抛开FATFS中间层驱动ff.c/ff.h/diskio.h那些函数的实现原理不管,就是调用表层API如f_open、f_write这些函数都一波三折,最后还得参考官方例程。 FATFS官方提供了一系列的驱动包,这些驱动包有ff.c/ff.h、ff_gen_drv.c/ff_gen_drv.h、diskio.c/diskio.h、ffconf.h、integer.h,在这些驱动文件中官方已经把fatfs具体如何实现的函数都打包好了,我们无须理会也不要乱改,我们要改的只有带前缀的diskio.c/diskio.h扇区驱动源文件和头文件如sd_diskio.c/sd_diskio.h或者usb_diskio.c/usb_diskio.h,这些函数里面都有一个类型为Diskio_drvTypeDef的名为XX_Driver硬件驱动结构体指针,里面包含有XX_initialize,XX_status,XX_read, XX_write,XX_ioctl五个函数指针,XX为自定义名称如SD、SRAM、Flash、UsbHost等等,Diskio_drvTypeDef的定义是在ff_gen_drv.h里面的,其作用是让FATFS文件系统与相应的SD、SRAM、Flash、UsbHost等硬件设备挂载对接,因此在XX_diskio.c/XX_diskio.h中需要“枚举”一个XX_Driver出来(本质并不是enum那种枚举,而是像int a那样定义一个int类型的名为a的变量,说是枚举只是更容易理解,就类似于重定义fputc()函数以便让printf()函数选择相应串口外设或者LCD外设一样,说是“充当”或者“挂载器件”更为贴切),并在XX_initialize、XX_read、XX_write的函数中分别定义好外设的初始化函数、外设读取数据函数、外设写入数据函数,只要这些函数都没问题,FATFS就能在指定的存储设备中正常工作。 SD卡和FATFS都配置成功后,就可以做一个极其简单的小测试:使用开发板在SD卡中创建一个自定义文件名和内容的txt文件并在创建成功后检验这个文件,有助于我们认识f_mount()、f_mkfs()、f_open()、f_write()、f_read()、f_close()这几个FATFS中最常用的操作函数: 1.启动文件系统采用f_mount(&fatfs,(TCHAR const*)SDPath,1)函数,其中fatfs为文件系统指针,driverNumberBuffer为初始化路径,按照FATFS文件系统官方规定,0:/为RAM DISK即内存区,1:/为USB DISK即U盘或USB-OTG,2:/为SD DISK即SDIO接口的SD卡,3:/为MMC DISK即SDMMC接口的SD卡,4:/为SDSPI DISK即SDSPI接口的SD卡,这里我们可以看到光是挂载SD卡的文件系统就有三种方式,这是因为业界对SD卡接口的标准没有统一,而这三种SD卡接口规范又不尽相同,因此FATFS文件系统就为这三种接口都单独做了三个路径。 2.格式化SD卡采用f_mkfs((TCHAR const*)SDPath,0,0),后面两个参数都为0表明开发板将SD卡格式化成FAT32格式。 2.创建文件、打开文件均采用f_open(&fd,"4:/TEST.txt",FA_CREATE_NEW|FA_WRITE)函数,其中第一个参数fd为FIL文件指针,第二个参数为文件名,第三个参数为打开文件的行为方式,方式有:FA_CREATE_NEW,仅仅创建新文件,若存在同名文件,则f_open()函数返回1,报错;FA_CREATE_ALWAYS 创建新文件并覆盖同名文件;FA_WRITE,允许修改文件;FA_READ,只允许读文件。 3.修改文件采用f_write(&fd,write_buff,strlen(write_buff),&ret)函数,write_buff为要写入的文件的内容,strlen(write_buff)为要写入的文件的内容的长度。注意,若f_open()函数的最后一个参数为FA_CREATE_NEW或FA_CREATE_ALWAYS,则后面必须紧跟f_write()函数,否则文件系统会出错。 4.文件读取采用f_read(&fd,read_buff,100,&ret)函数,read_buff为当前文件的内容。 5.注意,f_open()函数到最后必须额外紧跟f_close()函数,否则对文件的修改无法保存,一个f_open()函数要有一个f_close()跟上,多个f_open()函数也必须带有数量相同的f_close()。 6.f_write()和f_read()都只支持文件的ASCII码形式读写,即记事本方式读写,即如果文件是可以用记事本打开那一类的,如.c .h .html .txt .cpp这种就可以用这个方式。 为了能在串口之外验证SD卡文件读写成功,我将开发板的4个LED灯用作状态输出,绿色灯亮表示SD卡初始化成功,橙色灯表示文件创建成功,红色灯表示文件写入成功,蓝色灯表示文件读取成功。 老规矩,上传工程文件和头文件。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子