你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX配置文件系统FATFS

[复制链接]
o科技人生o 发布时间:2017-12-26 17:53
[转载]STM32CubeMX配置文件系统FATFS
http://www.waveshare.net/study/article-657-1.html
(出处:微雪课堂)
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上建立文件系统。

001.png
    在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。
002.png
    点击菜单栏中Project->Setting修改堆的大小,堆设置为0x1000。(注意:由于刚才设置长文件名动态缓存存储在堆中,故需要增大堆大小,如果不修改则程序运行时堆会生成溢出,程序进入硬件错误中断(HardFault),死循环)。
003.png
    生成报告以及代码,编译程序。在fatfs.c文件中可以看到FATFS初始化函数。在bsp_drver_sd.c文件中可以看到SD卡的板级操作函数,包括SD初始化,读写擦除块操作函数。在sd_diskio.c文件中可以看到FATFS文件系统移植的底层操作函数。
004.png
    删除上一章SDMMC的应用程序。在main.c文件前添加变量。fs为文件系统工作区,fil为文件对象结构的指针。rtext/wtext分别为读写缓存,bytesread/byteswritten分别存储读写的字节数。filename存储文件名(FATFS文件系统配置时使能了长文件名,最长255字节,若不支持长文件名,则文件名最多8个字节)。
  1. /* USER CODE BEGIN PV */
  2. /* Private variables ---------------------------------------------------------*/
  3. FATFS fs;                 // Work area (file system object) for logical drive
  4. FIL fil;                  // file objects
  5.   
  6. uint32_t byteswritten;                /* File write counts */
  7. uint32_t bytesread;                   /* File read counts */
  8. uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */
  9. uint8_t rtext[100];                     /* File read buffers */
  10. char filename[] = "STM32cube.txt";
  11. /* USER CODE END PV */
复制代码
在main函数中添加应用程序。程序中首先注册一个文件系统对象,然后新建STM32cube.txt文件,将数据写文件中再读出来,判断文件系统是否工作正常。

  1. /* USER CODE BEGIN 2 */
  2.     printf("\r\n ****** FatFs Example ******\r\n\r\n");

  3.     /*##-1- Register the file system object to the FatFs module ##############*/
  4.     retSD = f_mount(&fs, "", 0);
  5.     if(retSD)
  6.     {
  7.         printf(" mount error : %d \r\n",retSD);
  8.         Error_Handler();
  9.     }
  10.     else
  11.         printf(" mount sucess!!! \r\n");
  12.      
  13.     /*##-2- Create and Open new text file objects with write access ######*/
  14.     retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE);
  15.     if(retSD)
  16.         printf(" open file error : %d\r\n",retSD);
  17.     else
  18.         printf(" open file sucess!!! \r\n");
  19.      
  20.     /*##-3- Write data to the text files ###############################*/
  21.     retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten);
  22.     if(retSD)
  23.         printf(" write file error : %d\r\n",retSD);
  24.     else
  25.     {
  26.         printf(" write file sucess!!! \r\n");
  27.         printf(" write Data : %s\r\n",wtext);
  28.     }
  29.      
  30.     /*##-4- Close the open text files ################################*/
  31.     retSD = f_close(&fil);
  32.     if(retSD)
  33.         printf(" close error : %d\r\n",retSD);
  34.     else
  35.         printf(" close sucess!!! \r\n");
  36.      
  37.     /*##-5- Open the text files object with read access ##############*/
  38.     retSD = f_open(&fil, filename, FA_READ);
  39.     if(retSD)
  40.         printf(" open file error : %d\r\n",retSD);
  41.     else
  42.         printf(" open file sucess!!! \r\n");
  43.      
  44.     /*##-6- Read data from the text files ##########################*/
  45.     retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread);
  46.     if(retSD)
  47.         printf(" read error!!! %d\r\n",retSD);
  48.     else
  49.     {
  50.         printf(" read sucess!!! \r\n");
  51.         printf(" read Data : %s\r\n",rtext);
  52.     }
  53.      
  54.     /*##-7- Close the open text files ############################*/
  55.     retSD = f_close(&fil);
  56.     if(retSD)  
  57.         printf(" close error!!! %d\r\n",retSD);
  58.     else
  59.         printf(" close sucess!!! \r\n");
  60.      
  61.     /*##-8- Compare read data with the expected data ############*/
  62.     if(bytesread == byteswritten)
  63.     {
  64.         printf(" FatFs is working well!!!\r\n");
  65.     }
  66.   /* USER CODE END 2 */
复制代码
在main.c文件后面添加错误处理函数。

  1. /* USER CODE BEGIN 4 */
  2. static void Error_Handler(void)
  3. {
  4.   printf("something wrong ....\r\n");
  5.     /* User may add here some code to deal with this error */
  6.   while(1)
  7.   {
  8.   }
  9. }
  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,按下复位串口助手上面会显示如下信息。

005.png
下载简介一下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文件系统官网。








评分

参与人数 1 ST金币 +10 收起 理由
g921002 + 10 看起來之前的Bug都修訂了。XD

查看全部评分

收藏 评论1 发布时间:2017-12-26 17:53

举报

1个回答
shaidn 回答时间:2017-12-26 20:46:26
学习中,谢谢!

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版