SPI FLASH Fatfs文件系统移植

这篇具有很好参考价值的文章主要介绍了SPI FLASH Fatfs文件系统移植。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.FATFS文件系统简介

FATFS是面向小型嵌入式系统的FAT文件系统。他由C语言编写并且独立与底层I/O介质。支持的内核有:8051,PLC,ARV,ARM等。FATFS支持FAT12,FAT16,FAT32等文件系统格式。
官网链接

二.FATFS源码文件结构

  • diskio.c:包含底层存储介质的操作函数,需要与硬件设备适配移植。主要是在这个文件里调用用户实现的底层驱动函数,如SPI读写falsh的操作函数;
  • diskio.h:为diskio.c文件的函数原型声明和各个宏定义;
  • ff.c:Fatfs核心文件,通过调用diskio.c的底层操作函数实现文件的读写等操作。该文件独立于底层介质操作文件,移植系统时不需要修改。
  • ff.h:相关文件和文件夹的结构体定义。
  • ffconf.h:用于fatfs的功能配置,通过宏实现条件编译,修改相应宏定义的值即可实现功能的裁剪。如,需要支持简体中文,长文件名等。

三.函数调用流程

SPI FLASH Fatfs文件系统移植

四.移植说明

修改diskio.c文件,这个文件里的函数主要有已下几个函数需要实现:

获取当前的驱动的状态:
DSTATUS disk_status(BYTE pdrv )

初始化当前驱动的硬件设备:
DSTATUS disk_initialize(BYTE pdrv)

从当前驱动中读取某块连续的扇区数据:
DRESULT disk_read(
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE buff, / Data buffer to store read data /
LBA_t sector, /
Start sector in LBA /
UINT count /
Number of sectors to read */
)

将数据写入当前驱动的某块扇区:
DRESULT disk_write(
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE buff, / Data to be written /
LBA_t sector, /
Start sector in LBA /
UINT count /
Number of sectors to write */
)

获取当前驱动的一些信息:
DRESULT disk_ioctl(
BYTE pdrv, /* Physical drive nmuber (0…) /
BYTE cmd, /
Control code */
void buff / Buffer to send/receive control data */
)

ff.h相关的几个重要的宏定义

#define _USE_MKFS 1 // 格式化选择
#define _CODE_PAGE 936 // 语言选择
#define _USE_LFN 2 // 长文件名支持
#define _VOLUMES 2 // 物理设备数量
#define _MIN_SS 512 // 指定扇区的最小值
#define _MAX_SS 4096 // 指定扇区的最大值

五.测试demo


FATFS fs;                          
FIL fp;                            
BYTE fatfs_buffer[FF_MAX_SS] = {0}; 
UINT bw;                           

BYTE write_buf[] = "my name is leo"; 
BYTE read_buf[sizeof(write_buf)];
UINT br;

char filename[] = "SPI0:test.txt";

void test(void)
{
    FRESULT res; /* 文件操作结果 */
    res = f_mount(&fs, "SPI0:", 1);
    if (res == FR_NO_FILESYSTEM)
    {
        printf("[%s:%d] not find filesystem \r\n", __func__, __LINE__);
        /* 格式化 */
        res = f_mkfs("SPI0:", 0, fatfs_buffer, sizeof(fatfs_buffer));
        if (res == FR_OK)
        {
            /* 格式化后,先取消挂载 */
            res = f_mount(NULL, "SPI0:", 1);
            /* 重新挂载 */
            res = f_mount(&fs, "SPI0:", 1);
            if (res == FR_OK)
            {
                printf("[%s:%d]format flash ok\r\n", __func__, __LINE__);
            }
        }
        else
        {
            printf("[%s:%d]format falsh filed(%d)\r\n", __func__, __LINE__, res);
            while (1)
                ;
        }
    }
    else if (res != FR_OK)
    {
        printf("[%s:%d] mount flash filesystem failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }
    else
    {
        printf("[%s:%d] mount flash system ok\r\n", __func__, __LINE__);
    }

    res = f_open(&fp, "SPI0:test.txt", FA_READ | FA_WRITE | FA_CREATE_ALWAYS);
    if (res != FR_OK)
    {
        printf("[%s:%d] open test.txt failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }
    res = f_close(&fp);
    if (res != FR_OK)
    {
        printf("[%s:%d] close test.txt failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }

    res = f_open(&fp, "SPI0:test.txt", FA_WRITE | FA_OPEN_EXISTING);
    if (res != FR_OK)
    {
        printf("[%s:%d] open test.txt failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }
    res = f_write(&fp, write_buf, sizeof(write_buf), &bw);
    if (res != FR_OK)
    {
        printf("[%s:%d] write test.txt failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }
    res = f_close(&fp);
    if (res != FR_OK)
    {
        printf("[%s:%d] close test.txt failed(%s)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }

    //	// 读之前需要打开文件:只读权限(文件存在就读取)
    res = f_open(&fp, filename, FA_READ | FA_OPEN_EXISTING);
    if (res != FR_OK)
    {
        printf("[%s:%d] open test.txt failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }
    res = f_read(&fp, read_buf, sizeof(write_buf), &br);
    if (res != FR_OK)
    {
        printf("[%s:%d] read test.txt failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }
    printf("read_buf = %s\r\n", read_buf);

    res = f_close(&fp);
    if (res != FR_OK)
    {
        printf("[%s:%d] close test.txt failed(%d)\r\n", __func__, __LINE__, res);
        while (1)
            ;
    }
}

移植好的链接文章来源地址https://www.toymoban.com/news/detail-481428.html

到了这里,关于SPI FLASH Fatfs文件系统移植的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F429 Discovery开发板应用:实现SPI-SD Card文件写入(搭载FatFS文件系统)

    MCU:STM32F429ZIT6 开发环境:STM32CubeMX+MDK5   外购了一个SPI接口的SD Card模块,想要实现SD卡存储数据的功能。 首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找到开发板对应封装的MCU型号,双击打开(图中第三)。   此时,双击完后会关闭此界面,然后打开一个新界面。

    2024年02月08日
    浏览(37)
  • STM32使用HAL库SPI驱动W25Q16 使用FATFS文件系统+USB虚拟U盘

    使用stm32F407驱动W25Q16,使用FATFS文件系统,USB虚拟优盘功能,W25Q16一共512个扇区,其中128作为flash存取相关数据,其他的384个扇区用作虚拟U盘使用 W25Q16.c W25Q16.h user_diskio.c usbd_storage_if.c main.c STORAGE_BLK_NBR 表示扇区数量 STORAGE_BLK_SIZ 表示扇区大小 电脑上的U盘容量跟这两个参数密

    2024年04月28日
    浏览(28)
  • 019 - STM32学习笔记 - Fatfs文件系统(一) - FatFs文件系统初识

    019 - STM32学习笔记 - Fatfs文件系统(一) - FatFs文件系统初识 最近工作比较忙,没时间摸鱼学习,抽空学点就整理一点笔记。 1、文件系统 在之前学习Flash的时候,可以调用 SPI_FLASH_BufferWrite 函数,将数据内容写入到Flash芯片中,需要使用的时候,可以再从Flash中读取出来,但是

    2024年02月15日
    浏览(26)
  • Fatfs文件系统常用函数

    本文将介绍Fatfs文件系统的常用函数,学过C语言文件函数的小伙伴们就可以跳过了,因为两者之间基本没有什么区别: 下文提到的大多数函数都会返回FRESULT枚举,可以通过返回值来调试程序,找出程序出错的原因,FRESULT枚举如下: 挂载和取消挂载文件系统 fs: 文件系统句柄

    2024年02月05日
    浏览(22)
  • STM32的FATFS文件系统

    一、FATFS简介   文件系统是为了存储和管理数据,而在存储介质建立的一种组织结构,这些结构包括操作系统引导区、目录和文件。常见的 windows 下的文件系统格式包括 FAT32、NTFS、exFAT。在使用文件系统前,要先对存储介质进行格式化。格式化先擦除原来内容,在存储介质

    2024年02月11日
    浏览(26)
  • FatFS文件系统在MCU上的应用

    FatFS文件系统是单片机领域有名的一个文件系统,由于它的轻量级和兼容性,备受MCU开发者青睐。 在实现如U盘文件读写,SD卡的文件读写等工作时,我们往往需要一个文件系统来支持我们的工作。特别在一些MCU应用中,文件系统的加入能明显改善系统交互的友好性。 在这一篇

    2024年02月08日
    浏览(28)
  • STM32挂载SD卡基于Fatfs文件系统读取文件信息

    🔖本例程基于正点原子标准库修改而来。 📍FatFs 相关API函数网站: http://elm-chan.org/fsw/ff/00index_e.html 🌴分别测试了SD卡模块以及Mini SD卡模块。 🌿STM32f1单片机和TF卡、SD卡连接采用SPI通讯方式。 SD模块: Mini SD卡模块: 👉🏻如果需要采用SDIO驱动方式,那么需要采用下面这种

    2024年02月10日
    浏览(28)
  • 【STM32】FATFS文件系统f_mkfs卡死

    最近调试FATFS,通过STM32对SPI Flash进行读写操作。昨天晚上调通了,今天早上再调试,发现f_mount返回FR_NOFILESYSTEM。 依据网上所说,对磁盘格式化f_mkfs,卡死在FATFS库的ff.c-f_mkfs()的某个for循环里。 f_mkfs卡死的for循环代码位置 最后对SPI Flash进行了全片擦除命令,之后就可以正常

    2024年02月02日
    浏览(32)
  • STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS)

    STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS),轻松实现APP升级、数据存储。 直接使用STM32CubeMX生成基本的工程,省得我们去调底层。 时钟配置为外部8MHz晶振,这个需要根据自己开发板的晶振选择。  启用SWD下载和滴答定时器  启用USB  启用FATFS,MAX_SS和MIN_SS设置为1024。  配

    2024年02月14日
    浏览(36)
  • STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 SDIO使用FatFs中间件读写4线SD卡,并实现以轮询方式读写SD卡或以DMA方式读取SD卡 FatFs文件系统相关知识请读者

    2024年02月19日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包