在STM32F103上移植FATFS文件系统
介绍
我们在使用sd卡的时候通常需要一个文件系统来方便管理sd卡里的内容,所以我们今天就来在stm32f103zet6上移植FATFS文件系统,本次实验使用的板子是正点原子stm32f103zet6的板子
准备工作
在移植FATFS前,我们需要准备FATFS的文件,具体可以从官方网站自行下载代码。
开始移植
这是一个简单的移植步骤
知道这些基本的操作以后,我们就可以发现,我们只需要修改fatfs里的diskio.c里的操作sd卡的函数即可,换成自己操作sd的函数,我这里是使用了sdio控制来操控sd卡
我们还需要修改ffconf.h来配置我们需要的功能
一般设置为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),我们开业在启动文件里修改堆的内存