赞
踩
如果我们需要手动移植FatFs的话,可以从fatfs官网下载源码:
使用STM32Cube添加FatFs文件系统:
接下来就是fatfs的参数配置,根据个人的需求进行修改,也可以使用默认参数:
使用STM32Cube自动生成FatFs文件系统代码后,接下来就是修改底层驱动的相关函数了,我们这以外部flash为例:
在user_diskio.c文件中分别写入USER_initialize()、USER_status()、USER_read()、USER_write(),也就是增加spi_flash的底层驱动。
- DSTATUS USER_initialize (
- BYTE pdrv /* Physical drive nmuber to identify the drive */
- )
- {
- /* USER CODE BEGIN INIT */
- Stat = STA_NOINIT;
- /* 初始化SPI Flash */
- if(sFLASH_ID == SPI_FLASH_ReadID())
- {
- SPI_FLASH_Init();
- Stat =RES_OK;
- }
- else
- {
- Stat =RES_ERROR;
- }
-
- return Stat;
- /* USER CODE END INIT */
- }
-
- DSTATUS USER_status (
- BYTE pdrv /* Physical drive number to identify the drive */
- )
- {
- /* USER CODE BEGIN STATUS */
- Stat = STA_NOINIT;
- if(sFLASH_ID == SPI_FLASH_ReadID())
- {
- SPI_FLASH_Init();
- Stat =RES_OK;
- }
- else
- {
- Stat =RES_ERROR;
- }
-
- return Stat;
- /* USER CODE END STATUS */
- }
-
- DRESULT USER_read (
- BYTE pdrv, /* Physical drive nmuber to identify the drive */
- BYTE *buff, /* Data buffer to store read data */
- DWORD sector, /* Sector address in LBA */
- UINT count /* Number of sectors to read */
- )
- {
- /* USER CODE BEGIN READ */
- SPI_FLASH_BufferRead(buff,sector,count);
-
- return RES_OK;
- /* USER CODE END READ */
- }
-
- DRESULT USER_write (
- BYTE pdrv, /* Physical drive nmuber to identify the drive */
- const BYTE *buff, /* Data to be written */
- DWORD sector, /* Sector address in LBA */
- UINT count /* Number of sectors to write */
- )
- {
- /* USER CODE BEGIN WRITE */
- /* USER CODE HERE */
- SPI_FLASH_BufferWrite((uint8_t *)buff,sector,count);
- return RES_OK;
- /* USER CODE END WRITE */
- }
-
增加SPI_Flash底层驱动后,就可以正常调用FatFs文件系统应用层函数接口,完成文件操作。
- #include "main.h"
- #include "bsp_usart.h"
- #include "ff.h"
- #include "string.h"
- #include "bsp_spi_flash.h"
-
- FATFS fs; /* FatFs文件系统对象 */
- FIL fnew; /* 文件对象 */
- FRESULT res_flash; /* 文件操作结果 */
- UINT fnum; /* 文件成功读写数量 */
- char readbuffer[512]; /* 读缓冲区 */
- char Writebuffer[] ={Test App!!!/r/n}; /* 写缓冲区 */
-
- int main(void)
- {
- HAL_Init();
- /* 配置系统时钟为72 MHz */
- SystemClock_Config();
- /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
- DEBUG_USART_Config();
- printf("******** 这是一个SPI FLASH 文件系统实验 *******\r\n");
-
- //在外部SPI Flash挂载文件系统,文件系统挂载时会对SPI设备初始化
- res_flash = f_mount(&fs,"1:",1);
- if(res_flash == FR_OK)
- {
- printf("Mount OK\r\n");
- }
- else
- {
- printf("Mount False\r\n");
- res_flash = f_mount(&fs,"1:",1);
- if(res_flash == FR_OK)
- printf("Mount OK\r\n");
- else
- printf("Mount False\r\n");
- }
- //打开文件操作
- res_flash = f_open(&fnew, "1:FatFs读写测试文件.txt",FA_OPEN_ALWAYS|FA_WRITE|FA_READ );
- if ( res_flash == FR_OK )
- {
- printf("File open OK\r\n");
- }
- else
- {
- printf("Mount False\r\n");
- res_flash = f_open(&fnew, "1:FatFs读写测试件.txt",
- FA_OPEN_ALWAYS|FA_WRITE|FA_READ);
- if(res_flash == FR_OK)
- printf("File open OK\r\n");
- else
- printf("Mount False\r\n");
- }
- //向文件系统写操作
- res_flash=f_write(&fnew,Writebuffer,sizeof(WriteBuffer),&fnum);
- if ( res_flash == FR_OK )
- printf("Write open OK\r\n");
- else
- printf("Mount False\r\n");
- //读文件系统数据操作
- res_flash = f_lseek(&fnew,0);
- res_flash=f_read(&fnew,Readbuffer,sizeof(ReadBuffer),&fnum);
- if ( res_flash == FR_OK )
- {
- printf("Read OK\r\n");
- printf("ReadBuffer =%s\r\n", ReadBuffer);
- }
- else
- printf("Read False\r\n");
- //关闭文件系统
- f_close(&fnew);
- }
最后就是打开串口助手,查看打印结果了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。