发新帖我要提问
12
返回列表
打印
[STM32F2]

如何使用Flash来模拟EEPROM的功能

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
21
ccook11| | 2024-6-14 18:46 | 只看该作者 回帖奖励 |倒序浏览
选择一个没有被程序使用的闪存页作为模拟EEPROM的存储区域。通常每个闪存页的大小在几百字节到几千字节之间,这取决于微控制器的具体型号。

使用特权

评论回复
22
wwppd| | 2024-6-15 14:18 | 只看该作者
在对Flash进行写入操作之前,需要确保Flash处于解锁状态。这通过写入特定的键值到Flash密钥寄存器来完成。每次写操作必须以16位为单位进行,且只能整页或整片擦除。

使用特权

评论回复
23
jackcat| | 2024-6-15 20:00 | 只看该作者
由于闪存的擦除次数是有限的(通常在1万到1百万次之间),需要避免重复地擦写同一块区域。一种解决方案是实现一种策略,比如循环使用闪存的不同部分,以分散擦写次数。

使用特权

评论回复
24
abotomson| | 2024-6-16 08:11 | 只看该作者
如果需要清除存储在模拟EEPROM中的数据,可以执行擦除操作。擦除可以是一个扇区(如果Flash被划分为多个扇区),也可以是整个Flash。

使用特权

评论回复
25
wangdezhi| | 2024-6-16 18:40 | 只看该作者
在更新或删除数据之前,必须先擦除闪存页。STM32提供了API函数库来执行这一操作。擦除操作一般比编程操作快得多。

使用特权

评论回复
26
jackcat| | 2024-6-17 13:37 | 只看该作者
为了减少对同一Flash区域的频繁写入,可以采用一种“记录”列表的方法。每个记录包含一个或多个变量的组合,并有一个标签标识这些变量及其大小。更新记录时,新的记录版本被添加到活动块中的下一个可用位置,这样可以避免频繁擦写同一区域。

使用特权

评论回复
27
鹿鼎计| | 2024-6-18 06:37 | 只看该作者
当读取数据时,它可以直接从闪存的模拟 eeprom 区域读取。

使用特权

评论回复
28
EmmaTT| | 2024-6-18 20:42 | 只看该作者
这个应该会有例程提供吧

使用特权

评论回复
29
louliana| | 2024-6-19 17:17 | 只看该作者
#include "stm32f1xx_hal.h"

// 初始化Flash并擦除指定页
void Flash_Erase(uint32_t Page_Address)
{
    FLASH_EraseInitTypeDef EraseInitStruct;
   
    HAL_FLASH_Unlock();
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
   
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = Page_Address;
    EraseInitStruct.NbPages = 1;
   
    if(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
    {
        // Handle error
    }
   
    HAL_FLASH_Lock();
}

// 写入数据到Flash
void Flash_Write(uint32_t Address, uint16_t Data)
{
    HAL_FLASH_Unlock();
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
   
    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, Data) != HAL_OK)
    {
        // Handle error
    }
   
    HAL_FLASH_Lock();
}

// 读取数据
uint16_t Flash_Read(uint32_t Address)
{
    return *(volatile uint16_t*)Address;
}

使用特权

评论回复
30
digit0| | 2024-6-22 14:04 | 只看该作者
使用 flash 模拟 eeprom 时,需要仔细管理 flash 扇区,以避免由于过度写入而造成的 flash 损坏。

使用特权

评论回复
31
小小蚂蚁举千斤| | 2024-6-23 14:35 | 只看该作者
EEPROM的存储空间通讯还是比较简单的

使用特权

评论回复
32
实际测量不符|  楼主 | 2024-6-30 02:35 | 只看该作者
以下是一般的初始化步骤:

配置Flash的操作权限:
在进行写操作之前,你需要确保已经设置了Flash的写入权限。通常,写入Flash是有限制的,你可能需要在初始化过程中解锁Flash,并在写入完成后重新锁定Flash。

使用特权

评论回复
33
实际测量不符|  楼主 | 2024-6-30 02:36 | 只看该作者
定义EEPROM存储空间:
在Flash中选择一个区域来模拟EEPROM的存储空间。确定存储空间的起始地址和大小。确保你的EEPROM存储空间不会与程序代码或其他数据冲突。

使用特权

评论回复
34
实际测量不符|  楼主 | 2024-6-30 02:36 | 只看该作者
编写EEPROM读写函数:
实现读取和写入EEPROM数据的函数。这些函数通常会包括对Flash的读取和写入操作,以及必要的擦除操作。确保你的读写函数正确处理边界条件和错误情况。

使用特权

评论回复
35
实际测量不符|  楼主 | 2024-6-30 02:36 | 只看该作者
初始化Flash模块:
在程序初始化阶段,执行Flash模块的初始化。这可能包括设置Flash时钟、解锁Flash、配置Flash写入保护等操作。

使用特权

评论回复
36
实际测量不符|  楼主 | 2024-6-30 02:36 | 只看该作者
擦除EEPROM存储空间:
在首次使用EEPROM之前,确保先擦除EEPROM存储空间。你可以选择在初始化阶段进行擦除操作,或者在需要使用EEPROM之前单独执行擦除操作。

使用特权

评论回复
37
实际测量不符|  楼主 | 2024-6-30 02:36 | 只看该作者
检查初始化结果:
在初始化阶段,确保检查Flash模块的初始化结果以及EEPROM存储空间的擦除结果。检查错误标志以确保没有发生错误。

使用特权

评论回复
38
实际测量不符|  楼主 | 2024-6-30 02:36 | 只看该作者
在以上步骤中,特别要注意Flash的写入权限、存储空间的选择和擦除操作的执行。确保你的EEPROM读写函数能够正确地操作Flash,并且没有遗漏任何必要的步骤。

使用特权

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

本版积分规则