细说STM32单片机SPI-Flash芯片的FatFS移植及其应用实例详解

目录

一、SPI-Flash芯片硬件电路 

二、CubeMX项目基础设置

1、RCC、SYS、Code Generator、USART6、NVIC

2、RTC

3、SPI2

4、GPIO

5、FatFS模式 

6、FatFS参数设置概述

(1)Version组

(2)Function Parameters组

1)参数FS_READONLY

2)参数S_MINIMIZE

3)参数USE_STRFUNC

(3)Locale and Namespace Parameters组

1)参数USE_LFN

2)参数STRF_ENCODE

3)参数FS_RPATH

(4)Physical Driver Parameters组

(5)System Parameters组

1)参数FS_NORTC

2)参数FS_REENTRANT

三、项目FatFS的文件组成及详细分析

1、main()的初始化代码

2、文件fatfs.h和fatfs.c

3、文件user_diskio.h和user_diskio.c

4、文件ff_gen_drv.h和ff_gen_drv.c

5、文件diskio.h和diskio.c

四、Disk IO函数的实现

1、获取驱动器状态的函数USER_status()

2、驱动器初始化函数USER_initialize() 

3、驱动器IO控制函数USER_ioctl() 

4、读取扇区数据的函数USER_read()

5、将数据写入扇区的函数USER_write() 

6、获取RTC时间的函数get_fattime() 

五、在SPI-Flash芯片上使用文件系统

1、主程序功能

2、磁盘格式化

3、获取FAT磁盘信息

4、扫描根目录下的文件和子目录

5、创建文件和目录

6、读取文本文件

7、读取二进制文件

8、获取文件信息

9、文件file_opera.h的完整定义

六、运行与调试

七、示例程序源码


        本文以开发板上的SPI-Flash芯片W25Q16媒介详细介绍CubeMX中FatFS各个参数的意义和设置,分析生成的代码中FatFS各个文件的作用和关联,完成针对W25Q16的硬件访问层的移植。

        继续使用旺宝红龙开发板STM32F407ZGT6 KITV1.0。相关原理图如下:

一、SPI-Flash芯片硬件电路 

        开发板上有一个SPI-Flash存储芯片W25Q16,它与STM32F407的SPI2接口连接,W25Q16总容量是2M字节,存储空间参数如下。

  • 总共32个块(block),每个块64KB。
  • 每个块又分为16个扇区,共512个扇区,每个扇区4KB。
  • 每个扇区又分为16个页(page),共8192个页,每个页256B。

二、CubeMX项目基础设置

        本文创建一个示例针对SPI-Flash存储芯片W25Q16进行FatFS移植,使用FatFS进行文件读写等操作。此外,使用RTC为FatFS提供时间戳数据。

1、RCC、SYS、Code Generator、USART6、NVIC

        参数设置可以本文作者发布的其他文章文章。

2、RTC

  • 启用RTC的时钟源和日历,设置初始日期和时间,其他功能无须开启。在示例中读取RTC的当前日期和时间。
  • 在RCC组件中启用LSE在时钟树上,使用LSE作为RTC的时钟源

3、SPI2

  • 设置HCLK为168MHzPCLK1的频率为42MHzSPI2是挂在APB1总线上的,这样是为方便计算SPI2的波特率。
  • SPI2的模式设置为Full-Duplex Master不使用硬件NSS信号,分频系数(Prescaler)设置为8波特率为5.25Mbit/s。数据传输是MSB先行,CPOL和CPHA的组合是SPI时序模式3。

4、GPIO

 

5、FatFS模式 

        模式设置就是选择FatFS应用的存储介质,有以下4个选项。

 

  • External SRAM外部SRAM存储器。例如,开发板上有一个外部SRAM芯片IS62WV51216可以将此芯片的一部分或全部存储区域用作文件系统,使用FatFS管理SRAM上的文件,实现内存上的高速文件读写。
  • SD Card,SD卡。此项需要启用SDIO接口后才可以选择。
  • USB Disk,U盘。需要将USB-OTG-FS或USB-OTG-HS组件的模式设置为Host-Only(仅作为主机),并且将Middleware分组中的USB_HOST组件的IP类型设置为MassStorage Host Class(大容量存储主机类)之后,此项才可以选择。
  • User-defined,用户定义器件。除以上3项之外的其他存储介质,例如,开发板上连接在SPI2接口上的Flash存储芯片W25Q16。

        使用前3种存储介质时,CubeMX生成的代码里有FatFS完整的移植程序,因此用户无须再编程实现硬件层的Disk IO函数。使用用户定义器件时,CubeMX生成的代码里有FatFS移植代码框架,用户需要自己编程实现器件的Disk IO函数。本文的示例使用的存储介质是连接在SPI2接口上的Flash存储芯片W25Q16属于用户定义器件。通过这个示例,详细地了解FatFS程序移植的原理。

6、FatFS参数设置概述

        设置FatFS参数。这些参数分为多个组,大多数与FatFS配置文件ffconf.h中的宏定义对应,用于设置FatFS的一些参数,以及进行功能裁剪。

(1)Version组

        只有一个参数,显示了FatFS的版本。图中显示的版本为R0.12c。

(2)Function Parameters组

        用于配置是否包含某些函数,就是FatFS的功能裁剪。

 

        Function Parameters组参数,第一列是参数名称,对应于源文件中的宏,宏的名称就是参数名称前加“_”,例如,参数FS_READONLY对应的宏是_FS_READONLY,参数USE_FIND对应的宏是_USE_FIND。第二列是参数值,这些参数一般是逻辑值,Disabled表示设置为0,Enabled表示设置为1。

        这些参数有的用于定义系统的特性,如FS_MINIMIZE定义系统最小化级别,会影响多个函数;有的用于裁剪某个功能,可同时影响多个函数,如USE_FIND影响函数f_findfirst()和f_findnext();有的参数只影响一个函数,如USE_CHMOD只控制是否使用函数f_chmod()。

参数

默认值

可设置内容和影响的函数

FS_READONLY

Disabled

只能设置为Disabled表示不使用只读功能

FS_MINIMIZE

Disabled

最小化级别,可设置为0、1、2、3等4种级别

USE_STRFUNC

2

是否使用字符串函数,可设置为0、1或2

USE_FIND

Disabled

是否使用查找函数f_findfirst()和f_findnext()

USE_MKFS

Enabled

是否使用函数f_mkfs()

USE_FASTSEEK

Enabled

是否使用快速寻找功能,无具体影响函数

USE_EXPAND

Disabled

是否使用函数f_expand()

USE_CHMOD

Disabled

是否使用函数f_chmod()

USE_LABEL

Disabled

是否使用获取和设置卷标签的函数f_getlable()和f_setlabel()

USE_FORWARD

Disabled

是否使用函数f_forward()

1)参数FS_READONLY

        在CubeMX中,参数FS_READONLY只能设置为Disabled,表示不使用只读功能。若在代码中设置_FS_READONLY为1,表示系统为只读系统,将移除用于写操作的函数,包括f_write()、f_sync()、f_unlink()、f_mkdir()、f_chmod()、f_rename()和f_truncate(),并且函数f_getfree()将变得无用。

2)参数S_MINIMIZE

        参数S_MINIMIZE设置系统的最小化级别,有如下4种选项。

  • Disabled:对应级别0,启用所有基本函数。
  • Enabled with 6 functions removed:对应级别1,移除函数f_stat()、f_getfree()、f_unlink()、f_mkdir()、f_truncate()和f_rename()。
  • Enabled with 9 functions removed:对应级别2,在级别1的基础上,再移除函数f_opendir()、f_readdir()和f_closedir()。
  • Enabled with 10 functions removed:对应级别3,在级别2的基础上,再移除函数f_lseek()。
3)参数USE_STRFUNC

        参数USE_STRFUNC设置是否使用字符串相关函数,以及如何使用,有如下3种选项。

  • Disabled:对应值0,不使用字符串相关的函数,如f_gets()、f_putc()、f_puts()等。
  • Enabled without LF->CRLF conversion:对应值1,使用字符串相关函数,但不使用LF->CRLF转换。
  • Enabled with LF->CRLF conversion:对应值2,使用字符串相关函数,并且使用LF->CRLF转换,也就是字符串中的'\n'会被转换为\r¹+'n'。

(3)Locale and Namespace Parameters组

        本地化和名称空间参数,例如,设置代码页、是否使用长文件名等。

参数

默认值

可设置内容和功能描述

CODE_PAGE

Latin 1

设置目标系统上使用的OEM编码页,编码页如果选择不正常,可能
导致打开文件失败。如果要支持中文,应该选择Simplified Chinese
(DBCS),对应的_CODE_PAGE参数值是936

USE_LFN

Disabled

是否使用长文件名(LFN)

MAX_LFN

255

设定值范围为12至255,是LFN的最大长度

LFN_UNICODE

ANSI/OEM

是否将FatFS API中的字符编码切换为Unicode。当USE_LFN设置为
Enabled时, LFN_UNICODE才可以设置为1(Unicode)。当USE_LFN
设置为Disabled时, LFN_UNICODE只能设置为ANSI/OEM

STRF_ENCODE

UTF-8

启用Unicode后,FatFSAPI中的字符编码都需要转换为Unicode。这
个参数用于选择字符串操作相关函数在读写文件时使用的编码

FS_RPATH

Disabled

是否使用相对路径,以及使用相对路径时的特性

1)参数USE_LFN

        参数USE_LFN控制是否使用LFN(Long File Name,长文件名),有如下4种选项。

  • 0=Disabled:不使用LFN,参数MAX_LFN无影响。
  • 1=Enable LFN with static working buffer on the BSS:使用LFN,且使用BSS段的静态工作缓冲区。这种情况下,LFN工作缓冲区是BSS段上的静态变量,总是不可重入的,即不是线程安全的。
  • 2=Enable LFN with dynamic working buffer on the STACK:使用LFN,且在栈空间为LFN分配动态工作缓冲区。
  • 3=Enable LFN with dynamic working buffer on the HEAP:使用LFN,且在堆空间为LFN分配动态工作缓冲区。

        要使用LFN功能,请务必将处理Unicode的函数ff_convert()和f_wtoupper()添加到项目中。LFN工作缓冲区占用(MAX_LFN+1)×2字节。当使用栈空间作为LFN工作缓冲区时,要注意栈溢出问题。使用堆空间作为LFN工作缓冲区时,需要将内存管理函数ff_memalloc()和ff_memfree()添加到项目中。

        如果不使用LFN,即参数USE_LFN设置为Disabled时,不含后缀的文件名的长度不能超过8个ASCII字符,后缀为3个ASCII字符。如果在嵌入式设备上使用LFN,最好也不要在文件名中使用汉字,即LFN_UNICODE不要设置为Unicode,而是设置为ANSI/OEM。本示例暂时不使用LFN,所以将USE_LFN设置为Disabled。但是FatFS需要能支持中文,所以CODE_PAGE设置为Simplified Chinese(DBCS)。

2)参数STRF_ENCODE

        参数STRF_ENCODE用于设置字符串的编码。当LFN_UNICODE设置为0(ANSI/OEM)时,这个参数无效。当LFN_UNICODE设置为1(Unicode)时,FatFS API中的字符编码都需要转换为Unicode。这个参数用于选择字符串操作相关函数,如f_gets()、f_putc()、f_puts()、f_printf()等,在读写文件时使用的编码,有如下几种选项。

  • 0=ANSI/OEM。
  • 1=UTF-16LE。
  • 2=UTF-16BE。
  • 3=UTF-8。

        其中,UTF-8是最常用的汉字编码,需要使用汉字时,就将此参数设置为UTF-8。

3)参数FS_RPATH

        参数FS_RPATH用于设置是否使用相对路径,以及使用相对路径时的特性,有如下3种选项。

  • 0=Disabled,不使用相对路径,移除相关函数。
  • 1=Enabled without f_getcwd,使用相对路径,可使用函数f_chdrive()和f_chdir()。
  • 2=Enabled with f_getcwd,在选项1的基础上,增加可使用函数f_getcwd()。

        读取目录的函数f_readdir()的返回结果与此选项有关。

(4)Physical Driver Parameters组

        物理驱动器参数,包括卷的个数、扇区大小等。

参数

默认值

可设置内容和功能描述

VOLUMES

1

使用的逻辑驱动器的个数,设置范围为1~9

MAX_SS

4096

最大扇区大小(字节数)只能设置为512、1024、2048或4096,比如使用的Flash存储芯片W25Q16的扇区大小为4096字节,所以设置为4096。当MAX_SS大于512时,在disk_ioctl()函数中需要实现GET_SECTOR_SIZE指令

MIN_SS

512

最小扇区大小(字节数),只能设置为512、1024、2048或4096

MULTI_PARTITION

Disabled

设置为Disabled时,每个卷与相同编号的物理驱动器绑定,只会挂载第一个分区。设置为Enabled时,每个卷与分区表VolToPart[]关联

USE_TRIM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值