头像-144023

donatello

  • 广东省
  • 单片机
  • 计算机网络

个人成就

获得 765 次赞

帮助过2489人

工程文件.zip

调通了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就能在指定的存储设备中正常工作。

头文件.zip

调通了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就能在指定的存储设备中正常工作。