问题标签 [fatfs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1098 浏览

embedded - STM32F407VET FatFs f_close 返回 FR_DISK_ERR

我正在使用 chan FatFS 库通过 SDIO 协议将 SD 卡(16Gb Sandisk 超微型 SD)连接到 STM32F407 微控制器。当我尝试将数据写入现有文件时,f_write 返回 FR_OK 并返回写入字节数(此值等于要写入的字节数),但 f_close() 返回 FR_DISK_ERR,最后文件为空。通过更多实验,我发现如果我使用 64Kb 单元分配大小和包含一些文本的现有文件格式化微型 SD 卡,那么我可以将 64Kb 数据写入文件,但 f_close() 返回 FR_DISK_ERR,最后文件不是空的。我能够在 Windows 10 操作系统中查看数据。如果现有文件中没有文本,那么即使 f_write 返回 FR_OK 但 f_close 返回 FR_DISK_ERR,我也会得到一个空文件。简而言之,当我尝试在从 PC 创建的文本文件上使用 f_write 时,我可以覆盖该文件的内容直到 64Kb。但我无法让它与我用 f_open 创建的空文件一起工作

我遇到了一个类似的帖子有同样的问题

TMS320F2812 FatFs f_write 返回 FR_DISK_ERR

我尝试了上述帖子中给出的解决方案,但没有奏效。由于我的控制器中有 192K RAM,我想它足以让这个 FatFs 模块工作。我的堆栈大小约为 13Kb,堆大小为 4Kb,这对于这个应用程序来说太大了。SD 卡提供 3.3V 电源电压。

我深入研究了代码以查看错误发生的位置,发现在设置卡的块大小时出现 SD_ILLEGAL_CMD 错误。内部 f_close(ff.c 文件)->f_sync(ff.c 文件)->move_window(ff.c 文件)->disk_read(diskio.c 文件)->SD_ReadBlock(sdcard.c 文件)在设置时返回 SD_ILLEGAL_CMD 错误卡的块大小。

任何解决方案表示赞赏。如果需要更多信息,请随时询问,我会更新更多信息。

Chan FatFs 版本 - R0.07e

0 投票
0 回答
318 浏览

stm32 - Fat12 仿真

我在 MCU STM32 Chan 的库的内部存储器中实现了 FatFS 。现在我尝试模拟更大容量的闪存设备来接收来自 PC 的大文件。我可以通过更改 FatFS 映像的两个位置来做到这一点: 1. 通过将MBR扇区的MBR_start + 12字段值更改为需要模拟的扇区数量(地址 0x1CA,LBA 格式): 2. 通过更改文件系统中的扇区总数在 FAT12 引导扇区中: 在此处输入图像描述在此处输入图像描述

但是我可以放在那里的最大数量 ix 0x13F(LBA 格式)以模拟 PC 可见的 142KB 闪存。如果我尝试将该字段更改为更高的值,我认为我的 USB 大容量存储仿真失败并且 PC 说我无法识别 USB 设备。

这是我的 FAT12 FS 存储二进制扫描的链接: https ://cloud.mail.ru/public/GddY/6rvUuyPHx

有人做过同样的事情吗?我找不到任何 FatFS 大师的论坛。谢谢你的任何建议。

0 投票
1 回答
559 浏览

c - 在微控制器上以二进制形式写入文件

我正在使用 STM32476 Nucleo 板,现在我将传感器中的一些数据写入可读文件,但速度太慢了。显示我现在正在做的一些代码:

我怎么能把它改成用二进制写呢?

0 投票
4 回答
5950 浏览

stm32 - STM32F7 + FatFs = FR_NOT_READY

我现在使用 CubeMx 4.23.0 和 STM32F7 1.8.0 MCU 的固件包是 Core746i 板上的 STM32F746。一切都是由 CubeMx 自动生成的。

主.c:

sdmmc.c:

如果 f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) <- 此处为 1(强制安装),则输出为:

  1. f_mount = 0x03
  2. f_open = 0x01

使用 0(现在不要挂载)输出为:

  1. f_mount = 0x00
  2. f_open = 0x03

0x03 值是 FR_NOT_READY,但官方信息对此非常模糊

我尝试过的事情:

  1. 将 HAL_SD_Init(&hsd1) 添加到 MX_SDMMC1_SD_Init() 因为我没有找到 SD 卡 GPIO 初始化发生在哪里。
  2. 2 GB 无名 SD 卡,1 GB 创见卡。
  3. 不同的 hsd1.Init.ClockDiv 3 到 255。
  4. 彻底重新焊接一切。
  5. 使用 HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) 切换到 4 位宽总线;
  6. 打开和关闭引体向上。

但卡仍然没有安装。它采用 FAT 格式,在 PC 上工作,我尝试打开的文件存在,但为空。

如何让它安装?提前致谢!

0 投票
2 回答
1874 浏览

c - 使用 FATfs 的 STMF4 和 USB OTG

STM32F407 Discovery Board用于接口USB OTG FS。我正在CubeMx and Keil用于开发。

首先,我启用了 PC0 - USB_Power(用于探索板)并且状态为 RESET 以确保 USB 正常运行。
我已启用 PA9 - VBUS 作为 GPIO 输入。
我的系统以 168MHz 运行。
已使用 MAX_SS(Max Sector size) - 4096(此选项在 Cube Mx 中可用)。
启用 USB 作为主机并使用 CubeMX 提供的 FATFS。
Enbaled MSC(海量存储类)。

代码:

所以这里发生的是我正在创建一个 CSV 文件,并且在每个循环中我都在其中添加新数据。我真的很成功。我使用这个特定的代码创建了一个非常长(500KB 不太长)的 csv 文件。

但是我在这里发现了一个我无法理解的异常。

当我将此部分添加到代码中时,没有创建文件,并且每次迭代控件都会达到此功能。

我无法理解此功能如何影响工作代码。我确信这是两个不同的东西APPLICATION_STARTAPPLICATION_IDLE当我评论这部分代码时,一切都很好,只要我的存储没有结束,我就可以制作文件。

我花了几个小时(比如 2 天)才发现这是问题所在。
我试图增加最小堆大小 - 0x2000 和最小堆栈大小 - 0x4000(此选项可用于 cubeMx 中的链接器设置。生成文件时,您提供项目名称、位置和所有内容的位置)

任何建议都会有所帮助,因为我没有想法。

0 投票
1 回答
2084 浏览

usb - 在同一逻辑驱动器中使用 FATFS 复制文件

MCU - stm32f407vgt6
IDE -True Studio
附加 -CubeMx

说明-
我正在尝试将文件从 USB 驱动器复制到具有不同名称的同一个 USB 驱动器。

源文件 - FILE2.txt- 此文件存在于驱动器中,大小为 3KB
目标文件 - file2copy.txt- 此文件将在同一驱动器中创建,FILE2.txt并将复制的内容。

代码-

错误-
我能够打开源文件,但无法在驱动器中创建目标文件。

res 在这种情况下变为真。

所以我的问题是我如何在同一个逻辑驱动器中复制文件以及在该驱动器中打开目标文件有什么问题。

提前致谢。

0 投票
1 回答
2928 浏览

usb - 使用 f_mount 读取和写入数据到文本文件

在我的应用程序中,我需要使用调用 f_open、f_read 和 f_write 打开、读取数据并将数据写入文本文件。

无法打开 .txt 文件

这是给出错误:

FR_NOT_ENABLED, /* (12) 卷没有工作区 */

为了解决这个错误,应用程序需要在每次媒体更改后执行 f_mount 函数来强制清除文件系统对象。

如何在此应用程序中使用 f_mount() 调用来解决此问题?我不清楚第二个参数。

我添加了这个 f_mount(&fs0, "0://", 1); 来解决这个问题。

在 f_open 调用之前。它也没有调用 f_mount() 。

->代码在 f_mount()* 之前运行时停止

这是我正在使用的 f_mount 的源代码:

  • 该代码在生成文件时未显示任何错误/警告。我确定代码没有问题。
  • 代码没有问题。这是与 emmc 中的内存分配或内存不足有关的问题吗?这种行为的可能原因是什么。感谢任何帮助。

提前致谢和问候

0 投票
1 回答
1456 浏览

c - Fatfs 在包含许多文件的目录中显着减慢

我有一个在 STM32F7 上运行的数据记录系统,它使用 ChaN 的 FatFs 将数据存储到 SD 卡: http ://elm-chan.org/fsw/ff/00index_e.html

每组新数据都存储在带有目录的单独文件中。在设备上进行后处理期间,会读取每个文件,然后将其删除。在测试了包含 5000 个文件的目录中的打开、读取、删除序列后,我发现我扫描的目录越远,它的速度就越慢。

一开始这个循环大约需要 100-200 毫秒,2000 个文件,现在需要 700 毫秒。有没有更快的存储、读取、删除数据的方法?或配置 FatFs?

编辑:抱歉应该指定,我使用 FAT32 作为 FAT 文件系统

0 投票
0 回答
458 浏览

stm32 - FatFS f_write 永不返回

我正在尝试使用 STM32F401RET6 开发板写入 SD 卡上的文件。我正在使用我在亚马逊上获得的 SDIO 适配器(https://www.amazon.ca/gp/product/B07C26YZPK/ref=oh_aui_detailpage_o06_s00?ie=UTF8&psc=1)。在 STM32CubeMX 中,我启用了 1 位 SDIO 并将 FATFS 中间件设置为 SD 卡。我在“配置”选项卡中没有更改任何内容。

我在“USER CODE BEGIN 2”(正上方void main的无限循环)中使用以下代码来编写“Hello World!” 到 SD 卡。

此代码使用我编写的宏来更轻松地记录这些函数的结果。

当我上传并运行它时,我在串行监视器中得到以下信息:

这意味着挂载文件系统和打开文件进行写入都成功了。但是,该f_write函数永远不会返回。当我将 SD 卡插入计算机时,我可以看到文件已创建,但它是空的。

我可以读取文件没有问题,但我不能写入它们。我也试过f_puts了,也不管用。我正在使用 STM32CubeMX 4.27 并使用生成的Makefile. 我已经尝试了几张 SD 卡,并且都表现相同。

0 投票
0 回答
672 浏览

c - FATFS 在我第二次使用相同的代码行时返回 FR_DISK_ERR

我正在使用 FATFS 将数据写入 SD 卡。它部分工作,我能够将 EEPROM 数据写入 SD 卡。但是当我稍后在代码中使用不同的函数时,即使我使用的是同一行代码,它也会返回“FR_DISK_ERR”。

我第一次尝试写入SD卡如下(此时我已经初始化了SD卡并制作了文件,这不是问题):

函数 fr = f_open(&File, file_name, FA_OPEN_APPEND | FA_WRITE); 返回 FR_OK 并将数据正确写入 SD 卡。每当数据准备好时调用此函数,并在收集数据后停止。

我第二次调用它的功能是这样编程的:

我无法完全显示我的代码。我不认为这很重要。让我感到困惑的是,第二次(不是真的第二次,只是另一个函数)我调用该函数来 open_append 文件时,它返回一个错误(PB6 上的 LED 亮起)。FATFS 网站没有完全解释该错误。有谁知道为什么会这样?

我知道代码的第二部分之前已经工作过,并在同一硬件上对其进行了全面测试。不知何故,该软件的第一部分在第二部分中产生了一个错误,该错误并没有改变。

我希望第一段代码写 16 行 16 字节的 EEPROM。下次它必须显示其他数据,如当前日期/时间等。

编辑: 我已将其追溯到以下功能:

函数 'if (disk_read(fs->pdrv, fs->win, sector, 1) != RES_OK)' 生成 FR_DISK_ERR。这是什么意思?它说 /* 如果读取的数据无效,则窗口无效 */,但我没有读取任何数据