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

本文详细介绍在STM32F103ZE平台上使用SPI方式与SD卡通信,移植并应用FatFS文件系统的过程。涉及FatFS系统特性、移植所需关键文件及函数修改要点,以及如何实现文件的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统平台:

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文件系统移植

沧海一粟

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

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文件系统移植需要的几个关键文件如下。

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

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

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

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

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

(6)、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),将内容同步到文件,这样才能看到文件中的内容,主要代码如下。

 https://www.cnblogs.com/fozu/p/3613994.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值