0、项目中有一些配置参数需要保存,如ip地址、bootloader启动标志位等,所以需要用到eeprom,在S32R274上应该是flash模拟的eeprom,nxp给了demo,稍作修改就可以使用。
1、在Processor Expert模块中添加eee模块,默认可能没有eee,这时候点击一下refresh,就出来了
2、配置eee模块,需要修改的主要是:data size,就是一次写入数据的最大值,如果存储的数据超过data size会丢失部分数据;maximum number of record 最大存储条目数。
最下面配置对应flash地址,大小,S32R274内置64K eeprom,如下图
3、配置完成后重新编译工程就可以使用eee模块函数了,
//定义一个结构体保存配置参数
typedef struct NVRamDate{
char boot_type; //1:BOOT_FLAG_BOOTLOADER 2:BOOT_FLAG_APP
char none0[2]; //保留
char customize_ip; //是否使用自定义ip
char ip[4]; //IP地址
char netmask[4]; //子网掩码
char gw[4]; //网关
char end[8]; //保留
} NVRamDate;
extern NVRamDate nv_buffer;
/**************************************************/
//初始化
ret = EEE_DRV_InitEeprom(&userConf, &state);
DEV_ASSERT(STATUS_SUCCESS == ret);
//读数据
status_t readBootFlag()
{
status_t ret = STATUS_SUCCESS;
uint32_t recordAddr;
memset(&nv_buffer,0x00,sizeof(nv_buffer));
ret = EEE_DRV_ReadEeprom(BOOT_EEE_ID,
sizeof(nv_buffer),
(uint32_t)&nv_buffer,
&recordAddr,
EEE_IMMEDIATE_NONE);
return ret;
}
//写数据
status_t change_ip_address(char *data)
{
status_t ret;
eee_state_t state;
char logstr[50] = {0};
ip4_addr_t ipaddr, netmask, gw;
//设置设备ip地址
IP4_ADDR((&gw), data[13],data[14],data[15],data[16]);
IP4_ADDR((&ipaddr), data[9],data[10],data[11],data[12]);
IP4_ADDR((&netmask), data[17],data[18],data[19],data[20]);
netif_set_addr(&net_interfaces[0], &ipaddr, &netmask, &gw);
//eee wirte函数只能增加条目,不能修改条目,所以每次写都先删掉之前的,其实是无效化,数据还是在eeprom里
ret = EEE_DRV_DeleteRecord(BOOT_EEE_ID,
EEE_IMMEDIATE_NONE);
//写入数据,其实虽然我的ID都是一样的,但是不能覆盖,是新生成的一条数据
nv_buffer.customize_ip = 1;
memcpy(&nv_buffer.ip[0],data + 9, 12);
ret = EEE_DRV_WriteEeprom(BOOT_EEE_ID,
sizeof(nv_buffer),
(uint32_t)&nv_buffer,
EEE_IMMEDIATE_NONE);
if(ret > 0) {//写入数据次数多了,会返回错误码0x0400,代表eeprom满,这时候擦除之前的数据再重新写入
EEE_DRV_RemoveEeprom();
EEE_DRV_InitEeprom(&userConf, &state);
ret = EEE_DRV_WriteEeprom(BOOT_EEE_ID,
sizeof(nv_buffer),
(uint32_t)&nv_buffer,
EEE_IMMEDIATE_NONE);
}
return ret;
}
/**************************************************/