前言

  1. 硬件:
    1. 单片机:stm32f072CB,sram大小16k。(其他单片机只要sram>8k即可通用)
    2. SPIFlash:W25Q128FV,16Mbyte,单次擦除最小4k。
  2. 程序使用Keil编译器,C99标准。
  3. 程序已经全部完成并测试通过,目前没出现明显问题。
  4. 程序使用的FatFs库版本:R0.13b。下文所有内容仅保证在此版本可行。

添加文件

  1. 获取FatFs库(官网
  2. 将source文件夹全部复制到目标工程中
  3. 添加所有.c文件到工程中,添加相关路径

移植修改

需要修改的文件:

  1. integer.h:修改各种整型的宏定义(注:C99--long long对应64位整型)
  2. ffconf.h:修改各种设置:(全部宏定义意义见官网
    1. FF_USE_STRFUNC设为1:开启字符串功能
    2. FF_USE_MKFS设为1:开启格式化功能
    3. FF_CODE_PAGE设为936:简体中文
    4. FF_MIN_SS、FF_MAX_SS设为4096:扇区大小4k
    5. FF_FS_TINY设为1:文件对象(FIL)不再包括数据缓冲区,而是使用FatFs中的公用缓冲区,适用于RAM偏小的情况。
    6. FF_FS_NORTC设为1:禁用RTC(时间戳)功能,因为stm32不具备获取时间的功能
  3. diskio.c:修改各磁盘IO层操作函数
    1. 修改磁盘设备定义:#define DEV_SPI 0
    2. 修改各函数中case DEV_RAM的操作:stat = STA_NOINIT; 或res = RES_PARERR;
    3. 修改各函数中case DEV_SPI的操作:指向spi_disk.c中的各执行函数
  4. spi_disk.c:自定义文件,是diskio.c中各函数指向的执行函数
    1. 定义静态全局变量_s_SPI_Init_OK,用于指示当前磁盘初始化状态
    2. SPI_disk_status函数:获取驱动器状态。_s_SPI_Init_OK为0时返回STA_NOINIT。
    3. SPI_disk_initialize函数:驱动器初始化。执行SPIFlash初始化函数,执行完毕后将_s_SPI_Init_OK置1。
    4. SPI_disk_read函数:读磁盘驱动器。进行异常处理后,将所有数据读到指定的指针内。
      • 1 DRESULT SPI_disk_read(BYTE *buff, DWORD sector, UINT count) {
        2   if(sector > SEC_MAX || sector + count - 1 > SEC_MAX) return RES_PARERR;
        3   if(CS_STATUS() == Bit_RESET) return RES_NOTRDY;
        4   
        5   if(SSTF016B_RD(sector*SEC_SIZE, SEC_SIZE*count, buff) == ERR) {
        6     return RES_ERROR;
        7   }
        8   return RES_OK;
        9 }
        SPI_disk_read

相关文章: