STM32F1移植FATFS文件系统

本文介绍如何在STM32微控制器上使用SPI接口连接外部FLASH存储器,并移植FATFS文件系统,实现数据的持久化存储。文章详细讲解了FATFS文件系统的特性、移植步骤和配置方法,最后通过示例代码展示了如何在STM32上进行文件的读写操作。

为了使单片机能在复位或掉电重启后还能保存之前的参数或数据,就需要用到一些非易失存储器,如ROM、FLASH等,本文利用STM32F103的SPI功能挂接外部FLASH的方法实现该功能。
选用的FLASH参数及连接引脚如下:
在这里插入图片描述
关于STM32读写外部FLASH的程序可参考野火的相关教程,这里不再赘述。

STM32利用外部FLASH直接存储数据存在许多缺点,如难以记录有效数据的位置,难以确定
存储介质的剩余空间,以及应以何种格式来解读数据等,所以寻求完善的文件系统来管理数据是必要的,这里采用FATFS文件系统,记录其移植到STM32的步骤。

一、FATFS简介
FatFs是用于小型嵌入式系统的通用FAT / exFAT文件系统模块。 FatFs模块是依据ANSI C(C89)标准编写的,并且与磁盘I / O层完全分开。 因此,它的运行独立于平台。 可以将其合并到资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。此处还提供了适用于小型微控制器的Petit FatFs模块。
特性:

  • 与DOS / Windows兼容的FAT / exFAT文件系统。
  • 与平台无关, 易于移植。
  • 程序代码和工作区的空间占用非常小。
  • 支持以下各种配置选项:
    ANSI / OEM或Unicode中的长文件名。
    exFAT文件系统,可存储大文件的64位LBA和GPT。
    满足RTOS的线程安全。
    支持多个卷(物理驱动器和分区)。
    支持可变扇区大小。
    支持包括DBCS等的多个代码页。
    只读,可选API,I / O缓冲区等。

官网地址:http://elm-chan.org/fsw/ff/00index_e.html
目前最新版本:R0.14(2019年10月14日发布)

二、FATFS文件系统的程序结构
下图是具备FatFs模块的嵌入式系统的典型配置,但非特定配置,显示了FatFs文件系统的程序调用关系。
在这里插入图片描述
对于单个存储器和多个存储器的调用结构如下图:
在这里插入图片描述
移植FatFs只需要编写所用的磁盘I/O功能,并且可以裁剪功能,例如,只读配置不需要任何写入功能。下表显示了FatFs功能与配置选项的对应关系。
在这里插入图片描述
在移植过程中主要编写disk_status、disk_initialize、disk_read、disk_write、disk_ioctl 这几个功能函数。

三、FATFS文件系统移植至STM32
1、移植准备
从官网下载源码后解压,documents文件夹存放FatFs的功能说明,source中存放源代码
在这里插入图片描述
在这里插入图片描述
将源代码添加到读写外部FLASH的Keil工程,如图:
在这里插入图片描述
2、修改diskio.c中的磁盘I/O函数

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2019        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various exsisting      */
/* storage control modules to the FatFs module with a defined API.       */
/*-----------------------------------------------------------------------*/

#include "ff.h"			/* Obtains integer types */
#include "diskio.h"		/* Declarations of disk functions */
#include "./flash/bsp_spi_flash.h"//包含FLASH读写的文件

/* Definitions of physical drive number for each drive */
#define SPI_FLASH		0	/* 外部FLASH */


/*-----------------------------------------------------------------------*/
/* Get Drive Status  获取设备状态                                                    */
/*-----------------------------------------------------------------------*/

DSTATUS disk_status (
	BYTE pdrv		/* Physical drive nmuber to identify the drive */
)
{
   
   
	DSTATUS stat = STA_NOINIT;

	switch (pdrv) 
	{
   
   
		case SPI_FLASH :
			//读取FLASH的ID
			if(sFLASH_ID == SPI_FLASH_ReadID())
			{
   
   
				//设备ID读取正确
				stat &= ~STA_NOINIT;
			}
			else
			{
   
   
				//设备ID读取错误
				stat = STA_NOINIT;
			}
			break;
			
		default:
			stat = STA_NOINIT;
	}
	
	return stat;
}



/*-----------------------------------------------------------------------*/
/* Inidialize a Drive   初始化设备                                                 */
/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize (
	BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
   
   
	uint16_t i;
	DSTATUS stat = STA_NOINIT;

	switch (pdrv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值