filesystems - STM32F103 SPI 闪存上的 FATFS 移植

标签 filesystems stm32 spi freertos

我已经在 32 Mbit 的 STM32F103 SPI Flash 上移植了免费 RTOS 的 FATFS。在演示应用程序中,我已成功创建文件、写入文件并从文件中读回。我的要求是我必须在 SPI 闪存中存储多个文件(图像)并在需要时读取它。

我有以下情况/疑问。

  1. 我已将扇区大小设置为 512 字节,SPI 闪存的 block 删除大小为 4K。与 SPI Flash 一样, block 需要在写入之前删除。我是否需要跟踪特定 block 是否被删除或其管理该 block 的文件系统?

  2. 如何验证我正在写入的扇区是否已删除?我目前正在做的是,删除我要写入的扇区的完整 block ?

  3. 我如何确保我要删除的 SPI 闪存 block 不会影响任何包含有用数据的扇区?

感谢期待,

问候,

AK

最佳答案

最简单的解决方案是将“簇”大小定义为 4K,与闪存的页面大小相同。这意味着每个文件,即使只有 1 个字节,也需要 4K,即 8 个连续扇区,每个扇区 512 字节。 一旦您需要再保留一个簇,当文件增长到超过 4096 字节时,您就选择一个空闲簇,将其链接到 FAT,然后写入下一个字节。

出于性能原因并提高闪存的耐用性,您应该避免在不需要时删除闪存扇区。读取速度比删除速度快很多数量级。因此,当您选择一个空闲簇时,您可以启动一个循环来读取 8 个扇区中的每一个扇区。一旦发现哪怕有一个字节不等于 0xFF,就会中止循环并调用该扇区的闪存删除。

如果闪存 Controller 能够直接执行空白测试,则可以进一步优化。这样的测试可以在几微秒内完成,同时读取 8 个扇区并循环检查 4096 字节中的每一个字节可能会更慢。

关于filesystems - STM32F103 SPI 闪存上的 FATFS 移植,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25140803/

相关文章:

linux - 确定文件系统是否以只读方式挂载的最佳 POSIX 方法

ios - 使用某种持久 ID 监视文件

java - 如何读取Maven应用程序的webapp文件夹中的目录

c++ - FreeRTOS STM32 链接器堆栈大小与任务堆栈大小

c - 有人有带有 TLC59116 I2C 示例代码的 STM32L0xx 吗?

c - 如何提高 CMWX1ZZABZ-091 RTC(实时时钟)的精度

linux - 如何告诉 Linux 板上的某些引脚用于 SPI/I2C

c# - 检测文件打开

c - 无法识别的 jedec id

c - STM32 SPI 发送