STM32F103RC,FATFS,w25x16移植笔记

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

这些天移植了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
w25x16 SPI FLASH读写 串口监测输出STC8A8K单片机KEIL工程文件源码 FLASH w25x16 2M外部flash测试 W25X16芯片,就是16Mbit 一byte等于8bit 也就是2M字节的存储空间。 256bytes为一页 4Kbytes为一个Sector (扇区) 16个扇区为1个Block (块) W25X16 容量为2M字节,共有32个Block,512个Sector 而且W25X16最小擦除量是一个扇区 即4k字节空间 W25X16擦写周期多达 10W次,具有 20年的数据保存期限, 支持电压为 2.7~3.6V ,最大SPI 时钟可以到80Mhz。 程序上是将一个字符串存到了flash地址100开始的位置,然后去读取存入的数据到数组中,在将读到的 数组数据其显示出来 整个过程由串口检测 主频为11.0592MHz 串口波特率为9600 */ #include "stc8.h" //STC15头文件 #include "def.h" //宏定义 常用函数 #include "delay.h" //延时函数 #include "spi.h" #include "flash.h" #include "uart.h" u8 scan[]={"STC8 FLASH test"}; //测试字符串 u8 buffer[19]; //接收数组 void main() { SP=0X80; //调整堆栈指向 手册286页 详解 Init_SPI(); //SPI初始化 UartInit(); //串口初始化 if(SPI_Flash_ReadID()==0xef14) UartSendStr("外部FLASH初始化成功!\r\n"); else { UartSendStr("外部FLASH初始化失败!\r\n"); while(1); } SPI_Flash_Erase_Sector(0); //擦除地址为0扇区 4k字节 SPI_Flash_Write_NoCheck(scan,100,15); //在地址100位置写入字符串 SPI_Flash_Read(buffer,100,16); //在地址100位置处读取字符串并存入buffer数组中 UartSendStr("地址100数据:\r\n"); UartSend(buffer,15); while(1); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值