我已经在 32 Mbit 的 STM32F103 SPI Flash 上移植了免费 RTOS 的 FATFS。在演示应用程序中,我已成功创建文件、写入文件并从文件中读回。我的要求是我必须在 SPI 闪存中存储多个文件(图像)并在需要时读取它。
我有以下情况/疑问。
我已将扇区大小设置为 512 字节,SPI 闪存的 block 删除大小为 4K。与 SPI Flash 一样, block 需要在写入之前删除。我是否需要跟踪特定 block 是否被删除或其管理该 block 的文件系统?
如何验证我正在写入的扇区是否已删除?我目前正在做的是,删除我要写入的扇区的完整 block ?
我如何确保我要删除的 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/