FATFS简介
FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM等等。兼容Windows文件系统。 关于FATFS文件系统的API函数介绍,底层移植接口和例程等可以查到FATFS官网。
结合STM32cubeMX软件移植FATFS文件系统非常简单。本章程序在上一章SDMMC工程的基础上修改,复制串口SDMMC的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。在中间件中选择SD卡,在SD上建立文件系统。
在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。
点击菜单栏中Project->Setting修改堆的大小,堆设置为0x1000。(注意:由于刚才设置长文件名动态缓存存储在堆中,故需要增大堆大小,如果不修改则程序运行时堆会生成溢出,程序进入硬件错误中断(HardFault),死循环)。
生成报告以及代码,编译程序。在fatfs.c文件中可以看到FATFS初始化函数。在bsp_drver_sd.c文件中可以看到SD卡的板级操作函数,包括SD初始化,读写擦除块操作函数。在sd_diskio.c文件中可以看到FATFS文件系统移植的底层操作函数。
删除上一章SDMMC的应用程序。在main.c文件前添加变量。fs为文件系统工作区,fil为文件对象结构的指针。rtext/wtext分别为读写缓存,bytesread/byteswritten分别存储读写的字节数。filename存储文件名(FATFS文件系统配置时使能了长文件名,最长255字节,若不支持长文件名,则文件名最多8个字节)。
08 | uint8_t wtext[] = "This is STM32 working with FatFs" ; |
10 | char filename[] = "STM32cube.txt" ; |
在main函数中添加应用程序。程序中首先注册一个文件系统对象,然后新建STM32cube.txt文件,将数据写文件中再读出来,判断文件系统是否工作正常。
02 | printf( "\r\n ****** FatFs Example ******\r\n\r\n" ); |
05 | retSD = f_mount(&fs, "" , 0); |
08 | printf( " mount error : %d \r\n" ,retSD); |
12 | printf( " mount sucess!!! \r\n" ); |
15 | retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); |
17 | printf( " open file error : %d\r\n" ,retSD); |
19 | printf( " open file sucess!!! \r\n" ); |
22 | retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); |
24 | printf( " write file error : %d\r\n" ,retSD); |
27 | printf( " write file sucess!!! \r\n" ); |
28 | printf( " write Data : %s\r\n" ,wtext); |
32 | retSD = f_close(&fil); |
34 | printf( " close error : %d\r\n" ,retSD); |
36 | printf( " close sucess!!! \r\n" ); |
39 | retSD = f_open(&fil, filename, FA_READ); |
41 | printf( " open file error : %d\r\n" ,retSD); |
43 | printf( " open file sucess!!! \r\n" ); |
46 | retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); |
48 | printf( " read error!!! %d\r\n" ,retSD); |
51 | printf( " read sucess!!! \r\n" ); |
52 | printf( " read Data : %s\r\n" ,rtext); |
56 | retSD = f_close(&fil); |
58 | printf( " close error!!! %d\r\n" ,retSD); |
60 | printf( " close sucess!!! \r\n" ); |
63 | if (bytesread == byteswritten) |
65 | printf( " FatFs is working well!!!\r\n" ); |
在main.c文件后面添加错误处理函数。
02 | static void Error_Handler(void) |
04 | printf( "something wrong ....\r\n" ); |
在main.c文件前面添加错误处理函数声明。
3 | static void Error_Handler(void); |
编译程序并下载到开发板。将Micro SD卡插入Micro SD Storage Board中,再插到Open746I-C开发的SDMMC接口中。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。
下载简介一下FATFS的几个操作函数。 1.f_mount 在FatFs模块上注册、注销一个工作区(文件系统对象)。 参数
fs 工作区(文件系统对象)指针
path 注册/注销工作区的逻辑驱动器号
opt 注册或注销选项
2.f_open
创建/打开一个文件对象 path 文件名指针,指定将创建或打开的文件名 mode 访问类型和打开方法,由一下标准的一个组合指定的。
模式 描述 FA_READ 指定读访问对象。可以从文件中读取数据。 与FA_WRITE 结 合可以进行读写访问。 FA_WRITE 指定写访问对象。可以向文件中写入数据。与FA_READ 结合 可以进行读写访问。 FA_OPEN_EXISTING 打开文件。如果文件不存在,则打开失败。(默认) FA_OPEN_ALWAYS 如果文件存在,则打开;否则,创建一个新文件。 FA_CREATE_NEW 创建一个新文件。如果文件已存在,则创建失败。 FA_CREATE_ALWAYS 创建一个新文件。如果文件已存在,则它将被截断并覆盖。
3.f_close 关闭一个打开的文件 fp 指向将被关闭的已打开的文件对象结构的指针。
4.f_read
从一个打开的文件中读取数据 fp 指向将被读取的已打开的文件对象结构的指针
buff 指向存储读取数据的缓冲区的指针
btr 要读取的字节数
br 指向返回已读取字节数的UINT变量的指针,返回为实际读取的字节数。
5.f_write 写入数据到一个已打开的文件 fp 指向将被写入的已打开的文件对象结构的指针
buff 指向存储写入数据的缓冲区的指针
btr 要写入的字节数
br 指向返回已写入字节数的UINT变量的指针,返回为实际写入的字节数。
另外FatFs还有很多API操作函数,在这里不再作详细的介绍,详细信息请查看FatFs文件系统官网。
|