STM32平台SD卡的FatFS文件系统开发

系统平台:

STM32系列的STM32F103ZE

SPI方式与SD卡通信

SD上移植FatFS系统

1 FatFS文件系统

1.1 FatFS简介

FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于硬件架构,可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。

特点:

  • Windows兼容的FAT文件系统
  • 不依赖于平台,易于移植
  • 代码和工作区占用空间非常小
  • 多种配置选项
  • 多卷(物理驱动器和分区)
  • 多ANSI/OEM代码页,包括DBCS
  • 在ANSI/OEM或Unicode中长文件名的支持
  • RTOS的支持
  • 多扇区大小的支持
  • 只读,最少API,I/O缓冲区等等

1.2 FatFS文件系统移植

FatFS文件系统移植需要的几个关键文件如下。

l  ff.c(不动)   文件系统的实现代码,里面主要是FatFS文件系统源码,移植的时候不需要修改;

l  diskio.h(不动)  声明diskio.c文件中需要的一些接口函数和命令格式;

diskio.c(自写)  这个文件是文件系统底层和SD驱动的中间接口的实现代码,移植的时候需要改写在diskio.h中声明的那几个函数,代码在ff.c中被调用;

l  integer.h(微改) 这是FatFS用到的数据类型定义,按移植的平台修改;

l  ff.h(不动)     是FatFS的文件系统的函数(在ff.c中)声明,以及一些选项的配置,具体选项及详细说明在文件中都有;

l  ffconf.h(按需要) 这个是在FatFS的0.08a版本中有看到,0.06版本中还没有,是关于FatFS系统模块的一些配置;

综上,需要修改的就是diskio.c文件,主要是6个函数,描述如下。

  • DSTATUS disk_initialize (BYTE pdrv         /* Physical drive nmuber (0..) */)

初始化函数,调用编写的SD卡初始化函数,成功返回0,失败返回其它。

  • DSTATUS disk_status (BYTE pdrv             /* Physical drive nmuber (0..) */)

设备状态函数,只支持一个设备,若pdrv大于0,则返回错误;否则返回SD的状态,若初始化成功,返回0,否则其它。

  • DRESULT disk_read (

BYTE pdrv,           /* Physical drive nmuber (0..) */

BYTE *buff,         /* Data buffer to store read data */

DWORD sector,     /* Sector address (LBA) */

BYTE count          /* Number of sectors to read (1..128) */

)

读函数,传入的参数是设备名称,用于保存读到的数据的缓存,扇区地址,扇区个数。

分为一个扇区和多个扇区,两者需要给SD卡发送不同的命令。

  • DRESULT disk_write (

BYTE pdrv,                  /* Physical drive nmuber (0..) */

const BYTE *buff, /* Data to be written */

DWORD sector,            /* Sector address (LBA) */

BYTE count                 /* Number of sectors to write (1..128) */

)

写函数,传入的参数是设备名称,要写的数据地址,扇区地址,扇区个数。

同样分为一个扇区和多个扇区,两者给SD卡发送的命令也不一样。

  • DWORD get_fattime (void)

用于获取系统当前的unix时间。

  • DRESULT disk_ioctl (

BYTE pdrv,           /* Physical drive nmuber (0..) */

BYTE cmd,           /* Control code */

void *buff             /* Buffer to send/receive control data */

)

这是个混合功能函数,用于IO口的控制,传入的参数第一个是设备名称,第二个是命令,第三个是命令是读/写时返回的数据缓存。

2 实现文件的读写

2.1 实现读取

在SD中根目录下有一个MyLog文件夹,文件夹内有一个名为123.txt的文件,要去取其中的内容,并通过串口输出,代码如下。

2.2 实现写入

写入时,直接调用f_write函数,需要说明的是,此函数只能完成将数据写入到SD卡的扇区中,实际在Windows下仍然看不到内容。必须要执行f_sync(&fsrc),将内容同步到文件,这样才能看到文件中的内容,主要代码如下。

STM32平台SD卡的FatFS文件系统开发的更多相关文章

  1. 第37章 基于SD卡的FatFs文件系统—零死角玩转STM32-F429系列

    第37章     基于SD卡的FatFs文件系统 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  2. STM32之SD卡

    目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区别 二. SD卡内部结构 1. SD卡内部结构简图 2. 存储阵列结构图 3.Buffer 4.“存储阵列Block ...

  3. stm32 向W25Q256FLASH中通过 FATFS文件系统写入数据 写多了之后出现错误,之前存储的全都找不到了

    stm32 像W25Q256FLASH中通过  FATFS文件系统写入数据  写多了之后出现错误,之前存储的全都找不到了 http://firebbs.cn/thread-23490-1-1.html ...

  4. stm32和sd卡

    SD卡从容量上讲分两种:标准容量和大容量,最小的是标准容量,小于等于2G 其中的访问关系如下: SD卡分为两种模式:认证模式和传输模式,每一个模式包含着不同的状态,如下 以下主要讲其初始化过程: SD ...

  5. 挂载镜像SD卡的FAT32文件系统分区到Linux中

    首先使用fdisk –l命令查看sd卡的分区息 可以看到,sd卡有三个分区,第一个分区是FAT32系统,主要存放内核img文件和dtb文件,第二个分区是Linux系统分区,第三个分区格式未知,实际是U ...

  6. 野火STM32 Flash&sd卡模拟U盘

    在USB库文件mass_mal.c中添加对flash和sd读写的函数,USB库调用这些函数从而实现模拟U盘的功能 //mass_mal.c /* Includes ------------------ ...

  7. 联盛德 HLK-W806 (十三): 运行FatFs读写FAT和exFat格式的SD卡/TF卡

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  8. 荣品RP4412开发板烧写Ubuntu系统应注意SD卡内存大些

    问:RP4412开发板用SD卡烧写光盘中的fastboot失败,现在如何补救呢? 答:INAND格式化, 利用usb来升级啊, 也有文档,看升级文档. 问: 这个是怎么回事? 答:你是升级什么系统? ...

  9. SD卡FAT32文件系统格式

    一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...

随机推荐

  1. sharepint 2013 添加subsite

    在用服务器端对象模型往里面添加subsite的时候,照着书上的代码,结果,失败.报错 not suported language. bing了半天,说是语言未支持,又是修改系统区域,显示语言等,还是失 ...

  2. unity3d之相机跟随人物

    一.第三人称视角 _1 先设置好相机与玩家之间的角度 给相机添加代码 using UnityEngine; using System.Collections; namespace CompletePr ...

  3. Effective C++ .17 函数调用时的资源管理

    以书上的代码为例 processWidget(shared_ptr<Widget>(new Widget), priority()) 虽然使用了智能指针来管理资源但是,由于参数值计算顺序的 ...

  4. IIS 网站发布——遇到的问题,以及解决方案

    在 解决方案——Web 右键  发布  如图:   之后,在其他文件夹或盘  放入发布之后 生成的文件 如图所示,之所以这样是为了好整理查找发布的项目.   之后,在IIS 上发布出去     首先 ...

  5. vue-cli脚手架项目实例

    看完了配置,接下来通过一个实例,更清晰地了解这些文件之间的联系,顺带练习练习vue相关知识. 1.安装 打开命令行控制器,系统自带cmd或者git bash等都可以,按照顺序输入如下指令,耐心等待每一 ...

  6. JavaScript练习笔记整理·4 - 6.26

    基础练习(1): 我的解答为: function getMiddle(s) { if(s.length%2 == 0) { return s.charAt(s.length/2-1)+s.charAt ...

  7. 查看postgre都有哪些语句占用CPU

    查看占用CPU最多的几个postgresql ps aux | grep postgres | sort -n -r -k 3 | head -10 | awk '{print $2, $3}' 查看 ...

  8. 02_dubbo的SPI

    [dubbo为什么不采用JDK自带的SPI] 1.JDK自带的SPI(ServiceLoader)会一次性实例化扩展点所有实现,基本只能通过遍历全部获取,也就是接口的实现类全部加载并实例化一遍,如果我 ...

  9. Android Timer和TimerTask

    以下内容根据 The JavaTM Tutorial 和相关API doc翻译整理,以供日后参考: 1.概览 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次 ...

  10. 【Android】Android studio 编译问题:finished with non-zero exit value 2

    1.Android studio 编译问题:finished with non-zero exit value 2 问题: Error:Execution failed for task ':andr ...