一次失败的S32K模拟EEPROM经历

因为项目需要,使用S32K的内部flash模拟EEPROM使用。于是自然是查看数据手册,参考官方DEMO,准备操作。
根据手册内部flash map如下图
一次失败的S32K模拟EEPROM经历_第1张图片可见其中可配置存储分为FLEXNVM和FLEXRAM,根据手册解释:
FlexNVM为可配置非优化存储器,相当于flash。
FlexRAM 可配置RAM,可配置为传统RAM或者存储仿真EEPROM数据。所以当然优先选用FlexRAM来模拟EEPROM,而且NXP官方提供的DEMO也是选用FlexRAM来模拟,如下图所示:
一次失败的S32K模拟EEPROM经历_第2张图片FlexRAM可配置为2K和4K,并且可按字节擦写,擦除10K次,一切都和普通EEPROM的操作类似,仅看代码和测试过程是完美模拟了EERPOM,后面的工作就相对简单了,把官方驱动移植到自己的项目中,封装自己的接口,单步调试,功能测试OK,准备交代码了。
但是测试工程师在实测的时候发现,每块新板子的EEPROM功能初始化都卡住,返工检查发现,每块芯片跑代码的时候都会在第一次分区的时候卡主引起芯片重启,追踪发现,出现具体问题的代码是
FLASH_DRV_DEFlashPartition->FLASH_DRV_CommandSequence中flash状态在等待CCIF标记时引起重启。但是如果执行单步调试,则可以等待到该状态标记位,通过分区初始化,并且只要一次初始化成功,以后都不会影响功能。
找到问题后,立马去搜索问题解决办法,发现很多都有类似的问题,在DS中测试官方代码是没有问题的,但是移植到其他IDE下会出现重启故障,解决方案是将初始化代码重定位到RAM中去执行,我司项目使用的IAR,所以参考官方的ld文件修改自己的icf文件
一次失败的S32K模拟EEPROM经历_第3张图片添加自己的EEPROM段,但是实测发现仍然会有重启故障,折腾了两天后发现此路不同,所以放弃了在FlexRAM中模拟EEPROM。
在FlexNVM中模拟EEPROM,必须考虑对齐的问题,因为FlexNVM的擦除是按照Sector为单位的,芯片默认的Sector为2048,也就是一次擦除2K大小的存储,而写FlexNVM则是按照一个最小存储单元来写的,也就是按照4字节对齐写入,所以在做底层的时候必须考虑对齐的问题,在底层自动将不满4字节长度填满。相对来说没有FlashRAM灵活,但是由于这一块空间比较大(默认64K),所以也有自己的优点,只要做好底层,对于应用来说没有区别。希望各位大神做过FlexRAM模拟的发给我一份代码参考一下(邮箱[email protected]),谢谢!

你可能感兴趣的:(S32K144)