gpt4 book ai didi

embedded - stm32删除闪存即使没有写入?

转载 作者:行者123 更新时间:2023-12-04 08:06:21 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com