前言
- 硬件:
- 单片机:stm32f072CB,sram大小16k。(其他单片机只要sram>8k即可通用)
- SPIFlash:W25Q128FV,16Mbyte,单次擦除最小4k。
- 程序使用Keil编译器,C99标准。
- 程序已经全部完成并测试通过,目前没出现明显问题。
- 程序使用的FatFs库版本:R0.13b。下文所有内容仅保证在此版本可行。
添加文件
- 获取FatFs库(官网)
- 将source文件夹全部复制到目标工程中
- 添加所有.c文件到工程中,添加相关路径
移植修改
需要修改的文件:
- integer.h:修改各种整型的宏定义(注:C99--long long对应64位整型)
- ffconf.h:修改各种设置:(全部宏定义意义见官网)
- FF_USE_STRFUNC设为1:开启字符串功能
- FF_USE_MKFS设为1:开启格式化功能
- FF_CODE_PAGE设为936:简体中文
- FF_MIN_SS、FF_MAX_SS设为4096:扇区大小4k
- FF_FS_TINY设为1:文件对象(FIL)不再包括数据缓冲区,而是使用FatFs中的公用缓冲区,适用于RAM偏小的情况。
- FF_FS_NORTC设为1:禁用RTC(时间戳)功能,因为stm32不具备获取时间的功能
- diskio.c:修改各磁盘IO层操作函数
- 修改磁盘设备定义:#define DEV_SPI 0
- 修改各函数中case DEV_RAM的操作:stat = STA_NOINIT; 或res = RES_PARERR;
- 修改各函数中case DEV_SPI的操作:指向spi_disk.c中的各执行函数
- spi_disk.c:自定义文件,是diskio.c中各函数指向的执行函数
- 定义静态全局变量_s_SPI_Init_OK,用于指示当前磁盘初始化状态
- SPI_disk_status函数:获取驱动器状态。_s_SPI_Init_OK为0时返回STA_NOINIT。
- SPI_disk_initialize函数:驱动器初始化。执行SPIFlash初始化函数,执行完毕后将_s_SPI_Init_OK置1。
- SPI_disk_read函数:读磁盘驱动器。进行异常处理后,将所有数据读到指定的指针内。
-
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 }
-