定期写入闪存的最佳实践是什么?考虑到我正在开发的硬件应该有 10 到 20 年的使用寿命,您的建议是什么?例如,我可以每 15 分钟写入一些状态变量吗Preferences?
我正在使用Spansion的16MB闪存.扇区大小为256KB.我正在使用闪存来读/写/删除30个字节的块(结构).我在IC的数据表中发现最小可擦除大小为256KB.删除特定块的一种方法是
我想问一下,有没有更好的替代逻辑.
我正在使用STM32F401VCT6U"发现"板,我需要为用户提供一种在运行时在内存中写入地址的方法.
我写了可以简化为以下功能的内容:
uint8_t Write(uint32_t address, uint8_t* values, uint8_t count)
{
uint8_t index;
for (index = 0; index < count; ++index) {
if (IS_FLASH_ADDRESS(address+index)) {
/* flash write */
FLASH_Unlock();
if (FLASH_ProgramByte(address+index, values[index]) != FLASH_COMPLETE) {
return FLASH_ERROR;
}
FLASH_Lock();
} else {
/* ram write */
((uint8_t*)address)[index] = values[index]
}
}
return NO_ERROR;
}
Run Code Online (Sandbox Code Playgroud)
在上面,address是基址,values是一个至少大小的缓冲区,count它包含要写入内存count的字节和要写入的字节数.
现在,我的问题如下:当address在flash中使用base调用上述函数时count=100,它在前几次正常工作,将传递的values缓冲区写入flash.然而,在那些前几次调用之后,我不能再写任何值了:我只能复位flash中的值中的位,例如,尝试将0xFF写入0x7F将在闪存中留下0x7F,而将0xFE写入0x7F将留下0x7E,并且任何值的0x00都将成功(但之后其他任何值都不会写入该地址).
我仍然可以通过改变基数来正常写入闪存中的其他地址address,但是再次只能写几次(两次或三次调用count=100).
此行为表明已达到闪存的最大写入次数,但我无法想象它会如此之快.在用尽之前,我预计至少有10,000次写入.那么我做错了什么?
我在我的项目中使用stm32f2xx系列控制器.我想知道在没有对外部闪存进行任何读/写操作的情况下是否将外部闪存连接到微控制器.那可能吗?
如果是,请解释这样做的方法.
如果重要,控制器和外部闪存之间的通信是SPI.
提前致谢.