5) _MIN_SS 、_MAX_SS:指定扇区大小的最小值和最大值。SD卡扇区大小一般都为512字节,SPI Flash芯片扇区大小一般设置为4096字节,所以需要把_MAX_SS改为4096。
25.3.6 FatFs功能测试移植操作到此,就已经把FatFs全部添加到我们的工程了,这时我们编译功能,顺利编译通过,没有错误。接下来,我们就可以使用编写图 254中用户应用程序了。
主要的测试包括格式化测试、文件写入测试和文件读取测试三个部分,主要程序都在main.c文件中实现。
变量定义代码清单 25-8 变量定义
1 FATFS fs; /* FatFs文件系统对象 */
2 FIL fnew; /* 文件对象 */
3 FRESULT res_flash; /* 文件操作结果 */
4 UINT fnum; /* 文件成功读写数量 */
5 BYTE buffer[1024]= {0}; /* 读缓冲区 */
6 BYTE textFileBuffer[] = /* 写缓冲区*/
7 "欢迎使用野火STM32 F429开发板 今天是个好日子,新建文件系统测试文件\r\n";
FATFS是在ff.h文件定义的一个结构体类型,针对的对象是物理设备,包含了物理设备的物理编号、扇区大小等等信息,一般我们都需要为每个物理设备定义一个FATFS变量。
FIL也是在ff.h文件定义的一个结构体类型,针对的对象是文件系统内具体的文件,包含了文件很多基本属性,比如文件大小、路径、当前读写地址等等。如果需要在同一时间打开多个文件进行读写,才需要定义多个FIL变量,不然一般定义一个FIL变量即可。
FRESULT是也在ff.h文件定义的一个枚举类型,作为FatFs函数的返回值类型,主要管理FatFs运行中出现的错误。总共有19种错误类型,包括物理设备读写错误、找不到文件、没有挂载工作空间等等错误。这在实际编程中非常重要,当有错误出现是我们要停止文件读写,通过返回值我们可以快速定位到错误发生的可能地点。如果运行没有错误才返回FR_OK。
fnum是个32位无符号整形变量,用来记录实际读取或者写入数据的数组。
buffer和textFileBuffer分别对应读取和写入数据缓存区,都是8位无符号整形数组。
主函数代码清单 259 主函数
1 int main(void)
2 {
3 SystemClock_Config();
4 /* Enable I-Cache */
5 SCB_EnableICache();
6 /* Enable D-Cache */
7 SCB_EnableDCache();
8 /* 初始化LED */
9 LED_GPIO_Config();
10 LED_BLUE;
11
12 /* 初始化调试串口,一般为串口1 */
13 DEBUG_USART_Config();
14 printf("****** 这是一个SPI FLASH 文件系统实验 ******\r\n");
15 //链接驱动器,创建盘符
16 FATFS_LinkDriver(&QSPI_Driver, QSPIPath);
17 //在外部SPI Flash挂载文件系统,文件系统挂载时会对SPI设备初始化
18 res_flash = f_mount(&fs,"0:",1);
19
20 /*----------------------- 格式化测试 ---------------------------*/
21 /* 如果没有文件系统就格式化创建创建文件系统 */
22 if (res_flash == FR_NO_FILESYSTEM) {
23 printf("》FLASH还没有文件系统,即将进行格式化...\r\n");
24 /* 格式化 */
25 res_flash=f_mkfs("0:",0,0);
26
27 if (res_flash == FR_OK) {
28 printf("》FLASH已成功格式化文件系统。\r\n");
29 /* 格式化后,先取消挂载 */
30 res_flash = f_mount(NULL,"0:",1);
31 /* 重新挂载 */
32 res_flash = f_mount(&fs,"0:",1);
33 } else {
34 LED_RED;
35 printf("《《格式化失败。》》\r\n");
36 while (1);
37 }
38 } else if (res_flash!=FR_OK) {
39 printf("!!外部Flash挂载文件系统失败。(%d)\r\n",res_flash);
40 printf("!!可能原因:SPI Flash初始化不成功。\r\n");
41 while (1);
42 } else {
43 printf("》文件系统挂载成功,可以进行读写测试\r\n");
44 }
45
46 /*----------------------- 文件系统测试:写测试 -----------------------------*/
47 /* 打开文件,如果文件不存在则创建它 */
48 printf("\r\n****** 即将进行文件写入测试... ******\r\n");
49 res_flash = f_open(&fnew, "0:FatFs读写测试文件.txt",FA_CREATE_ALWAYS | FA_WRITE );
50 if ( res_flash == FR_OK ) {