Skip to content

FATFS

文件系统简介

没有文件系统的时候不同设备之间的文件拷贝会十分麻烦, 并且文件的访问会很麻烦

比较常用的文件系统有FAT12, FAT16, FAT32, exFAT, NTFS

FAT32的兼容性比较好, 但是不支持4GB以上的文件

exFAT可以保存4GB以上的文件

NTFS基于安全性的文件系统, 是Windows使用的文件系统, 支持大文件和超大文件分区

FATFS支持FAT32和exFAT

FAT: File Alloction Table文件分配表

image-20240109115212344

image-20240109115446592

FATFS文件系统简介

image-20240109115711606

层次架构

image-20240109115850756

image-20240109120006766

image-20240109121128970

配置项

FatFs - Configuration Options (elm-chan.org)

image-20240109121821918

底层函数

image-20240109122211855

image-20240109122430562

image-20240109122505968

image-20240109122620485

image-20240109122638261

image-20240109122735914

image-20240109122808517

image-20240109124650340

源文件移植

image-20240109125449051

扩展代码(优化)

image-20240109131646442

  • ff.c文件

把dir_sdi函数的static解除, 方便之后的图片操作

还有就是一些在使用OS的时候需要进行修改的代码

优化

在使用长文件名的时候会使用到两个数组

image-20240109172910471

image-20240109172915554

主要就是会在两个数组中进行两种编码的转换, 可以把这两个数组放在NOR Flash里面, 之后从Flash里面读取, 主要就是在这个数组里面找到现在的字符对应的编码, 之后从他后面的位置获取到转换后的代码

c
WCHAR ff_uni2oem (  /* Returns OEM code character, zero on error */
    DWORD   uni,    /* UTF-16 encoded character to be converted */
    WORD    cp      /* Code page for the conversion */
)
{
    WCHAR t[2];
    WCHAR c;
    uint32_t i, li, hi;
    uint16_t n;
    uint32_t gbk2uni_offset = 0;

    if (uni < 0x80)
    {
        c = uni;    /* ASCII,直接不用转换 */
    }
    else
    {
        hi = ftinfo.ugbksize / 2; /* 对半开 */
        hi = hi / 4 - 1;
        li = 0;

        for (n = 16; n; n--)    /* 二分法查找 */
        {
            i = li + (hi - li) / 2;
            norflash_read((uint8_t *)&t, ftinfo.ugbkaddr + i * 4 + gbk2uni_offset, 4);  /* 读出4个字节 */

            if (uni == t[0]) break;//找到了

            if (uni > t[0])
            {
                li = i;//进行位置的偏移
            }
            else
            {
                hi = i;
            }
        }

        c = n ? t[1] : 0;//查看是不是找到了,是的话更新
    }

    return c;
}

CubeMX移植

STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)_st cube sd卡-CSDN博客