我正在使用 HAL_FLASHEx_Erase
在 stm32f103c8 上。
根据数据表,闪存的耐用性仅为 10k 个周期。
我的数据是 16 字节,所以我想方法如何像带计数器的小块一样使用闪存
在我注意到它每次删除 1 页之前。
如果我删除前面有 16 字节数据的 1 页
即使没有写入页面中的所有其他字节也会丢失耐久周期吗?
这是我认为的方法
当它失去耐力时,它使用下一帧
帧 = 数据(16 字节)+ 计数器(2 字节)
页(每个 1k 字节)
数据
1
帧指针
2
帧 1、帧 2、帧 3 ...
3
帧 56、帧 57、帧 58 ...
最佳答案
实际上,如果需要更改现有值(例如您的框架指针),则需要删除整个页面。唯一的异常(exception)是如果删除后该值仍为初始值,即十六进制 FF FF FF FF...
所以典型的方法是只追加数据直到页面已满,并使用初始 FF FF 值来检测是否已使用插槽。在您的情况下,它可能看起来像这样(注意:我不明白计数器的用途):
#define TAG_UNUSED 0xffff
#define TAG_USED 0x1111
typedef struct {
uint16_t tag;
uint16_t counter;
uint8_t data[16];
} flash_slot;
#define FLASH_PAGE_SIZE 1024
#define NUM_FLASH_SLOTS (FLASH_PAGE_SIZE/sizeof(flash_slot))
#define FLASH_SLOTS ((volatile flash_slot*)0x800FC00)
void save_data(uint8_t* data) {
// find next free slot
int index;
for (index = 0; index < NUM_FLASH_SLOTS; index++) {
if (FLASH_SLOTS[index].tag == TAG_UNUSED)
break;
}
if (index == NUM_FLASH_SLOTS) {
// all slots are used; erase page
flash_erase_page(FLASH_SLOTS);
index = 0;
}
// prepare data to be written
flash_slot slot;
slot.tag = TAG_USED;
slot.counter = 0;
memcpy(slot.data, data, 16);
// write slot without erasing page (as it's still at FF FF)
flash_write_data(&FLASH_SLOTS[index], &slot, sizeof(slot));
}
关于embedded - stm32删除闪存即使没有写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66202936/