在STM32F103上移植FATFS文件系统

在STM32F103上移植FATFS文件系统

介绍

我们在使用sd卡的时候通常需要一个文件系统来方便管理sd卡里的内容,所以我们今天就来在stm32f103zet6上移植FATFS文件系统,本次实验使用的板子是正点原子stm32f103zet6的板子

准备工作

在移植FATFS前,我们需要准备FATFS的文件,具体可以从官方网站自行下载代码。

开始移植

在这里插入图片描述
这是一个简单的移植步骤
在这里插入图片描述
知道这些基本的操作以后,我们就可以发现,我们只需要修改fatfs里的diskio.c里的操作sd卡的函数即可,换成自己操作sd的函数,我这里是使用了sdio控制来操控sd卡
在这里插入图片描述
我们还需要修改ffconf.h来配置我们需要的功能
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fb147718d5ca45fd9dddf44323b4cfb5.pn
下面我们来具体介绍一下
在这里插入图片描述
设置长文件名(FF_USE_LFN)一般设置为1即可,如果你需要兼容EXFAT系统,则需要配置成3

在这里插入图片描述
如果你需要兼容exfat系统,则需要将这个配置成1,不然就无法兼容exfat文件系统
在这里插入图片描述

fafts应用函数

在这里插入图片描述
这里的具体用法可以参考官方网站

代码示例

简单的写一个txt格式的文本

void sd_init_ff()
{
    FRESULT ret;
    
    FATFS *fs_obj;
    FIL *fil_obj;
    uint8_t rd_buff[255];
    uint16_t fsize;
    uint16_t rd_cnt;
    uint16_t wd_count = 0;  // 初始化 wd_count
    
    // 动态分配内存
    fs_obj = (FATFS *)malloc(sizeof(FATFS));  
    if (fs_obj == NULL) {
        My_printf_DR("Memory allocation failed\r\n");
        return;  // 内存分配失败,退出函数
    }
    
    fil_obj = (FIL *)malloc(sizeof(FIL));  // 动态分配内存
    if (fil_obj == NULL) {
        My_printf_DR("File object memory allocation failed\r\n");
        free(fs_obj);  // 释放已分配的内存
        return;  // 内存分配失败,退出函数
    }

    // 1. 挂载 SD 卡
    ret = f_mount(fs_obj, "0:", 1);
    if (ret != FR_OK) {
        My_printf_DR("mount fail %d \r\n", ret);
        free(fs_obj);
        free(fil_obj);  // 释放内存
        return;
    }
    My_printf_DR("mount OK %d \r\n", ret);

    // 2. 打开文件
    ret = f_open(fil_obj, "0:/test.txt", FA_READ | FA_WRITE | FA_OPEN_EXISTING);
    if (ret != FR_OK) {
        My_printf_DR("open fail %d \r\n", ret);
        f_mount(NULL, "0:", 1);  // 卸载 SD 卡
        free(fs_obj);
        free(fil_obj);  // 释放内存
        return;
    }
    My_printf_DR("open ok %d \r\n", ret);

    // 3. 读取数据
    fsize = f_size(fil_obj);
    ret = f_read(fil_obj, rd_buff, fsize, (UINT *)&rd_cnt);
    if (ret == FR_OK && rd_cnt != 0) {
        My_printf_DR("read_cnt= %d  rdbuf = %s\r\n", rd_cnt, rd_buff);
    } else {
        My_printf_DR("no data or read failed\r\n");
    }

    // 4. 写入数据
    ret = f_write(fil_obj, "333", 3, (UINT *)&wd_count);
    if (ret != FR_OK) {
        My_printf_DR("write failed, ret = %d\r\n", ret);
    }

    // 5. 将文件指针移动到文件开头并读取
    f_lseek(fil_obj, 0);
    fsize = f_size(fil_obj);
    ret = f_read(fil_obj, rd_buff, fsize, (UINT *)&rd_cnt);
    if (ret == FR_OK && rd_cnt != 0) {
        My_printf_DR("read_cnt= %d  rdbuf = %s\r\n", rd_cnt, rd_buff);
    } else {
        My_printf_DR("no data or read failed\r\n");
    }

    // 6. 关闭文件并释放内存
    f_close(fil_obj);
    f_mount(NULL, "0:", 1);  // 卸载 SD 卡
    free(fs_obj);  // 释放内存
    free(fil_obj);  // 释放内存
}

如果malloc分配内存失败,我们则需要检查一下我们stm32里的堆内存是否足够,一般默认的堆内存为0x200(512byte),我们开业在启动文件里修改堆的内存
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值