当前位置:   article > 正文

STM32Cube学习篇(5)---FatFs文件系统(SPI Flash)_外部flash文件系统

外部flash文件系统

FatFs介绍

FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统。 它完全是由 ANSI C 语言编写并且完
全独立于底层的 I/O 介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如 8051
PIC AVR SH Z80 H8 ARM 等。

 如果我们需要手动移植FatFs的话,可以从fatfs官网下载源码:

http://elm-chan.org/fsw/ff/00index_e.html
在下载的src文件夹中,主要用到的文件有:
option 文件夹下是一些可选的外部 c 文件,包含了多语言支持需要用到的文件和转换函数。
diskio.c 文件是 FatFs 移植最关键的文件,它为文件系统提供了最底层的访问 SPI Flash 芯片的方
法, FatFs 有且仅有它需要用到与 SPI Flash 芯片相关的函数。
ff.c FatFs 核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用
这些函数实现文件的读写。
ffffconf.h: 这个头文件包含了对 FatFs 功能配置的宏定义,通过修改这些宏定义就可以裁剪
FatFs 的功能。如
下面简单介绍下, FatFs源文件的分布:

FatFs 组件是 FatFs 的主体,文件都在源码 src 文件夹中,其中 ff.c ff.h integer.h 以及 diskio.h 四 个文件我们不需要改动,只需要修改 ffconf.h diskio.c 两个文件。
用户应用程序需要由用户编写,想实现什么功能就编写什么的程序,一般我们只用到 f_mount()
f_open() f_write() f_read() 就可以实现文件的读写操作。

Flash文件系统FatFs使用实验

使用STM32Cube添加FatFs文件系统:

 接下来就是fatfs的参数配置,根据个人的需求进行修改,也可以使用默认参数:

 使用STM32Cube自动生成FatFs文件系统代码后,接下来就是修改底层驱动的相关函数了,我们这以外部flash为例:

在user_diskio.c文件中分别写入USER_initialize()、USER_status()、USER_read()、USER_write(),也就是增加spi_flash的底层驱动。

  1. DSTATUS USER_initialize (
  2. BYTE pdrv /* Physical drive nmuber to identify the drive */
  3. )
  4. {
  5. /* USER CODE BEGIN INIT */
  6. Stat = STA_NOINIT;
  7. /* 初始化SPI Flash */
  8. if(sFLASH_ID == SPI_FLASH_ReadID())
  9. {
  10. SPI_FLASH_Init();
  11. Stat =RES_OK;
  12. }
  13. else
  14. {
  15. Stat =RES_ERROR;
  16. }
  17. return Stat;
  18. /* USER CODE END INIT */
  19. }
  20. DSTATUS USER_status (
  21. BYTE pdrv /* Physical drive number to identify the drive */
  22. )
  23. {
  24. /* USER CODE BEGIN STATUS */
  25. Stat = STA_NOINIT;
  26. if(sFLASH_ID == SPI_FLASH_ReadID())
  27. {
  28. SPI_FLASH_Init();
  29. Stat =RES_OK;
  30. }
  31. else
  32. {
  33. Stat =RES_ERROR;
  34. }
  35. return Stat;
  36. /* USER CODE END STATUS */
  37. }
  38. DRESULT USER_read (
  39. BYTE pdrv, /* Physical drive nmuber to identify the drive */
  40. BYTE *buff, /* Data buffer to store read data */
  41. DWORD sector, /* Sector address in LBA */
  42. UINT count /* Number of sectors to read */
  43. )
  44. {
  45. /* USER CODE BEGIN READ */
  46. SPI_FLASH_BufferRead(buff,sector,count);
  47. return RES_OK;
  48. /* USER CODE END READ */
  49. }
  50. DRESULT USER_write (
  51. BYTE pdrv, /* Physical drive nmuber to identify the drive */
  52. const BYTE *buff, /* Data to be written */
  53. DWORD sector, /* Sector address in LBA */
  54. UINT count /* Number of sectors to write */
  55. )
  56. {
  57. /* USER CODE BEGIN WRITE */
  58. /* USER CODE HERE */
  59. SPI_FLASH_BufferWrite((uint8_t *)buff,sector,count);
  60. return RES_OK;
  61. /* USER CODE END WRITE */
  62. }

增加SPI_Flash底层驱动后,就可以正常调用FatFs文件系统应用层函数接口,完成文件操作

  1. #include "main.h"
  2. #include "bsp_usart.h"
  3. #include "ff.h"
  4. #include "string.h"
  5. #include "bsp_spi_flash.h"
  6. FATFS fs; /* FatFs文件系统对象 */
  7. FIL fnew; /* 文件对象 */
  8. FRESULT res_flash; /* 文件操作结果 */
  9. UINT fnum; /* 文件成功读写数量 */
  10. char readbuffer[512]; /* 读缓冲区 */
  11. char Writebuffer[] ={Test App!!!/r/n}; /* 写缓冲区 */
  12. int main(void)
  13. {
  14. HAL_Init();
  15. /* 配置系统时钟为72 MHz */
  16. SystemClock_Config();
  17. /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  18. DEBUG_USART_Config();
  19. printf("******** 这是一个SPI FLASH 文件系统实验 *******\r\n");
  20. //在外部SPI Flash挂载文件系统,文件系统挂载时会对SPI设备初始化
  21. res_flash = f_mount(&fs,"1:",1);
  22. if(res_flash == FR_OK)
  23. {
  24. printf("Mount OK\r\n");
  25. }
  26. else
  27. {
  28. printf("Mount False\r\n");
  29. res_flash = f_mount(&fs,"1:",1);
  30. if(res_flash == FR_OK)
  31. printf("Mount OK\r\n");
  32. else
  33. printf("Mount False\r\n");
  34. }
  35. //打开文件操作
  36. res_flash = f_open(&fnew, "1:FatFs读写测试文件.txt",FA_OPEN_ALWAYS|FA_WRITE|FA_READ );
  37. if ( res_flash == FR_OK )
  38. {
  39. printf("File open OK\r\n");
  40. }
  41. else
  42. {
  43. printf("Mount False\r\n");
  44. res_flash = f_open(&fnew, "1:FatFs读写测试件.txt",
  45. FA_OPEN_ALWAYS|FA_WRITE|FA_READ);
  46. if(res_flash == FR_OK)
  47. printf("File open OK\r\n");
  48. else
  49. printf("Mount False\r\n");
  50. }
  51. //向文件系统写操作
  52. res_flash=f_write(&fnew,Writebuffer,sizeof(WriteBuffer),&fnum);
  53. if ( res_flash == FR_OK )
  54. printf("Write open OK\r\n");
  55. else
  56. printf("Mount False\r\n");
  57. //读文件系统数据操作
  58. res_flash = f_lseek(&fnew,0);
  59. res_flash=f_read(&fnew,Readbuffer,sizeof(ReadBuffer),&fnum);
  60. if ( res_flash == FR_OK )
  61. {
  62. printf("Read OK\r\n");
  63. printf("ReadBuffer =%s\r\n", ReadBuffer);
  64. }
  65. else
  66. printf("Read False\r\n");
  67. //关闭文件系统
  68. f_close(&fnew);
  69. }

最后就是打开串口助手,查看打印结果了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/464042?site
推荐阅读
相关标签
  

闽ICP备14008679号