嵌入式学习小组
直播中

张玉珍

7年用户 1008经验值
私信 关注

求助,怎么利用data flash模拟EEPROM?

各位大佬,我现在有一块NUC029的芯片,现在想将全部的程序都放到EEPROM中去,将相当于芯片复位之后程序不会丢,开机之后依旧可以运行。不知道模仿EEPROM可不可以实现?如果可以的话,我按照例程那样的,直接将相关的的配置代码放到main()之内,while()之前行不行?

#define Test_data_size 8
#define Test_page_amount 4


int main(void)
{
        uint32_t flash_i;
        uint8_t u8Data;
        
        int instant_sec,last_sec;
        uint8_t key;

        SYS_UnlockReg();
        SYS_Init();
        SYS_LockReg();
        
        /***********************************
        利用data flash模拟EEPROM
        ************************************/
        /* Test Init_EEPROM() */
        Init_EEPROM(Test_data_size, Test_page_amount);
        
        /* Test Search_Valid_Page() */
        Search_Valid_Page();
        
        /* Test Write_Data() */
        for(flash_i = 0; flash_i < 254; flash_i++)
        {
                Write_Data(flash_i%Test_data_size, flash_i%256);
        }
        
        /* Test Write_Data() contain Manage_Next_Page() */
        Write_Data(flash_i%Test_data_size, 0xFF);
        
        /* Test Read_Data() */
        Read_Data(0x7, &u8Data);
        
        /* Test Write over 20000 times */
        while(Get_Cycle_Counter() < 20000)
        {        
                for(flash_i = 0; flash_i < 247; flash_i++)
                {
                        Write_Data(flash_i%Test_data_size, flash_i%256);
                }                 
        }

...........

        while(1)
       {
       ......
        ......
         ......
        }

}





回帖(1)

贾大林

2024-5-21 17:28:38
首先,NUC029芯片内置的Data Flash可以用来模拟EEPROM功能。且在以下情况被称为Data Flash:

1.数据Flash控制器可以支持高达32KB的容量。

2.可通过读、写、验证方式操作Data Flash。

3.Data Flash最小写入单位是一页(512字节),因此需要将写入的数据分割成适当大小的块进行写入。

为了使用Data Flash作为EEPROM,您可以按照以下步骤进行:

1.首先确定需要保存的数据大小和数据页数。

2.在main函数之前,添加如下代码以配置Data Flash:

//指向Data Flash起始地址地址.

#define PageBaseAddr   (DATA_FLASH_STORAGE_BASE)

//虚拟页号计数器

__IO uint8_t u8DFVirtPageNum = 0;

//实际页号计数器

__IO uint8_t u8DFRealPageNum = 0;

//当前页地址.

uint32_t u32Addr;

//EEPROM数据结构体。

struct EEPROM_DATA

{

uint8_t Data[Test_data_size];

};

//EEPROM保存数组。

EEPROM_DATA g_EEPROM[Test_page_amount] __attribute__((at(DATA_FLASH_STORAGE_BASE)));

3.定义一个EEPROM数据结构体和一个保存EEPROM数据的数组。

4.使用g_EEPROM数组进行EEPROM数据读写操作。例如:写入数据

//将数据写入Data Flash

for(flash_i=0;flash_i
{

g_EEPROM[u8DFVirtPageNum].Data[flash_i] = u8Data+flash_i;

}

//调用DF_Write函数保存Data Flash。

DF_Write(u32Addr, (uint32_t *)(&g_EEPROM[u8DFVirtPageNum]), Test_data_size);

5.使用DF_Read函数来读取EEPROM数据:

//从Data Flash中读取数据。

DF_Read(u32Addr, (uint32_t *)(&g_EEPROM[u8DFVirtPageNum]), Test_data_size);

for(flash_i=0;flash_i
{

printf("Read:%drn",g_EEPROM[u8DFVirtPageNum].Data[flash_i]);

}

上述代码仅供参考,您还需要根据自己的实际需求进行修改。同时,请注意Data Flash的擦除和写入次数有限,需要谨慎使用。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分