【NXP KE 系列】FlexMemory 使用注意事项说明

一、 FlexMemory 是什么鬼 ?

       首先要认识一个单词 “Flex”,它是灵活的意思,所以 FlexMemory 是指用户可以灵活配置的内存。Kinetis 系列的单片机中 FlexMemory 包含两部分,分别是 FlexRAM和 FlexNVM ,用户可以根据自身的需求进行灵活配置。

       以 KE1xZ256 系列为例,下面图 1 是 Flash Memory & FlexMemory Block 的示意图,我们这里主要关注右边 FlexMemory 部分,然后接下来会具体介绍每一部分的作用,以及配置的注意事项。

 

 

 

 图 1 KE1xZ256 系列 Flash Memory & FlexMemory Block

 

二、 FlexRAM & FlexNVM 的配置使用说明

       FlexRAM & FlexNVM 的使用配置可以参考 NXP 官方 SDK 包例子,也可以参考这里所列举的基础配置(这里的配置已经通过实验可以成功使用这些外设的功能),如果考虑到具体的擦除和读写操作的函数,请参考 SDK 包所提供的 API 。其中 FlexRAM 可以作为传统 RAM 、高耐性(增强型)EEPROM 或者加速 Flash 编程来使用,而 FlexNVM 可以用来执行代码 、存储数据 DFlash(Data Flash)或者配合 EEPROM 使用作为备份区。以 KE1xZ256 系列为例,如下图 2 所示,这两部分的地址空间是不一样的,如果用户单独使用其中的一个内存时,则不需要考虑是否存在冲突的情况,而且若按字面意思,将 FlexRAM 作为 RAM 使用,FlexNVM 作为 Data Flsah 使用,两者也是可以同时使用,不会出现冲突情况。但是 FlexRAM 作为 EEPROM 使用时需要利用 FlexNVM 空间,所以要注意 EEPROM 的 SIZE 大小和备份区的空间大小,防止出现两个内存无法同时使用的问题,下面会就这些情况详细说明。

 

 图 2 KE1xZ256 系列 Flash Memory & FlexMemory 地址空间范围

三、 先介绍 FlexRAM 作为传统 RAM 的使用  

       用户手册中介绍 FlexRAM 作为 Traditional RAM 的特点:当在程序或数据闪存中编程或擦除数据时,可以对 FlexRAM 进行读写访问。

       拿 KE14Z256VLL7 举个例子:FlexRAM 大小是 2KB ,当配置为 RAM 使用时,它的大小就是 2KB ,地址范围如图 2 所示。所以当配置成为 FlexRAM 时,另外有一个 FlexNVM 32KB 可以正常独立配置其他功能(作为存储数据 DFlash)使用,两者同时使用不会出现冲突的情况。下面语句是配置 FlexRAM 为 Traditional RAM 的代码,供用户参考。


/*! @brief Flash driver Structure */
Static flexnvm_config_t s_flashDriver;
void main()
{
......
/* Clean up Flash driver Structure*/
memset(&s_flashDriver, 0, sizeof(flexnvm_config_t));
/* Setup flash driver structure for device and initialize variables. */
FLEXNVM_Init(&s_flashDriver);
/* Switch function of FlexRAM if needed */
if (0U == (FTFx->FCNFG & FTFx_FCNFG_RAMRDY_MASK))
{
status = FTFx_CMD_SetFlexramFunction(&s_flashDriver.ftfxConfig, kFTFx_FlexramFuncOptAvailableAsRam);
if (status != kStatus_FTFx_Success)
{
return kStatus_FTFx_RecoverFlexramAsRamError;
}
}
/* wait for flexram as traditional ram. */
while (0U == (FTFx->FCNFG & FTFx_FCNFG_RAMRDY_MASK));
......
}​

  如以上配置好了之后,就可以使用 FlexRAM 的地址范围去操作 RAM ,调用 SDK 包例程所提供的 API 便可以正常读写 RAM 。

 四、 介绍 FlexRAM 作为高耐性(增强型)EEPROM 使用

        FlexRAM 配置为 EEPROM 的过程中有几个坑需要重点注意,所以下面的具体介绍要仔细瞄多两下,不然很容易自己埋了 ~_~  ~_~用户手册中介绍 FlexRAM 配置为 EEPROM 的特点,如下图 3 所示。


图 3 KE1xZ256 系列EEPROM 的特点描述

       由上图 3 可以知道,EEPROM 是硬件内置仿真模拟的,可以掉电保存数据,而且其配置涉及到内存分区的操作,首先是配置 EEPROM 的大小和 FlexNVM 备份区的大小,这时需要设置参数,用户可以根据自身要求去配置实际的参数,下面说一下配置 EEPROM 时,各个参数的具体含义,以及如何设置,会不会有陷阱 ~ ~

查阅 KE1xZ256 系列用户手册,在 Chapter 16 Flash Memory Module(FTFE) 中有介绍到,配置 EEPROM 需要设置两个主要参数,分别是 EEESIZE(3-0) & DEPART(3-0),如下图 4 所示,EEESIZE 是设置 EEPROM Data Size 大小的参数,由图 4 可知 EEPROM SIZE 大小可以是 32B ~ 2KB ,下面图 5 所示的是另一个参数 DEPART ,该参数是在 FlexNVM 中进行内存分区,为 EEPROM 的使用提供备份区,而且由图 5 可以知道设置 DEPART 参数的具体含义,但是这两个参数具体有何关联,具体怎么设置呢,请看下面的具体介绍。

 
图 4 设置 EEPROM SIZE 参考表

图 5 设置 FlexNVM 分区代码参考表
 

       这里介绍的比较细节,大家可以瞄多一眼,避免掉坑 ~ ~

       下面拿 KE14Z256VLL7 举个例子,图 6 的示意图是用户配置的角度,综合图 4 图 5,用户配置 EEPROM 大小 EEESIZE 是 32B ~ 2KB ,没有配置的内存空间部分不能使用,否则会出现错误。FlexNVM 中的分区代码 DEPART 是设置 EEPROM backup 的大小,两者参数的关系如图 7 所介绍。




图 6 用户配置 EEPROM 内存示意图




图 7 用户手册严格说明 EEPROM 备份区大小

       综合图 6 图 7 ,用户手册严格要求 EEPROM backup 的 SIZE 大小必须是 EEPROM SIZE 大小的 16 倍,究其原因是因为它涉及到 EEPROM 使用的性能和擦写的次数有关,16 倍是官方给出最优的一个参数选择,它是有一个公式计算的,这里不多做介绍,有兴趣的用户可以参考附件的文件 AN4282.pdf ,这里建议不要随便更改。

       配置 EEPROM 和备份区的地址都是往上增长的,按照 16 倍的关系,虽然 FlexRAM  没有配置的部分不能使用,但是 FlexNVM 没有配置的部分是可以作为 Dfalsh 去使用的。值得注意的是 EEPROM 备份区不需要人为去备份,而是由 EEE 状态机去备份数据的,所以当 FlexNVM 没有用完时,用户有额外的空间去使用 Data Flash 存储数据。

       下面以实例进行配置介绍,参考图 8 寄存器的参数值进行修改。


图 8 配置 EEPROM FCCOB 具体参数参考表

       以 KE14Z256VLL7 为例,配置 EEPROM 大小为2KB ,参数的修改参考上图 8 的数值表,通过参考例程,再修改寄存器 FCCOB 的数值就可以了。

       在这里还有一个细节要提前说明一下:

       用户配置好 EEPROM 的代码后,使用 IAR 编译、下载,在调试过程中,发现第一次烧写完代码后,再去修改 EEPROM 的参数值改变 SIZE 大小,然后再次烧录成功后,并没有按照用户预期改变了 EEPROM 的大小,通过调试发现没有执行到 FlexNVM 的分区函数。

       究其原因就是,用户第一次烧录代码后,代码运行过程中,执行 FlexNVM 内存分区函数,改变了 Flash 其他地址的值,当用户再次烧录代码时,只是覆盖了当前代码空间的地址,无法覆盖之前其他地址的 flash 数据 ,导致代码中 FlexNVM 分区函数认为已经分好内存区域,所以后续修改的参数都无法分区成功,最好的解决方式是把 Flash 整片擦除,       这个细节需要特别注意,避免掉进这个陷阱里面 ~ ~

例程代码如下:配置 2KB EEPROM ,需要修改按照以上参数参考资料进行设置。

 

#define EEPROM_DATA_SET_SIZE_CODE (0x33U) //2k eeprom

/*! @brief Set EEprom backup memory */

#if( (FSL_FEATURE_FLASH_FLEX_NVM_DFLASH_SIZE_FOR_DEPART_0011 != 0xFFFFFFFF) && \ (FSL_FEATURE_FLASH_FLEX_NVM_DFLASH_SIZE_FOR_DEPART_0011 == 0x00000000) &&

 \ (FSL_FEATURE_FLASH_FLEX_NVM_EEPROM_SIZE_FOR_EEESIZE_0011 != 0xFFFF) && 

 \ (FSL_FEATURE_FLASH_FLEX_NVM_EEPROM_SIZE_FOR_EEESIZE_0011 != 0x0000))

#define FLEXNVM_PARTITION_CODE (0x3U) // eeprom backup 32K

#endif

flexnvm_config_t s_flashDriver;

void main()

{

......

memset(&s_flashDriver, 0, sizeof(flexnvm_config_t));

FLEXNVM_Init(&s_flashDriver);

FLEXNVM_GetProperty(&s_flashDriver, kFLEXNVM_PropertyEepromTotalSize, &eepromTotalSize);

if (!eepromTotalSize)

  {

     /* The EEPROM backup size must be at least 16 times the EEPROM partition size in FlexRAM. */

     uint32_t eepromDataSizeCode   = EEPROM_DATA_SET_SIZE_CODE;

     uint32_t flexnvmPartitionCode = FLEXNVM_PARTITION_CODE;

 

     FLEXNVM_ProgramPartition(&s_flashDriver, kFTFx_PartitionFlexramLoadOptLoadedWithValidEepromData,

                               eepromDataSizeCode, flexnvmPartitionCode);

     /* Reset MCU */

     NVIC_SystemReset();

}

FLEXNVM_SetFlexramFunction(&s_flashDriver,kFTFx_FlexramFuncOptAvailableForEeprom);

......

}

如以上配置完成,可以调用 EEPROM 的读写 API ,对 FlexRAM 所在的地址范围进行模拟 EEPROM 读写操作,掉电可以保存数据。

五、 最后介绍 FlexNVM 作为 Dflash (Data Flash)的使用

       FlexNVM 作为非易失性闪存,常用的功能就是作为数据存储器或者作为 EEPROM 的备份区,在以上介绍 EEPROM 已经提过,当 FlexRAM 2KB 大小全部作为 EEPROM 时,需要 16 倍备份区,即 FlexNVM 32KB 全部作为 E-Flash (EEPROM 备份区)。另外一种用法是结合两者功能一起用。在这里先介绍当全部 FlexNVM 作为 Dflash 的使用,拿 KE14Z256VLL7 举例子,依据用户手册的介绍 FlexNVM SIZE是 32KB ,扇区为 2KB ,如图 9 所示,当 FlexNVM 没有配置分区时,则全部空间用作 Dflash ,其功能描述如下图 10 所示。


 图 9 FlexNVM 没有分区则作为 Dflash

 


图 10 FlexNVM 的功能描述

如上图 10 所示,FlexNVM 的功能主要是作为非易失性闪存为其他代码和数据提供存储空间,它的最小擦写单位是一个扇区 2KB 。

       当其全部作为 Dflash 时,代码配置如下,仅供参考:

/*! @brief Flash driver Structure */

static flexnvm_config_t s_flashDriver;

int main(void)

{

   ......

    /* Clean up Flash driver Structure*/

memset(&s_flashDriver, 0, sizeof(flexnvm_config_t));

/* Setup flash driver structure for device and initialize variables. */

result = FLEXNVM_Init(&s_flashDriver);

......

}

如以上配置完,就可以直接调用 Dflash 的 API 进行擦除,编程,验证擦除,验证编程。

 六、 附件

  • 参考手册:Kinetis KE1xZ256 Sub-Family Reference Manual (pdf)
  • 参考资料:Using the Kinetis Family Enhanced EEPROM Functionality(pdf)
  • 参考资料:How to use FlexMemory as D-Flash and EEPROM in KE1xF(pdf)

 七、 致谢
       感谢您的阅读,如上述有模糊不对的地方,麻烦告知,谢谢。

技术文档

类型标题档案
硬件Datasheet
硬件Application Note
操作手册Manual

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

DING

DING

2020年12月15日
很厉害!!!!