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

标签 embedded stm32

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

相关文章:

将 GPIO_TypeDef 从 STM32L1xx 转换为 STM32F10x

c - STM32L1x 停止模式 + RTC 电流过大

gcc - 使用相对路径名进行交叉编译 - 用于二进制可移植性/可嵌入性? (海合会)

c - 单周期乘法和硬件除法是什么意思?

c - ATmega8 加/减计数器计数不正确

c - 开发分布式系统时,GCC 工具链的哪些元素应该相同?

android - 如何减少嵌入式 android 操作系统的启动时间?

user-interface - 嵌入式 GUI - 类似于 GWEN?

embedded - 在 STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

filtering - 从加速度计获取位置