打印
[STM32F4]

Flash 存储模拟 EEPROM

[复制链接]
116|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢动作|  楼主 | 2024-12-9 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为了模拟 EEPROM 功能,通常会将 Flash 存储的一个区域划分为 EEPROM 存储区域,并使用特定的算法来模拟写入和擦除行为。一个常见的做法是使用环形缓冲区或者写入新数据后标记过期数据,防止频繁擦写导致的 Flash 过早损坏。

EEPROM 模拟算法
环形缓冲区:为模拟 EEPROM,我们可以为 Flash 存储区域划定一个固定大小的“EEPROM”区域,然后通过轮替方式存储数据。当 EEPROM 空间满时,可以覆盖最旧的数据。
标记过期数据:每次写入新数据时,可以在 Flash 中为每个数据块添加一个有效性标记(如 CRC 校验、时间戳等),在读取数据时判断其有效性。



使用特权

评论回复
沙发
慢动作|  楼主 | 2024-12-9 16:39 | 只看该作者
数据写入与读取
可以通过预定义的写入函数来将数据存储到 Flash 中的特定区域。使用一个较为简便的地址分配方式,可以模拟 EEPROM 的字节级读写。一般来说,我们会先检查该地址是否有有效数据,如果没有,则写入新数据;如果已有数据,则覆盖或者选择下一个地址。

使用特权

评论回复
板凳
慢动作|  楼主 | 2024-12-9 16:39 | 只看该作者
代码示例:模拟 EEPROM 写入
c
复制代码
#define EEPROM_START_ADDR 0x0801F800  // 假定 Flash 的 EEPROM 起始地址
#define EEPROM_SIZE       1024        // EEPROM 模拟大小(1KB)

// 模拟 EEPROM 写入
HAL_StatusTypeDef EEPROM_Write(uint32_t eepromAddress, uint8_t data) {
    if (eepromAddress >= EEPROM_START_ADDR && eepromAddress < (EEPROM_START_ADDR + EEPROM_SIZE)) {
        // 如果地址在模拟 EEPROM 范围内
        return Flash_Write(eepromAddress, data);
    }
    return HAL_ERROR;  // 地址越界
}

// 模拟 EEPROM 读取
uint8_t EEPROM_Read(uint32_t eepromAddress) {
    if (eepromAddress >= EEPROM_START_ADDR && eepromAddress < (EEPROM_START_ADDR + EEPROM_SIZE)) {
        return Flash_Read(eepromAddress);
    }
    return 0xFF;  // 返回一个默认值表示未找到有效数据
}

使用特权

评论回复
地板
慢动作|  楼主 | 2024-12-9 16:40 | 只看该作者
数据擦除与重写
在 Flash 模拟 EEPROM 时,擦除操作应谨慎进行。我们通常会在某些特定条件下(如设备重启时)执行擦除。一般来说,只要数据有效,就避免对 Flash 进行擦除操作。

使用特权

评论回复
5
慢动作|  楼主 | 2024-12-9 16:40 | 只看该作者
代码示例:擦除模拟 EEPROM 区域
c
复制代码
// 擦除 EEPROM 存储区域
HAL_StatusTypeDef EEPROM_Erase(void) {
    return Flash_Erase(EEPROM_START_ADDR);  // 擦除从 EEPROM 起始地址开始的 Flash 区域
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

719

帖子

0

粉丝