fatfs移植和使用(在W25Q16上建立文件系统)
准备再单片机CH579上移植FATFS1.3方便数据管理,下面简单介绍一下移植注意事项和误区。
需要准备的材料有:
(1)FATFS文件系统源码FATFS1.3(点此下载最新FATFS源码)。
(2)单片机平台一个(CH579)。
(3)SPI_FLASH芯片一个(如:W25Q16)。
FATFS是一个通用的嵌入式文件系统,对不同的平台支持很好,大到硬盘、U盘、存储卡,小到spi_flash芯片甚至单片机内部FLASH都可以使用FATFS。今天我们就在一个2M大小的SPI_FLASH( W25Q16)上建立一个文件系统,主控制器是CH579单片机。在做文件系统移植前,你需要把操作SPI_FLASH的驱动调通,能读写SPI_FLASH就可以了。
第一步、 解压缩新下载的FATFS源码,看看里面都是些什么文件。如下图所示,红色框是移植FATFS所必须的文件,蓝色框内的文件是可选的移植文件。
diskio.c个diskio.h是和存储器读写控制相关的驱动接口,比如SPI_FLASH的读写函数接口,都要映射到这里面。必须的文件
ff.h和ff.h是FATFS的核心文件,必须的文件
ffconf.h是FATFS的配置文件,用来裁剪FATFS,必须的文件
integer.h是FATFS所用到的数据类型定义,用以兼容不同字长CPU,必须的文件
ffsystem.c是一些关于在带操作系统平台中,使用的示例,可选文件
ffunicode.c是万国码编码文件,文件里主要是大数组定义,假如你需要让文件名支持中文就需要这个文件,这个文件会使代码空间急剧变大,可选文件
第二步、 本次FATFS移植未使用操作系统,文件系统支持中文路径和名称,所以需要ff.c、ff.h、ffconf.h、diskio.c、diskio.h、ffunicode.c和integer.h这六个文件添加到工程中即可。如下图:
第三步 修改ffconf.h文件,来裁剪我们的FATFS,通过宏开关来去掉不用的功能,来精简文件系统。想知道每个宏的功能?(点击这里)
需要注意的是:由于我们此次移植支持了中文路径和名称,所以这个要设置这个宏 #define FF_CODE_PAGE936 /*936代表 简体中文*/
特别注意:下图的修改,FF_MAX_SS的值必须和FLASH的块的值一直,我在这里走了歪路,搞了半天,它默认的是512,网上其它文档没有提示这里的修改。
第四步 修改diskio.c 来映射我们的存储器读写控制接口,如下:
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be */
/* attached to the FatFs via a glue function rather than modifying it. */
/* This is an example of glue functions to attach various exsisting */
/* storage control modules to the FatFs module with a defined API. */
/*-----------------------------------------------------------------------*/
#include "ff.h" /* Obtains integer types */
#include "diskio.h" /* Declarations of disk functions */
#include "SPIFlash.H"
/* Definitions of physical drive number for each drive */
#define SPI_FLASH 0 /* Example: Map Ramdisk to physical drive 0 */
/*-----------------------------------------------------------------------*/
/* Get Drive Status */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
if(pdrv == SPI_FLASH)
{
PRINT("!!!disk_status OK\r\n");
return RES_OK; //Ö±½Ó·µ»ØOK¼´¿É
}
else
{
PRINT("!!!disk_status ERR\r\n");
return RES_PARERR;
}
}
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
if(pdrv == SPI_FLASH)
{
SPIFlash_Init();//³õʼ»¯spi flash
PRINT("!!!disk_initialize OK\r\n");
return RES_OK;
}
else
{
PRINT("!!!disk_initialize ERR\r\n");
return RES_PARERR;
}
}
/*-----------------------------------------------------------------------*/
/* Read Sector(s) */
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Start sector in LBA */
UINT count /* Number of sectors to read */
)
{
DRESULT res;
PRINT("disk_read---sector:%d,count:%d\r\n",sector,count);
if(pdrv == SPI_FLASH)
{
for(;count>0;count--)
{
ReadExternalFlash_SPI_DAN(sector*4096,4096,buff);//spi flashµÄ¶Áº¯Êý£¬×¢Òâ²ÎÊýÀàÐÍÒ»ÖÂ
sector++;
buff+=4096;
}
res = RES_OK; //ĬÈÏдÈëÕý³££¬¿ÉÒÔ¼Ó
return res;
}
else
{
return RES_PARERR;
}
}
/*-----------------------------------------------------------------------*/
/* Write Sector(s) */
/*-----------------------------------------------------------------------*/
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Start sector in LBA */
UINT count /* Number of sectors to write */
)
{
DRESULT res;
PRINT("disk_write---sector:%d,count:%d\r\n",sector,count);
if(pdrv == SPI_FLASH)
{
for(;count>0;count--)
{
EraseExternal4KFlash_SPI(sector*4096);
BlukWriteExternalFlash_SPI(sector*4096,4096,(uint8_t *)buff);//spi flashµÄдº¯Êý£¬×¢Òâ²ÎÊýÀàÐÍÒ»ÖÂ
sector++;
buff+=4096;
}
res=RES_OK;
return res;
}
else
{
PRINT("!!!disk_write ERR\r\n");
return RES_PARERR;
}
}
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */
/*-----------------------------------------------------------------------*/
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
if (pdrv == SPI_FLASH)
{
switch (cmd)
{
case CTRL_SYNC:
return RES_OK;
/* ÉÈÇøÊýÁ¿ 1024*1024*1024 =4 (MB) */
case GET_SECTOR_COUNT:
*(DWORD * )buff = 512;spi flashµÄ¿é´óСÊÇ4K Bytes
// *(DWORD * )buff = 8*1024;//W25Q16 ÓÐ512´óСΪ4k bytesµÄÉÈÇø
return RES_OK;
/* ÉÈÇø´óС*/
case GET_SECTOR_SIZE :
*(WORD * )buff = 4096;//spi flashµÄ¿é´óСÊÇ4K Bytes
// *(WORD * )buff = 512;//spi flashµÄ¿é´óСÊÇ4K Bytes
return RES_OK;
/*¿é */
case GET_BLOCK_SIZE :
*(DWORD * )buff =1;
return RES_OK;
default:
return RES_PARERR;
}
}
else
{
PRINT("!!!disk_ioctl ERR\r\n");
return RES_PARERR;
}
}
DWORD get_fattime(void) {
// DWORD time;
return 0;
}
这里面一定注意,FLASH读写函数驱动的调用。很关键,决定是否能移植成功。
fatfs移植和使用(在W25Q16上建立文件系统)相关推荐
- 在CF卡上建立文件系统和安装引导加载程序
CF卡在嵌入式工控领域越来越多的被应用,如何在CF卡上构建嵌入式linux是开发中一个基础但非常重要的过程! 本文介绍在CF卡上建立用于PC104板卡上的根文件系统,着重介绍了针对CF卡的操作,至于具 ...
- centos7在分区上建立文件系统和挂载
在上一篇博客中,我们只说了硬盘的分区,既然进行分区,那么我们就要知道如何使用这些分区,就是接下来的建立文件系统和挂载. mkfs(make filesystem)格式化,建立文件系统 可以看到各种文件 ...
- linux mkfs 分区,mkfs命令 – 在特定分区上建立文件系统
在磁盘分区上创建ext2.ext3.ext4.ms-dos.vfat文件系统,默认情况下会创建ext2.mkfs用于在设备上构建Linux文件系统,通常是硬盘分区.文件要么是设备名称(例如/dev/h ...
- 基于SD卡的FatFs文件系统(FatFs移植到STM32)
平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线 工程介绍:主要文件在USER组中,bsp_sdio_sdcard.c,bsp_sdio_sdcard.h和main.c, ...
- 移植wxX11到开发板上
最近几天由于工作安排,要将wxX11程序移植到arm开发板上.一连工作了好几天,终于可以在板子上显示出一个"X"号,并且可以运行wxWidgets里面的程序,算是成功了.现就一些步 ...
- FATFS 移植和配置分析
0. FATFS FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块. FatFs 模块是按照 ANSI C (C89) 编写的,与磁盘 I/O 层完全分离.因此,它独立于平台. ...
- SDIO协议梳理附SD卡读写以及FATFS移植实例
文章列表 嵌入式各协议标准按照OSI模型的思路进行逐个梳理,文章列表如下: 串行通信&UART协议梳理附STM32平台采用DMA以UART方式收发不定长信息 I²C总线协议梳理附STM32平台 ...
- 【转】将 Linux 应用程序移植到 64 位系统上
原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...
- ubuntu上建立mini2440 qt编译环境
参考mini2440手册,从5.3章开始建立交叉编译环境.跟着流程走,在设置环境变量的时候,发现ubuntu的root文件夹不可进入,修改权限进入修改.bashrc文件发现重启后不起作用.为了不每次开 ...
最新文章
- 嗯,挺全乎儿的,Spring Boot 多环境配置都在这儿了,你喜欢哪一种呢?
- gitpythonapi_GitPython 使用基础
- STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群
- 一分钟学会Git操作流程
- 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈
- 重采样和重分类的区别
- 基于JAVA+SpringBoot+Mybatis+MYSQL的医药进销存管理系统
- php 添加透明水印,php加水印的代码(支持半透明透明打水印,支持png透明背景)
- 最小路径问题_BFS
- 超仪电子 java面试_全靠这份阿里大佬的“Java进阶面试手册”助我收获蚂蚁金服offer!...
- 开发管理 -启动项目(转)
- 拓端tecdat|python用线性回归预测股票价格
- Python调用Matlab教程
- sip协议的超时机制
- 大数据、数据挖掘和机器学习,带了哪些业务价值?
- C++的 new 和 detele
- overflow属性 white-space属性 文本溢出 英文单词转换方式
- 7.Python3标准库--文件系统
- linux ps le hrtime,前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度
- 跨境电商:shopee虾皮哪个站点比较好,新手应该怎么选择