目录
1、RCC、SYS、Code Generator、USART6、NVIC
(3)Locale and Namespace Parameters组
(4)Physical Driver Parameters组
3、文件user_diskio.h和user_diskio.c
本文以开发板上的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为168MHz,PCLK1的频率为42MHz,SPI2是挂在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编码页,编码页如果选择不正常,可能 |
USE_LFN |
Disabled |
是否使用长文件名(LFN) |
MAX_LFN |
255 |
设定值范围为12至255,是LFN的最大长度 |
LFN_UNICODE |
ANSI/OEM |
是否将FatFS API中的字符编码切换为Unicode。当USE_LFN设置为 |
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 |