STM32 SDIO FATFS文件系统 野火diskio.c文件解析

FATFS学习(4):diskio.c 修改【移植全部流程】 1. 到此FS的移植代码解释全部完成了。 阅读详情

#define _FS_TINY  0 /* 0:Normal or 1:Tiny 完整的FATFS 精简版的是Tiny */

#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only 能读能写*/

#define _FS_MINIMIZE 1 /* 0 to 3 简单的裁剪f_mkdir, f_chmod..这些功能没法用的*/
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
/
/   0: Full function.
/   1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
/      are removed.
/   2: f_opendir and f_readdir are removed in addition to 1.
/   3: f_lseek is removed in addition to 2. */


#define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable是否使用字符串文件接口 */
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */


#define _USE_MKFS  0 /* 0:Disable or 1:Enable  制作文件系统我在PC上一般已经格式化好了*/
/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */


#define _USE_FORWARD 0 /* 0:Disable or 1:Enable 发文件流?*/
/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */


#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable 搜索*/
/* To enable fast seek feature, set _USE_FASTSEEK to 1. */

#define _CODE_PAGE 1 / /1    - ASCII only (Valid for non LFN cfg.)

#define _USE_LFN 0  /* 0 to 3 */
#define _MAX_LFN 255  /* Maximum LFN length to handle (12 to 255) 这些都是长文件名或是汉字文件支持很费资源所以不开启这些*/

#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 不使用相对路径*/

#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 文件共享多任务的操作系统会用到的*/

#define _FS_REENTRANT 0  /* 0:Disable or 1:Enable 这些是啥用?同步什么呢?默认就好了*/
#define _FS_TIMEOUT  1000 /* Timeout period in unit of time ticks */
#define _SYNC_t   HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */

integer.h主要定义了文件的类型 若是最新的可以不用修改。

都说要移植5个函数 。

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2011        */
/*-----------------------------------------------------------------------*/
/* This is a stub disk I/O module that acts as front end of the existing */
/* disk I/O modules and attach it to FatFs module with common interface. */
/*-----------------------------------------------------------------------*/

#include "diskio.h"
#include "stm32f10x.h"
#include "stm32_eval_sdio_sd.h"

#define BLOCK_SIZE            512 /* Block Size in Bytes */

 

/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */

DSTATUS disk_initialize (
 BYTE drv    /* Physical drive nmuber (0..) */
)
{
 SD_Error  Status;
 /* Supports only single driveFATFS支持多个设备 所以有个设备号drive nmuber当然了我就一个SD卡所以只有零号 */
 if (drv)
 {
  return STA_NOINIT;
 }
/*-------------------------- SD Init ----------------------------- */
  Status = SD_Init();
 if (Status!=SD_OK )
 {
  return STA_NOINIT;
 }
 else
 {
  return RES_OK;
 }

}

 

/*-----------------------------------------------------------------------*/
/* Return Disk Status                                                    */

DSTATUS disk_status (
 BYTE drv  /* Physical drive nmuber (0..) */
)
{
 return RES_OK; //懒的管了 有空写写 可以加个
}

 

/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */

DRESULT disk_read (
 BYTE drv,  /* 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..255) 读取的扇区数*/
)
{
// SD_Error Status;
 if (count > 1)
 {
  SD_ReadMultiBlocks(buff, sector*BLOCK_SIZE, BLOCK_SIZE, count); //扇区地址*512就是实际地址 默认一个扇区就是512个字节
 }
 else
 {
  SD_ReadBlock(buff, sector*BLOCK_SIZE, BLOCK_SIZE);
 }
 return RES_OK;
}

 

/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */

#if _READONLY == 0
DRESULT disk_write (
 BYTE drv,   /* Physical drive nmuber (0..) */
 const BYTE *buff, /* Data to be written */
 DWORD sector,  /* Sector address (LBA) */
 BYTE count   /* Number of sectors to write (1..255) */
)
{
 if (count > 1)
 {
  SD_WriteMultiBlocks((uint8_t *)buff, sector*BLOCK_SIZE, BLOCK_SIZE, count);

/*这里大家看到了有个地址转换 因为DMA仅仅支持4字节指针的所以在函数内部还是有个转换的这里最好优化一下能提高效率*/
 }
 else
 {
  SD_WriteBlock((uint8_t *)buff,sector*BLOCK_SIZE, BLOCK_SIZE);
 }
 return RES_OK;
}
#endif /* _READONLY */

 


/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */

DRESULT disk_ioctl (
 BYTE drv,  /* Physical drive nmuber (0..) */
 BYTE ctrl,  /* Control code */
 void *buff  /* Buffer to send/receive control data 若是用到擦除函数这个函数一定要补完的有空再写写吧我这简单的返回就好了*/
)
{
 return RES_OK;
}
        
/*-----------------------------------------------------------------------*/
/* Get current time                                                      */
/*-----------------------------------------------------------------------*/ 
DWORD get_fattime(void)
{
return ((2011UL-1980) << 25)       // Year = 2011
| (3UL << 21)       // Month = Mar
| (26UL << 16)       // Day = 26
| (13U << 11)       // Hour = 13
| (19U << 5)       // Min =19
| (0U >> 1)       // Sec = 0
;
} 

FatFs 应用接口函数 大多数API函数以枚举类型FRESULT返回常见的结果代码。FR_OK(成功),FR_DISK_ERR(下层disk_read、disk_write或disk_ioctl函数报告发生了不可恢复的硬盘错误。),FR_INT_ERR(断言失败,在内部流程中检测到异常),FR_NOT_READY(下层disk_initialize函数报告存储设备无法做好工作准备。),FR_NO_FILE(目录中没找到文件),FR_NO_PATH(在路径名中找不到目录。), 阅读详情

相关推荐

STM32通过SDIO读取SD卡,FATFS文件管理系统

fatfs,sd

qq_53000374的博客 3877

FatFs文件系统

本文介绍了FatFs文件操作系统,以及FatFs文件系统的移植。 FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISIC语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。

雩风廿二YJ的博客 2462

STM32 SPI模式下FATFS SD卡稳定读写实战指南

FAT文件系统是嵌入式设备实现数据持久化的基础技术,其核心在于逻辑层(FATFS)与物理层(SD卡SPI驱动)的可靠耦合。本文从SPI通信原理出发,深入解析CPOL/CPHA时序约束、SD卡七步初始化状态机、扇区对齐与命令重试机制等底层关键点;强调FATFS裁剪(如禁用长文件名、精简FAT缓存)对资源受限MCU的必要性;并基于寄存器级SPI控制与DMA乒乓缓冲,提供高鲁棒性的扇区级读写实现方案。适用于STM32数据记录仪、固件升级、离线日志等工业级应用,尤其解决‘例程能跑、实板挂死’这一高频痛点。

weixin_29169505的博客 207

文件和目录管理

f_stat f_stat函数检查文件或子目录是否存在。 FRESULT f_stat( const TCHAR * path, / * [IN]对象名* / FILINFO * fno / * [OUT] FILINFO结构* / 如果不需要,则设置空指针。 ); 描述 该f_stat功能检查文件或子目录的存在。如果不存在,则函数返回FR_NO_FILE。如果存在,该函数将返回FR_OK,并将有关对象,大小,时间戳和属性的信息存储到文件信息结构中。 FRESUL

happygrilclh的博客 1220

(一)利用Python实现数据集读取,Python基本文件操作介绍

机器学习是计算机对大量数据的分析过程,在机器学习的实际项目中,通常都需要准备数据集,数据集通常包含的数据数量是庞大的。例如,在处理计算机视觉领域的项目时,每一张图片都是一个单独的文件,为了提高模型训练的效果,图片数量通常会比较多,因此需要合理且高效的操作将所有的图片数据读取。本篇旨在介绍如何用Python对海量文件进行遍历,也是机器学习实践的第一步。.........

ZZR2631574030的博客 6356

vos如何对接okcc(保姆级教程)

1.添加账户 点击 系统->账户管理 [图片] 2.创建费率 系统->费率管理 点击添加

qq_46333281的博客 3453

STM32虚拟U盘实战:USB MSC+FATFS+W25Q64实现即插即用存储

在嵌入式产品开发中,设备数据导出与参数配置常受限于串口协议复杂、上位机维护成本高等问题。借助USB Mass Storage类设备协议,可以将微控制器模拟成标准U盘,实现即插即用的文件交换体验。其核心思路是以SPI NOR Flash作为存储介质,通过文件系统层对其读写进行抽象管理,再经USB MSC底层接口与上位机通信。本文从存储介质选型、文件系统移植、磁盘抽象层适配到USB描述符配置,梳理了基于STM32F103实现虚拟U盘的完整技术链路,重点剖析了W25Q64在512字节扇区与4KB擦除块间的读改写策

weixin_34185320的博客 360

液态神经网络系列(四) | 一条 PyTorch 从零搭建 LTC 细胞

本文详细介绍了如何从零开始用PyTorch实现Liquid Time-constant Networks(LTC)神经元模型。首先将LTC的核心微分方程拆解为输入电导、系统时间常数和数值积分器三个模块,然后逐步构建LTCCell类,包括物理参数初始化、突触参数设置和前向演化过程。文章还展示了如何封装LTCModel处理不规则时间序列,并通过正弦波抗干扰实验验证了LTC模型的优越性。最后讨论了数值稳定性、计算代价等实现细节,并预告了下一篇将探讨使用伴随灵敏度算法优化显存占用的方法。

wyj333333的博客 2063

FreeRTOS下SD卡SPI驱动与FatFS移植:步进电机控制器实战

在物联网与运动控制结合的嵌入式系统中,设备参数的持久化存储是稳定运行的关键。常见方案是采用文件系统管理SD卡上的配置文件。SPI接口以其引脚占用少、时序简单,成为中低端MCU连接SD卡的常用选择。本文从SPI协议原理入手,逐步讲解SD卡SPI模式下的初始化与扇区读写,并深入移植FatFS文件系统的方法,包括diskio层实现与关键配置。结合FreeRTOS的多任务环境,阐述了如何通过互斥锁保护文件操作,避免数据冲突。同时,针对步进电机控制器的应用场景,展示了如何解析ini格式的配置文件,实现参数本地存储与云

weixin_29192141的博客 258

人大金仓数据库Kingbase FlySync同步程序安装

Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。

weixin_44312518的博客 1179

【YOLOv11】从零搭建基于YOLOv11深度学习算法的农作物虫害检测系统(附带环境搭建+完整代码+讲解)

《基于YOLOv11的农作物病虫害智能检测系统》项目摘要 本项目开发了一个基于YOLOv11深度学习算法的农作物病虫害检测系统,支持玉米、水稻、草莓和西红柿等四大类经济作物的30多种病虫害识别。系统采用多模态检测方式,支持图片、视频和实时摄像头输入,并集成了完整的Web应用框架。 技术架构上,系统以PyTorch实现YOLOv11算法为核心,结合Flask搭建深度学习服务,SpringBoot构建业务后端,Vue3+TypeScript开发前端界面,MySQL数据库存储检测数据。系统具备用户权限管理功能,支

AnChenliang_1002的博客 812

diskio.c

/* USER CODE BEGIN Header / /* @file user_diskio.c @brief This file includes a diskio driver skeleton to be completed by the user. @attention Copyright © 2022 STMicroelectronics. All rights reserved. This software is licensed under terms that c

qq_41575558的博客 416

开源遥感语义分割工具箱mmsegmentation基于Lovedata数据集训练模型

开源遥感语义分割工具箱mmsegmentation基于Lovedata数据集训练模型

yilvyangguang520的博客 498

FatFsVersion0.01源码分析

目录 一、API的函数功能简述  二、FATFS主要数据结构    1、FAT32文件系统的结构   2、FATFS主要数据结构     ①   FATFS     ②   DIR      ③  FIL     ④  FILINFO      ⑤  win[512]     ⑥  buffer  三、函数功能与实现详细分析    0、move_window    1、f...

weixin_34273479的博客 740

UG NX二次开发(C#)-建模-获取圆柱面信息(轴向、半径、深度)

获取圆柱面的信息前言一、在UG NX中面的类型有哪些?二、获取圆柱面信息的函数1.获取半径和轴向2、计算圆柱面的深度值3、测试用例总结 文章目录前言一、在UG NX中面的类型有哪些?二、获取圆柱面信息的函数1.获取半径和轴向2、计算圆柱面的深度值3、测试用例总结 前言 在一个项目中,需要遍历曲面,获得所有的圆柱面和圆柱面的信息,包括轴向、半径和圆柱面的深度。经过研究,采用uFModl.AskFaceData(face.Tag, out faceTypeInt, point, dir, box, out

GimiGimmy 4145

【CANdelaStudio编辑CDD】-2.2-给$27服务SecurityAccess创建一个SecurityLevel安全级别并修改SecurityAccess安全访问状态机(UDS诊断)

前一篇: 【UDS诊断描述文件CDD】-2.1-ISO_14229中$27服务理论部分https://blog.csdn.net/qfmzhu/article/details/120392660 案例背景: 在CDD中如何给$27服务创建一个新的SecurityLevel安全级别; 在CDD中如何给$27服务修改SecurityAccess安全访问状态机。 1 查看$27服务中已有的SecurityLevel安全级别 2 查看$27服务中已有的SecurityAccess安全...

「汽车电子助手」的博客 4642

FATFS 初学之 f_chmod/ f_utime

f_chmod: 1 /*-----------------------------------------------------------------------*/ 2 /* Change Attribute */ 3 /*---------------------...

weixin_30566111的博客 1353

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

(十六)文件操作——chmod函数的介绍和使用

头函数: #include < sys/stat.h> 函数定义: int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); 函数说明: chmod()会依参数mode 权限来更改参数path 指定文件的权限。 fchmod()会依参数mode 权限来更改参数fd 所指文件的权限。参数f

FadeFarAway的博客 9958

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

chmod, fchmod修改文件权限

#include &lt;sys/stat.h&gt; int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); 示例: fp = fopen("/home/b001/file01", "w"); /* change permissions to 644      */     if (fchmod...

fish的专栏 1692

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

串行FLASH文件系统FatFs-移植过程

第二个参数为cmd命令号,文件系统通过命令号来告诉底层,比如获取当前设备的容量,某个文件的大小等等(底层通过switch...case...来确定不同的返回值);第一个参数为文件系统句柄,其中drv为之前在diskio.c中定义的设备号,csize为簇(表示多个扇区),ssize为每个扇区的大小,最后一个成员win[_MAX_SS]为文件系统的缓冲区。第三个参数btr表示要读取的内容大小,我们可以使用f_size函数来获取文件的大小,通过第四个参数和第三个参数比较,我们可以判断是否读取到文件末尾。

qq_25218501的博客 1367

9、STM32 SDIO FATFS(SD卡)

STM32 SDIO FATFS

qq_36561846的博客 2709

STM32Cube学习篇(5)---FatFs文件系统(SPI Flash)

FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统。它完全是由 ANSI C 语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。如果我们需要手动移植FatFs的话,可以从fatfs官网下载源码:在下载的src文件夹中,主要用到的文件有:option文件夹下是一些可选的外部c文件,包含了多语言支持需要用到的文件和转换函数。diskio.c。

sdoiajoi的博客 3602

STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)

CubeMX配置了如何读写SD卡,并移植了FATFS文件系统

32Haozi 1万+

文件系统FATFS的移植教程

FATFS文件系统官方:[link] 一、FATFS文件系统简介         FATFS是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由C语言编写并且完全独立于底层I/O介质。支持的内核有:8051、PIC、AVR、SH、Z80、H8、ARM等。FATFS支持FAT12、FAT16、FAT32等格式。 1.1 FatFs的目录结构 从上述官方下载FatFs源码,如下图所示:    &

qq_39778488的博客 3万+

STM32-基本知识梳理8-FATFS文件系统移植

文件系统本质上,可以理解为一个函数B,外部可以通过函数A调用函数B,而函数B不接触底层操作,而是通过调用函数C对底层存储进行操作。3,主要的文件需要包含上述的6个c文件或者h文件,在文件文件中,需要调整主要是diskio.c \ ffconf.h。1-启动首先第一步,是挂载系统。2- 如果写入完成,立即读取,则需要调用lseek进行重新定位,才能读取,这是由文件光标位置决定,相当于退后光标;2,移植需要借用spi-flash控制的源码,在spi-flash控制的源码的基础上,添加文件系统。

ADAS_sunshine的博客 4006

STM32CubeMX学习笔记20——SD卡FATFS文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构(即在存储设备上组织文件的方法)。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统;不带文件系统的SD卡仅能实现简单的读写扇区操作,要真正应用SD卡必须要使用文件系统FATFS文件存储原理(以FAT32为例),下图为FAT32文件系统布局:分区空间大小簇空间大小每个簇包含的扇区数< 8GB4KB88KB1616KB32>= 32GB32KB64。

H2z1220的博客 5317
下一篇: 解决安装arm-linux-gcc提示未找到安装目录或文件
Sourcelink
博客等级 码龄12年 31粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值