本文摘自《STM32 HAL 库开发实战指南 —基于野火 F407 霸天虎开发板》

FatFs源文件说明

  • option 文件夹下是一些可选的外部 c 文件,包含了多语言支持需要用到的文件和转换
    函数。
  • diskio.c 文件是 FatFs 移植最关键的文件,它为文件系统提供了最底层的访问 SPI Flash
    芯片的方法,FatFs 有且仅有它需要用到与 SPI Flash 芯片相关的函数。diskio.h 定义了
    FatFs 用到的宏,以及 diskio.c 文件内与底层硬件接口相关的函数声明。
  • 00history.txt 介绍了 FatFs 的版本更新情况。
  • 00readme.txt 说明了当前目录下 diskio.c 、diskio.h、ff.c、ff.h、integer.h 的功能。
  • integer.h:文件中包含了一些数值类型定义。
  • diskio.c:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加
    底层驱动函数。
  • ff.c: FatFs 核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的
    函数,利用这些函数实现文件的读写。
  • cc936.c:本文件在 option 目录下,是简体中文支持所需要添加的文件,包含了简
    体中文的 GBK 和 Unicode 相互转换功能函数。
  • ffconf.h:这个头文件包含了对 FatFs 功能配置的宏定义,通过修改这些宏定义就可
    以裁剪 FatFs 的功能。如需要支持简体中文,需要把 ffconf.h 中的_CODE_PAGE
    的宏改成 936 并把上面的 cc936.c 文件加入到工程之中。

移植过程讲解

FatFs 组件是 FatFs 的主体,文件都在源码 src 文件夹中,其中 ff.c、ff.h、integer.h 以及
diskio.h 四个文件我们不需要改动,只需要修改 ffconf.h 和 diskio.c 两个文件。

ffconf.h 主要是配置FatFs 要支持什么功能
diskio.c 是FatFs 与底层的接口,需要自己实现

1、支持简体中文

为支持简体中文长文件名称需要添加 ff_convert 和 ff_wtoupper 函数,实际这两个
已经在 cc936.c 文件中实现了,我们只要直接把 cc936.c 文件添加到工程中就可以了。

2、必须移植的功能函数

  • 设备状态获取
    DSTATUS disk_status (BYTE pdrv) //,pdrv是设备的物理编号,状态异常返回STA_NOINIT
  • 设备初始化
    DSTATUS disk_initialize(BYTE pdrv)
  • 扇区读取
    DRESULT disk_read (
    BYTE pdrv, /* 设备物理编号(0…) */
    BYTE buff, / 数据缓存区 /
    DWORD sector, /
    扇区首地址 /
    UINT count /
    扇区个数(1…128) */
    )
    BYTE 类型实际是 unsigned char 类型,DWORD 类型实际是 unsigned long 类型,UINT
    类型实际是 unsigned int 类型,类型定义在 integer.h 文件中。

3、创建文件,写入文件的功能函数

当 ffconf.h 内宏定义_FS_READONLY == 0时,需要支持以下函数

  • 扇区写入
    DRESULT disk_write (
    BYTE pdrv, /* 设备物理编号(0…) */
    const BYTE buff, / 欲写入数据的缓存区 /
    DWORD sector, /
    扇区首地址 /
    UINT count /
    扇区个数(1…128) */
    )
  • 其他控制
    DRESULT disk_ioctl (
    BYTE pdrv, /* 物理编号 /
    BYTE cmd, /
    控制指令 */
    void buff / 写入或者读取数据地址指针 */
    )
    cmd 为控制指令,包括发出同步信号、获取扇区数目、获取扇区大小、获取擦除块数量等等指令,buff 为指令对应的数据指针
  • 时间戳获取
    __weak DWORD get_fattime(void)
    get_fattime 函数用于获取当前时间戳,在 ff.c 文件中被调用。FatFs 在文件创建、被修
    改时会记录时间,这里我们直接使用赋值方法设定时间戳。为更好的记录时间,可以使用
    控制器 RTC 功能,

4、FatFs 功能配置

其他函数的移植,用到很少,就以上6个函数移植完,就可以实现大部分常用功能了。

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

FatFs 功能使用

1、FatFs常用变量说明

  • FATFS fs FatFs 文件系统对象
    FATFS 是在 ff.h 文件定义的一个结构体类型,针对的对象是物理设备,包含了物理设备的物理编号、扇区大小等等信息,一般我们都需要为每个物理设备定义一个 FATFS 变量。
  • FIL fnew 文件对象
    FIL 也是在 ff.h 文件定义的一个结构体类型,针对的对象是文件系统内具体的文件,包含了文件很多基本属性,比如文件大小、路径、当前读写地址等等。如果需要在同一时间打开多个文件进行读写,才需要定义多个 FIL 变量,不然一般定义一个 FIL 变量即可。
  • FRESULT res_flash 文件操作结果
    FRESULT 是也在 ff.h 文件定义的一个枚举类型,作为 FatFs 函数的返回值类型,主要管理 FatFs 运行中出现的错误。总共有 19 种错误类型,包括物理设备读写错误、找不到文件、没有挂载工作空间等等错误。这在实际编程中非常重要,当有错误出现是我们要停止文件读写,通过返回值我们可以快速定位到错误发生的可能地点。如果运行没有错误才返回 FR_OK。
  • UINT fnum 文件成功读写数量
    fnum 是个 32 位无符号整形变量,用来记录实际读取或者写入数据的数组

2、文件系统初始化

  • Flash 挂载文件系统,文件系统挂载时会对 SPI 设备初化
res_flash = f_mount(&fs,"1:",1);
if (res_flash == FR_NO_FILESYSTEM) {printf("》FLASH 还没有文件系统,即将进行格式化.. .\r\n");
}
else if (res_flash!=FR_OK) {printf("!!外部 Flash 挂载文件系统失败。(%d)\r\n",res_flash);
printf("!!可能原因:SPI Flash 初始化不成功。\r\n");
while (1);
}
else {printf("》文件系统挂载成功,可以进行读写测试\r\n");
}
  • 创建(格式化)文件系统
res_flash=f_mkfs("1:",0,0);
if (res_flash == FR_OK) {printf("》FLASH 已成功格式化文件系统。\r\n");
/* 格式化后,先取消挂载 */
res_flash = f_mount(NULL,"1:",1);
/* 重新挂载 */
res_flash = f_mount(&fs,"1:",1);
} else {LED_RED;
printf("《《格式化失败。》》\r\n");
while (1);
}
  • 写入数据
/* 打开文件,如果文件不存在则创建它 */
res_flash = f_open(&fnew, "1:FatFs 读写测试文件.txt",FA_CREATE_ALWAYS | FA_WRITE );
if ( res_flash == FR_OK )
{printf("》打开/创建 FatFs 读写测试文件.txt 文件成功,向文件写入数据。\r\n");/* 将指定存储区内容写入到文件内 */res_flash=f_write(&fnew,WriteBuffer,sizeof(WriteBuffer),&fnum);if (res_flash==FR_OK) {printf("》文件写入成功,写入字节数据:%d\n",fnum);printf("》向文件写入的数据为:\r\n%s\r\n",WriteBuffer);} else {printf("!!文件写入失败:(%d)\n",res_flash);}/* 不再读写,关闭文件 */f_close(&fnew);
}
else
{printf("!!打开/创建文件失败。\r\n");
}
  • 读取数据
res_flash = f_open(&fnew, "1:FatFs 读写测试文件.txt", FA_OPEN_EXISTING | FA_READ);
if (res_flash == FR_OK) {printf("》打开文件成功。\r\n");res_flash = f_read(&fnew, ReadBuffer, sizeof(ReadBuffer), &fnum);if (res_flash==FR_OK) {printf("》文件读取成功,读到字节数据:%d\r\n",fnum);printf("》读取得的文件数据为:\r\n%s \r\n", ReadBuffer);} else {printf("!!文件读取失败:(%d)\n",res_flash);}
}
else
{printf("!!打开文件失败。\r\n");
}
/* 不再读写,关闭文件 */
f_close(&fnew);}

FatFs 学习笔记相关推荐

  1. STM32CubeMX学习笔记(25)——FatFs文件系统使用(操作SPI Flash)

    一.FatFs简介 FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统.它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质.因此它可以很容易地不加修改地移植到其他的处理器 ...

  2. (实验39)单片机,STM32F4学习笔记,代码讲解【FATFS实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 FATFS初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创 ...

  3. STM32CubeMX学习笔记(27)——FatFs文件系统使用(操作SD卡)

    一.FatFs简介 FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统.它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质.因此它可以很容易地不加修改地移植到其他的处理器 ...

  4. 《智能对话机器人开发实战20讲》--学习笔记--AIML基础功能拓展-与互联网的集成

    一.学习笔记 环境要求: aiml bs4 语料库: tuling.aiml search_web.aiml <that>WHICH SEARCH ENGINE WOULD YOU LIK ...

  5. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  6. stm32正常运行流程图_STM32单片机学习笔记(超详细整理143个问题,学习必看)...

    原标题:STM32单片机学习笔记(超详细整理143个问题,学习必看) 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f ...

  7. 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)

    [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...

  8. (实验38)单片机,STM32F4学习笔记,代码讲解【SD卡实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 SD卡驱动程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ( ...

  9. (实验55)单片机,STM32F4学习笔记,代码讲解【网络通信实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 LWIP初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

最新文章

  1. python怎么计算时间_python怎么计算若干分钟后是第几天,星期几
  2. excelutil java_JAVA实现Excel的读取--ExcelUtil工具类
  3. 达摩java_JAVA面向对象
  4. 云漫圈 | 什么是微服务?
  5. js 杂项(一)函数篇
  6. 智能玩具小风扇制作教程
  7. 附合导线坐标计算例题_附合导线计算方法(实例)
  8. MySQL数据库笔记6——约束Constraint
  9. python数据挖掘的基本流程有哪些?
  10. SAS硬盘-神级高性能硬件盘点
  11. 新茶饮的尽头是瓶装水?
  12. C. Minimum Ties
  13. 语文作文自动评阅技术及其应用
  14. 谷歌学术国内镜像网址收集-查文献
  15. 浅谈大数据平台架构设计
  16. android java开发
  17. OCR目前的发展现状综述
  18. 手撕鸭腌料批发场 新奥尔良烤肉腌料批发 奥尔良鸡叉骨腌料批发
  19. 记一次内网kafka映射到外网端口遇到小问题
  20. 01_Linux install lastest opencv

热门文章

  1. BEA助力信达资产实现无纸化办公
  2. 墨西哥认可的认证机构有哪些
  3. 佳明手表大数据应用_Garmin手表还有这些隐藏技能?Connect IQ应用了解一下~
  4. PE头部IMAGE_NT_HEADERS
  5. SkyWalking--使用/教程/实例
  6. 【动画设计的vue后台管理欢迎页】
  7. 企业构建ERP系统不得不考虑的因素
  8. 在信息社会中计算机主要应用在哪些领域,《了解计算机在信息社会中的应用》教学设计.doc...
  9. Kubernetes二进制搭建集群(保姆级)
  10. Ubuntu18.04——基于X86和Arm安装并配置Realsense-ros环境