完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
FATFS简介
FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM等等。兼容Windows文件系统。 关于FATFS文件系统的API函数介绍,底层移植接口和例程等可以查到FATFS官网。 FATFS官网:http://elm-chan.org/fsw/ff/00index_e.html 结合STM32cubeMX软件移植FATFS文件系统非常简单。本章程序在上一章SDMMC工程的基础上修改,复制串口SDMMC的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。在中间件中选择SD卡,在SD上建立文件系统。 |
|
相关推荐
|
|
在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。
file:///C:/Users/Administrator/AppData/Local/YNote/data/qq05E2D92FFCC85611A0CBEB4448FFA27E/90c1ac4d5fac41b989dd9523ed3d1a53/clipboard.png |
|
|
|
|
|
点击菜单栏中Project->Setting修改堆的大小,堆设置为0x1000。(注意:由于刚才设置长文件名动态缓存存储在堆中,故需要增大堆大小,如果不修改则程序运行时堆会生成溢出,程序进入硬件错误中断(HardFault),死循环)。
|
|
|
|
|
|
生成报告以及代码,编译程序。在fatfs.c文件中可以看到FATFS初始化函数。在bsp_drver_sd.c文件中可以看到SD卡的板级操作函数,包括SD初始化,读写擦除块操作函数。在sd_diskio.c文件中可以看到FATFS文件系统移植的底层操作函数。
file:///C:/Users/Administrator/AppData/Local/YNote/data/qq05E2D92FFCC85611A0CBEB4448FFA27E/cdc2b2d0113c44279fd1c728a6c0298d/clipboard.png |
|
|
|
|
|
删除上一章SDMMC的应用程序。在main.c文件前添加变量。fs为文件系统工作区,fil为文件对象结构的指针。rtext/wtext分别为读写缓存,bytesread/byteswritten分别存储读写的字节数。filename存储文件名(FATFS文件系统配置时使能了长文件名,最长255字节,若不支持长文件名,则文件名最多8个字节)。
01 /* USER CODE BEGIN PV */ 02 /* Private variables ---------------------------------------------------------*/ 03 FATFS fs; // Work area (file system object) for logical drive 04 FIL fil; // file objects 05 06 uint32_t byteswritten; /* File write counts */ 07 uint32_t bytesread; /* File read counts */ 08 uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */ 09 uint8_t rtext[100]; /* File read buffers */ 10 char filename[] = "STM32cube.txt"; 11 /* USER CODE END PV */ |
|
|
|
|
|
在main函数中添加应用程序。程序中首先注册一个文件系统对象,然后新建STM32cube.txt文件,将数据写文件中再读出来,判断文件系统是否工作正常。
01 /* USER CODE BEGIN 2 */ 02 printf("rn ****** FatFs Example ******rnrn"); 03 04 /*##-1- Register the file system object to the FatFs module ##############*/ 05 retSD = f_mount(&fs, "", 0); 06 if(retSD) 07 { 08 printf(" mount error : %d rn",retSD); 09 Error_Handler(); 10 } 11 else 12 printf(" mount sucess!!! rn"); 13 14 /*##-2- Create and Open new text file objects with write access ######*/ 15 retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); 16 if(retSD) 17 printf(" open file error : %drn",retSD); 18 else 19 printf(" open file sucess!!! rn"); 20 21 /*##-3- Write data to the text files ###############################*/ 22 retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); 23 if(retSD) 24 printf(" write file error : %drn",retSD); 25 else 26 { 27 printf(" write file sucess!!! rn"); 28 printf(" write Data : %srn",wtext); 29 } 30 31 /*##-4- Close the open text files ################################*/ 32 retSD = f_close(&fil); 33 if(retSD) 34 printf(" close error : %drn",retSD); 35 else 36 printf(" close sucess!!! rn"); 37 38 /*##-5- Open the text files object with read access ##############*/ 39 retSD = f_open(&fil, filename, FA_READ); 40 if(retSD) 41 printf(" open file error : %drn",retSD); 42 else 43 printf(" open file sucess!!! rn"); 44 45 /*##-6- Read data from the text files ##########################*/ 46 retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); 47 if(retSD) 48 printf(" read error!!! %drn",retSD); 49 else 50 { 51 printf(" read sucess!!! rn"); 52 printf(" read Data : %srn",rtext); 53 } 54 55 /*##-7- Close the open text files ############################*/ 56 retSD = f_close(&fil); 57 if(retSD) 58 printf(" close error!!! %drn",retSD); 59 else 60 printf(" close sucess!!! rn"); 61 62 /*##-8- Compare read data with the expected data ############*/ 63 if(bytesread == byteswritten) 64 { 65 printf(" FatFs is working well!!!rn"); 66 } 67 /* USER CODE END 2 */ |
|
|
|
|
|
在main.c文件后面添加错误处理函数。
01 /* USER CODE BEGIN 4 */ 02 static void Error_Handler(void) 03 { 04 printf("something wrong ....rn"); 05 /* User may add here some code to deal with this error */ 06 while(1) 07 { 08 } 09 } 10 /* USER CODE END 4 */ 在main.c文件前面添加错误处理函数声明。 1 /* USER CODE BEGIN PFP */ 2 /* Private function prototypes -----------------------------------------------*/ 3 static void Error_Handler(void); 4 /* USER CODE END PFP */ |
|
|
|
|
|
编译程序并下载到开发板。将Micro SD卡插入Micro SD Storage Board中,再插到Open746I-C开发的SDMMC接口中。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。
下载简介一下FATFS的几个操作函数。 1.f_mount 在FatFs模块上注册、注销一个工作区(文件系统对象)。 1 FRESULT f_mount ( 2 FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/ 3 const TCHAR* path, /* Logical drive number to be mounted/unmounted */ 4 BYTE opt /* 0:Do not mount (delayed mount), 1:Mount immediately */ 5 ) 参数 fs 工作区(文件系统对象)指针 path 注册/注销工作区的逻辑驱动器号 opt 注册或注销选项 |
|
|
|
|
|
FATFS简介 FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM等等。兼容Windows文件系统。 关于FATFS文件系统的API函数介绍,底层移植接口和例程等可以查到FATFS官网。 FATFS官网:http://elm-chan.org/fsw/ff/00index_e.html 结合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个字节)。 01 /* USER CODE BEGIN PV */ 02 /* Private variables ---------------------------------------------------------*/ 03 FATFS fs; // Work area (file system object) for logical drive 04 FIL fil; // file objects 05 06 uint32_t byteswritten; /* File write counts */ 07 uint32_t bytesread; /* File read counts */ 08 uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */ 09 uint8_t rtext[100]; /* File read buffers */ 10 char filename[] = "STM32cube.txt"; 11 /* USER CODE END PV */ 在main函数中添加应用程序。程序中首先注册一个文件系统对象,然后新建STM32cube.txt文件,将数据写文件中再读出来,判断文件系统是否工作正常。 01 /* USER CODE BEGIN 2 */ 02 printf("rn ****** FatFs Example ******rnrn"); 03 04 /*##-1- Register the file system object to the FatFs module ##############*/ 05 retSD = f_mount(&fs, "", 0); 06 if(retSD) 07 { 08 printf(" mount error : %d rn",retSD); 09 Error_Handler(); 10 } 11 else 12 printf(" mount sucess!!! rn"); 13 14 /*##-2- Create and Open new text file objects with write access ######*/ 15 retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); 16 if(retSD) 17 printf(" open file error : %drn",retSD); 18 else 19 printf(" open file sucess!!! rn"); 20 21 /*##-3- Write data to the text files ###############################*/ 22 retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); 23 if(retSD) 24 printf(" write file error : %drn",retSD); 25 else 26 { 27 printf(" write file sucess!!! rn"); 28 printf(" write Data : %srn",wtext); 29 } 30 31 /*##-4- Close the open text files ################################*/ 32 retSD = f_close(&fil); 33 if(retSD) 34 printf(" close error : %drn",retSD); 35 else 36 printf(" close sucess!!! rn"); 37 38 /*##-5- Open the text files object with read access ##############*/ 39 retSD = f_open(&fil, filename, FA_READ); 40 if(retSD) 41 printf(" open file error : %drn",retSD); 42 else 43 printf(" open file sucess!!! rn"); 44 45 /*##-6- Read data from the text files ##########################*/ 46 retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); 47 if(retSD) 48 printf(" read error!!! %drn",retSD); 49 else 50 { 51 printf(" read sucess!!! rn"); 52 printf(" read Data : %srn",rtext); 53 } 54 55 /*##-7- Close the open text files ############################*/ 56 retSD = f_close(&fil); 57 if(retSD) 58 printf(" close error!!! %drn",retSD); 59 else 60 printf(" close sucess!!! rn"); 61 62 /*##-8- Compare read data with the expected data ############*/ 63 if(bytesread == byteswritten) 64 { 65 printf(" FatFs is working well!!!rn"); 66 } 67 /* USER CODE END 2 */ 在main.c文件后面添加错误处理函数。 01 /* USER CODE BEGIN 4 */ 02 static void Error_Handler(void) 03 { 04 printf("something wrong ....rn"); 05 /* User may add here some code to deal with this error */ 06 while(1) 07 { 08 } 09 } 10 /* USER CODE END 4 */ 在main.c文件前面添加错误处理函数声明。 1 /* USER CODE BEGIN PFP */ 2 /* Private function prototypes -----------------------------------------------*/ 3 static void Error_Handler(void); 4 /* USER CODE END PFP */ 编译程序并下载到开发板。将Micro SD卡插入Micro SD Storage Board中,再插到Open746I-C开发的SDMMC接口中。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。 下载简介一下FATFS的几个操作函数。 1.f_mount 在FatFs模块上注册、注销一个工作区(文件系统对象)。 1 FRESULT f_mount ( 2 FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/ 3 const TCHAR* path, /* Logical drive number to be mounted/unmounted */ 4 BYTE opt /* 0:Do not mount (delayed mount), 1:Mount immediately */ 5 ) 参数 fs 工作区(文件系统对象)指针 path 注册/注销工作区的逻辑驱动器号 opt 注册或注销选项 2.f_open 创建/打开一个文件对象 1 FRESULT f_open ( 2 FIL* fp, /* Pointer to the blank file object */ 3 const TCHAR* path, /* Pointer to the file name */ 4 BYTE mode /* Access mode and file open mode flags */ 5 ) fp 将被创建的文件对象结构的指针 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 关闭一个打开的文件 1 FRESULT f_close ( 2 FIL *fp /* Pointer to the file object to be closed */ 3 ) fp 指向将被关闭的已打开的文件对象结构的指针。 |
|
|
|
|
|
4.f_read
从一个打开的文件中读取数据 1 FRESULT f_read ( 2 FIL* fp, /* Pointer to the file object */ 3 void* buff, /* Pointer to data buffer */ 4 UINT btr, /* Number of bytes to read */ 5 UINT* br /* Pointer to number of bytes read */ 6 ) fp 指向将被读取的已打开的文件对象结构的指针 buff 指向存储读取数据的缓冲区的指针 btr 要读取的字节数 br 指向返回已读取字节数的UINT变量的指针,返回为实际读取的字节数。 5.f_write 写入数据到一个已打开的文件 1 FRESULT f_write ( 2 FIL* fp, /* Pointer to the file object */ 3 const void *buff, /* Pointer to the data to be written */ 4 UINT btw, /* Number of bytes to write */ 5 UINT* bw /* Pointer to number of bytes written */ 6 ) fp 指向将被写入的已打开的文件对象结构的指针 buff 指向存储写入数据的缓冲区的指针 btr 要写入的字节数 br 指向返回已写入字节数的UINT变量的指针,返回为实际写入的字节数。 另外FatFs还有很多API操作函数,在这里不再作详细的介绍,详细信息请查看FatFs文件系统官网。 |
|
|
|
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-TF卡烧录流程之烧写过程
1128 浏览 0 评论
1826 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之烧写原理
1441 浏览 0 评论
请问SPH0641LU4H这款麦克风如何在不使用I2S的情况下,单纯通过GPIO来进行驱动且正常读取数据呢
1081 浏览 1 评论
642 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12105 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-4 11:48 , Processed in 0.617207 second(s), Total 55, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号