STM32F103RC,FATFS,w25x16移植笔记

本文详细记录了将FatFS文件系统移植到STM32F103RC微控制器上的过程,涉及SPI_FLASH初始化、扇区读写及ioctl接口的实现。在移植过程中遇到了FR_NO_FILESYSTEM错误,通过检查发现是由于未执行f_mkfs格式化和Flash写入操作不当导致。解决方案是确保在写入前正确擦除扇区,以符合w25x16 Flash芯片的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这些天移植了FatFS文件系统到STM32F103RC板上,使用STM32的SPI_FLASH库,出现了一些问题现在记录下来。

接下来说一下移植的过程:

移植的最新版本为FatFS 0.12版本版本中主要包含以下几个文件:diskio.c diskio.h ff.c ff.h ffconf.h integer.h。
其中,ff相关的文件为FatFS的核心文件系统文件,diskio相关的文件为文件系统与底层硬件交互的接口文件,ffconf.h是用来配置文件系统配置的一些参数,integer.h是对不同平台变量类型的定义。

1.修改ffconf.h

_FS_READONLY         //文件系统只读
_FS_MINIMIZE         //移除一些函数,定义最小文件系统
_USE_STRFUNC         //允许使用一些字符串函数
_USE_FIND            //开启一些查询函数
_USE_MKFS            //f_mkfs,可以格式化Flash
_USE_FASTSEEK        //开启一些快速定位函数
_USE_EXPAND          //开启一些扩展函数
_USE_CHMOD           //开启权限相关的函数
_USE_LABEL           //开启卷标相关函数
_USE_FORWARD         //开启使用数据流而不用缓冲区
_CODE_PAGE           //代码页格式
_USE_LFN             //开启长文件名模式
_MAX_LFN             //设置最长文件名长度
_LFN_UNICODE         //设置长文件名编码格式
_STRF_ENCODE         //长命名文件中字符串编码格式
_FS_RPATH            //支持目录更改
_VOLUMES             //支持硬盘个数
_STR_VOLUME_ID       //允许字符串模式的ID
_VOLUME_STRS         //字符串模式的具体字符串
_MULTI_PARTITION     //允许新建多个分区
_MIN_SS              //所支持最小的扇区大小
_MAX_SS              //所支持最大的扇区大小
_USE_TRIM            //支持空闲区域回收
_FS_NOFSINFO         //支持查询文件系统信息
_FS_TINY             //支持微型文件系统
_FS_EXFAT            //支持扩展性文件系统
_FS_NORTC            //支持不使用RTC的文件系统
_NORTC_MON           //不使用RTC时的月份
_NORTC_MDAY          //不使用RTC时的日
_NORTC_YEAR          //不使用RTC时的年
_FS_LOCK             //支持文件上锁功能
_FS_REENTRANT        //支持文件重入,多线程访问
_FS_TIMEOUT          //重入模式下超时周期

我的设置如下:
#define _USE_MKFS       1
#define _CODE_PAGE  936
#define _VOLUMES    1
#define _MIN_SS     512
#define _MAX_SS     512
其余均为0或默认值

2.diskio.c

disk_initialize 增加SPI_FLASH_Init()以及SPI_FLASH_ReadID()函数进行SPI_FLASH的初始化操作

DSTATUS disk_initialize (
    BYTE pdrv               /* Physical drive nmuber to identify the drive */
)
{
    DSTATUS stat;
    u32  FlashID;

    switch (pdrv) {
    case SPI_FLASH :
        SPI_FLASH_Init();
        FlashID = SPI_FLASH_ReadID();
        stat = 0;
        return stat;

    }
    return STA_NOINIT;
}

disk_read 增加SPI_FLASH_BufferRead,该函数是从指定地址读取指定字节数。

DRESULT disk_read (
    BYTE pdrv,      /* Physical drive nmuber to identify the drive */
    BYTE *buff,     /* Data buffer to
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值