串行FLASH文件系统FatFs(摘自野火)

串行FLASH文件系统FatFs

1.文件系统

​ 直接存储数据的弊端: 难以记录有效数据的位置,难以确定存储介质的剩余空间,以及应以何种格式来解读数据。

​ **文件系统:**是为了存储和管理数据,而在存储介质建立的一种组织结构,这些结构包括操作系统引导区、目录和文件。

​ 在使用文件系统前,要先对存储介质进行格式化。格式化先擦除原来内容,在存储介质上新建一个文件分配表和目录。使用文件系统时, 数据都以文件的形式存储。写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中。当需要读取数据时,可以从目录中找到该文件的索引,进而在相应的地址中读取出数据。

2.FatFs

​ FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统。它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质。

​ FatFs 文件系统的源码可以从 fatfs 官网下载:http://elm-chan.org/fsw/ff/00index_e.html ,解压之后可以得到doc和src两个文件夹。

src 文件夹下的源码文件功能简介如下:

  • integer.h: 文件中包含了一些数值类型定义.
  • diskio.c: 包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。
  • *ff.c: FatFs 核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
  • cc936.c: 本文件在 option 目录下,是简体中文支持所需要添加的文件,包含了简体中文的 GBK 和 Unicode 相互转换功能函数。
  • ffconf.h:这个头文件包含了对 FatFs 功能配置的宏定义, 通过修改这些宏定义就可以裁剪 FatFs 的功能。如需要支持简体中文,需要把 ffconf.h 中的_CODE_PAGE的宏改成 936 并把上面的 cc936.c 文件加入到工程之中

3、FatFs 文件系统移植实验

FatFs 程序结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9phJ0VVi-1614568222551)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\1614302245376.png)]

FatFs 移植步骤

​ 我们的目的就是把 diskio.c 中的函数接口与SPI Flash 芯片驱动连接起来。总共有五个函数,分别为设备状态获取(disk_status)、设备初始化(disk_initialize)、扇区读取(disk_read)、扇区写入(disk_write)、其他控制(disk_ioctl)。

宏定义
1 /* 为每个设备定义一个物理编号 */
2 #define ATA 0 // 预留 SD 卡使用
3 #define SPI_FLASH 1 // 外部 SPI Flash
设备状态获取
1 DSTATUS disk_status(
2 BYTE pdrv /* 物理编号 */
3 )
4 {
5
6 DSTATUS status = STA_NOINIT;
7
8 switch (pdrv) {
9 case ATA: /* SD CARD */
10 break;
11
12 case SPI_FLASH:
13 /* SPI Flash 状态检测:读取 SPI Flash 设备 ID */
14 if (sFLASH_ID == SPI_FLASH_ReadID()) {
15 /* 设备 ID 读取结果正确 */
16 status &= ~STA_NOINIT;
17 } else {
18 /* 设备 ID 读取结果错误 */
19 status = STA_NOINIT;;
20 }
21 break;
22
23 default:
24 status = STA_NOINIT;
25 }
26 return status;
27 }  
设备初始化
1 DSTATUS disk_initialize (
2 BYTE pdrv /* 物理编号 */
3 )
4 {
5 uint16_t i;
6 DSTATUS status = STA_NOINIT;
7 switch (pdrv) {
8 case ATA: /* SD CARD */
9 break;
10
11 case SPI_FLASH: /* SPI Flash */
12 /* 初始化 SPI Flash */
13 SPI_FLASH_Init();
14 /* 延时一小段时间,等待初始化过程完成 */
15 i=500;
16 while (--i);零死角玩转 STM32F103—指南者
第 281 页 共 824
17 /* 唤醒 SPI Flash */
18 SPI_Flash_WAKEUP();
19 /* 获取 SPI Flash 芯片状态 */
20 status=disk_status(SPI_FLASH);
21 break;
22
23 default:
24 status = STA_NOINIT;
25 }
26 return status;
27 }

注意: SPI_Flash_WAKEUP()函数唤醒 SPI Flash 芯片,当 SPI Flash 芯片处于睡眠模式
时需要唤醒芯片才可以进行读写操作。

读取扇区
1 DRESULT disk_read (
2 BYTE pdrv, /* 设备物理编号(0..) */
3 BYTE *buff, /* 数据缓存区 */
4 DWORD sector, /* 扇区首地址 */
5 UINT count /* 扇区个数(1..128) */
6 )
7 {
8 DRESULT status = RES_PARERR;
9 switch (pdrv) {
10 case ATA: /* SD CARD */
11 break;
12
13 case SPI_FLASH:
14 /* 扇区偏移 2MB,外部 Flash 文件系统空间放在 SPI Flash 后面 6MB 空间 */
15 sector+=512;
16 SPI_FLASH_BufferRead(buff, sector <<12, count<<12);
17 status = RES_OK;
18 break;
19
20 default:
21 status = RES_PARERR;
22 }
23 return status;
24 }
其他数据
1 DRESULT disk_ioctl (
2 BYTE pdrv, /* 物理编号 */
3 BYTE cmd, /* 控制指令 */
4 void *buff /* 写入或者读取数据地址指针 */
5 )
6 {
7 DRESULT status = RES_PARERR;
8 switch (pdrv) {
9 case ATA: /* SD CARD */
10 break;零死角玩转 STM32F103—指南者
第 283 页 共 824
11
12 case SPI_FLASH:
13 switch (cmd) {
14 /* 扇区数量: 1536*4096/1024/1024=6(MB) */
15 case GET_SECTOR_COUNT:
16 *(DWORD * )buff = 1536;
17 break;
18 /* 扇区大小 */
19 case GET_SECTOR_SIZE :
20 *(WORD * )buff = 4096;
21 break;
22 /* 同时擦除扇区个数 */
23 case GET_BLOCK_SIZE :
24 *(DWORD * )buff = 1;
25 break;
26 }
27 status = RES_OK;
28 break;
29
30 default:
31 status = RES_PARERR;
32 }
33 return status;
34 }
时间戳获取
__weak DWORD get_fattime(void)
2 {
3 /* 返回当前时间戳 */
4 return ((DWORD)(2015 - 1980) << 25) /* Year 2015 */
5 | ((DWORD)1 << 21) /* Month 1 */
6 | ((DWORD)1 << 16) /* Mday 1 */
7 | ((DWORD)0 << 11) /* Hour 0 */
8 | ((DWORD)0 << 5) /* Min 0 */
9 | ((DWORD)0 >> 1); /* Sec 0 */
10 }

FatFs 功能配置

​ ffconf.h 文件是 FatFs 功能配置文件,我们可以对文件内容进行修改,使得 FatFs 更符合我们的要求。 ffconf.h 对每个配置选项都做了详细的使用情况说明。下面只列出修改的配置,其他配置采用默认即可。

FatFs 功能配置选项:

#define  _USE_MKFS         1 
#define  _CODE_PAGE        936
#define  _USE_LFN          2
#define  _VOLUMES          2 
#define  _MIN_SS           512
#define  _MAX_SS           4096
  1. _USE_MKFS:格式化功能选择,为使用 FatFs 格式化功能,需要把它设置为 1。
  2. _CODE_PAGE:语言功能选择,并要求把相关语言文件添加到工程宏。
  3. _USE_LFN:长文件名支持,默认不支持长文件名,这里配置为 2,支持长文件名,
    并指定使用栈空间为缓冲区。
  4. _VOLUMES:指定物理设备数量,这里设置为 2,包括预留 SD 卡和 SPI Flash 芯
    片。
  5. _MIN_SS 、 _MAX_SS:指定扇区大小的最小值和最大值。 SD 卡扇区大小一般都
    为 512 字节, SPI Flash 芯片扇区大小一般设置为 4096 字节,所以需要把
  6. _MAX_SS 改为 4096。

猜你喜欢

转载自blog.csdn.net/Exertive/article/details/114258566