匿名
未登录
登录
丢石头百科
搜索
查看“STM32CubeMX系列教程18:文件系统FATFS”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
STM32CubeMX系列教程18:文件系统FATFS
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
<b style="font-size: 14px; line-height: 16.8px; widows: auto;">FATFS简介</b> <b style="font-size: 14px; line-height: 16.8px; widows: auto;"> </b> 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上建立文件系统。 [[File:182325fobdrstafmysojzs.png]] 在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。 [[File:182325nfzfbezhmo4u4shv.png]] 点击菜单栏中Project->Setting修改堆的大小,堆设置为0x1000。(注意:由于刚才设置长文件名动态缓存存储在堆中,故需要增大堆大小,如果不修改则程序运行时堆会生成溢出,程序进入硬件错误中断(HardFault),死循环)。 [[File:182326vmyxtrgl99308m7y.png]] 生成报告以及代码,编译程序。在fatfs.c文件中可以看到FATFS初始化函数。在bsp_drver_sd.c文件中可以看到SD卡的板级操作函数,包括SD初始化,读写擦除块操作函数。在sd_diskio.c文件中可以看到FATFS文件系统移植的底层操作函数。 [[File:182327owztg4l4pyt2x4fd.png]] 删除上一章SDMMC的应用程序。在main.c文件前添加变量。fs为文件系统工作区,fil为文件对象结构的指针。rtext/wtext分别为读写缓存,bytesread/byteswritten分别存储读写的字节数。filename存储文件名(FATFS文件系统配置时使能了长文件名,最长255字节,若不支持长文件名,则文件名最多8个字节)。 <syntaxhighlight lang="python"> /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ FATFS fs; // Work area (file system object) for logical drive FIL fil; // file objects uint32_t byteswritten; /* File write counts */ uint32_t bytesread; /* File read counts */ uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */ uint8_t rtext[100]; /* File read buffers */ char filename[] = "STM32cube.txt"; /* USER CODE END PV */</syntaxhighlight> 在main函数中添加应用程序。程序中首先注册一个文件系统对象,然后新建STM32cube.txt文件,将数据写文件中再读出来,判断文件系统是否工作正常。 <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> /* USER CODE BEGIN 2 */ printf("\r\n ****** FatFs Example ******\r\n\r\n"); /*##-1- Register the file system object to the FatFs module ##############*/ retSD = f_mount(&fs, "", 0); if(retSD) { printf(" mount error : %d \r\n",retSD); Error_Handler(); } else printf(" mount sucess!!! \r\n"); /*##-2- Create and Open new text file objects with write access ######*/ retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); if(retSD) printf(" open file error : %d\r\n",retSD); else printf(" open file sucess!!! \r\n"); /*##-3- Write data to the text files ###############################*/ retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); if(retSD) printf(" write file error : %d\r\n",retSD); else { printf(" write file sucess!!! \r\n"); printf(" write Data : %s\r\n",wtext); } /*##-4- Close the open text files ################################*/ retSD = f_close(&fil); if(retSD) printf(" close error : %d\r\n",retSD); else printf(" close sucess!!! \r\n"); /*##-5- Open the text files object with read access ##############*/ retSD = f_open(&fil, filename, FA_READ); if(retSD) printf(" open file error : %d\r\n",retSD); else printf(" open file sucess!!! \r\n"); /*##-6- Read data from the text files ##########################*/ retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); if(retSD) printf(" read error!!! %d\r\n",retSD); else { printf(" read sucess!!! \r\n"); printf(" read Data : %s\r\n",rtext); } /*##-7- Close the open text files ############################*/ retSD = f_close(&fil); if(retSD) printf(" close error!!! %d\r\n",retSD); else printf(" close sucess!!! \r\n"); /*##-8- Compare read data with the expected data ############*/ if(bytesread == byteswritten) { printf(" FatFs is working well!!!\r\n"); } /* USER CODE END 2 */</syntaxhighlight> <code style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; background-color: inherit;"> </syntaxhighlight> <syntaxhighlight lang="python"> 在main.c文件后面添加错误处理函数。</syntaxhighlight> <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> /* USER CODE BEGIN 4 */ static void Error_Handler(void) { printf("something wrong ....\r\n"); /* User may add here some code to deal with this error */ while(1) { } } /* USER CODE END 4 */</syntaxhighlight> <code style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; color: rgb(0, 130, 0) !important; font-size: 1em !important; background-color: inherit;"> </syntaxhighlight> <syntaxhighlight lang="python"> 在main.c文件前面添加错误处理函数声明。</syntaxhighlight> <syntaxhighlight lang="python"> /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ static void Error_Handler(void); /* USER CODE END PFP */</syntaxhighlight> </code> 编译程序并下载到开发板。将Micro SD卡插入Micro SD Storage Board中,再插到Open746I-C开发的SDMMC接口中。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。 [[File:183449hfhnj227im423h7h.png]] 下载简介一下FATFS的几个操作函数。 <b>1.f_mount</b> 在FatFs模块上注册、注销一个工作区(文件系统对象)。 <syntaxhighlight lang="python"> FRESULT f_mount ( FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/ const TCHAR* path, /* Logical drive number to be mounted/unmounted */ BYTE opt /* 0:Do not mount (delayed mount), 1:Mount immediately */ )</syntaxhighlight> <syntaxhighlight lang="python"> 参数</syntaxhighlight> <syntaxhighlight lang="python"> fs 工作区(文件系统对象)指针</syntaxhighlight> <syntaxhighlight lang="python"> path 注册/注销工作区的逻辑驱动器号</syntaxhighlight> <syntaxhighlight lang="python"> opt 注册或注销选项</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> <b>2.f_open</b></syntaxhighlight> 创建/打开一个文件对象 <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> FRESULT f_open ( FIL* fp, /* Pointer to the blank file object */ const TCHAR* path, /* Pointer to the file name */ BYTE mode /* Access mode and file open mode flags */ )</syntaxhighlight>fp 将被创建的文件对象结构的指针</syntaxhighlight> path 文件名指针,指定将创建或打开的文件名 mode 访问类型和打开方法,由一下标准的一个组合指定的。 模式 描述 FA_READ 指定读访问对象。可以从文件中读取数据。 与FA_WRITE 结 合可以进行读写访问。 FA_WRITE 指定写访问对象。可以向文件中写入数据。与FA_READ 结合 可以进行读写访问。 FA_OPEN_EXISTING 打开文件。如果文件不存在,则打开失败。(默认) FA_OPEN_ALWAYS 如果文件存在,则打开;否则,创建一个新文件。 FA_CREATE_NEW 创建一个新文件。如果文件已存在,则创建失败。 FA_CREATE_ALWAYS 创建一个新文件。如果文件已存在,则它将被截断并覆盖。 <b>3.f_close</b> 关闭一个打开的文件 <syntaxhighlight lang="python"> FRESULT f_close ( FIL *fp /* Pointer to the file object to be closed */ )</syntaxhighlight> <syntaxhighlight lang="python"> fp 指向将被关闭的已打开的文件对象结构的指针。</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> <b>4.f_read</b></syntaxhighlight> 从一个打开的文件中读取数据 <syntaxhighlight lang="python"> FRESULT f_read ( FIL* fp, /* Pointer to the file object */ void* buff, /* Pointer to data buffer */ UINT btr, /* Number of bytes to read */ UINT* br /* Pointer to number of bytes read */ )</syntaxhighlight> <syntaxhighlight lang="python"> fp 指向将被读取的已打开的文件对象结构的指针 </syntaxhighlight> <syntaxhighlight lang="python"> buff 指向存储读取数据的缓冲区的指针</syntaxhighlight> <syntaxhighlight lang="python"> btr 要读取的字节数</syntaxhighlight> br 指向返回已读取字节数的UINT变量的指针,返回为实际读取的字节数。 <b>5.f_write</b> 写入数据到一个已打开的文件 <syntaxhighlight lang="python"> FRESULT f_write ( FIL* fp, /* Pointer to the file object */ const void *buff, /* Pointer to the data to be written */ UINT btw, /* Number of bytes to write */ UINT* bw /* Pointer to number of bytes written */ )</syntaxhighlight> <syntaxhighlight lang="python"> fp 指向将被写入的已打开的文件对象结构的指针 </syntaxhighlight> <syntaxhighlight lang="python"> buff 指向存储写入数据的缓冲区的指针</syntaxhighlight> <syntaxhighlight lang="python"> btr 要写入的字节数</syntaxhighlight> br 指向返回已写入字节数的UINT变量的指针,返回为实际写入的字节数。 另外FatFs还有很多API操作函数,在这里不再作详细的介绍,详细信息请查看FatFs文件系统官网。 <syntaxhighlight lang="python"> </syntaxhighlight> </code> <syntaxhighlight lang="python"> </syntaxhighlight>
返回至
STM32CubeMX系列教程18:文件系统FATFS
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志