【简介】
S32K146 的Flash Memory Module (FTFC) 包含P-flash/FlexNVM/FlexRAM 三种类型,我们在此贴(【S32K146】S32K146片内flash编程)介绍了P-flash 的编程操作。在此基础上继续使用片内的EEPROM,使用片内的EEPROM 会使用到FlexNVM/FlexRAM。
以下是S32K1XX系列芯片内部memory 类型及大小,其中包含了P-flash/FlexNVM/FlexRAM 的大小的说明
S32K1xx EEPROM 启用后在芯片复位时将FlexNVM 的数据加载到FlexRAM 中。读取:直接从 FlexRAM 中读取记录,不涉及任何的 FlexNVM读操作。写入:直接将数据写入 FlexRAM 的记录中,记录的数据自动同步到 FlexNVM中。要使用 EEPROM 功能,必须对 FlexNVM 的内存进行分区。分区过程告诉状态机将使用多少 EEPROM 内存以及将使用多少 FlexNVM 来备份 EEPROM 即 E-Flash。 FlexNVM 有一个特殊的分区命令,用于配置 EEPROM。分区命令用于对 EEPROM 的两个参数即 E-Flash 的大小和 EEPROM 的大小进行编程。这两个参数被编程到 FlexNVM 的特殊位置。由于这是一个非易失性存储位置,因此在设备的整个生命周期中只需要进行一次分区。在启动分区命令之前, FlexNVM 和 D-Flash IFR(Nonvolatile information register)必须处于擦除状态。
以下是S32K146 的 FlexNVM 的分区命令来划定EEPROM 和 D-Flash 的配置大小
以下是S32K146 的 FlexNVM 的分区命令FCCOB 对应的配置命令说明如下:
对应的FCCOBX配置说明如下:
FCCOB 的set FLexRAM 命令可以配置FLexRAM 作为EEPROM使用,对应说明如下:
在原有的flash 初始化的基础上添加FlexNVM的分区配置并使能FlexRAM 作为EEPROM功能使用。
上述代码运行后按照预期对flexnvm 进行了分区配置
我们编写如下的测试代码对EEPROM进行写入
unsigned int eeprom(char argc,char *argv[]) { status_t ret; if(argc != 2) return 1; if(strcmp("write",argv[1]) == 0) { ret = FLASH_DRV_EEEWrite(&Pss_InitConfig_Lfs, Pss_InitConfig_Lfs.EERAMBase, 16, "0123356789abcdef"); if(ret != STATUS_SUCCESS) { LOG_E("eeprom write failed %x.",ret); } else { LOG_I("eeprom write OK."); } } return 0; }
写入后 读取FlexRAM的base 地址的数据,结果如下已经按照预期的写入。
断电重启后再次dump flexram(0x14000000)的数据,掉电后依然可以读取。