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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版