S32K1xx FlexNVM 的特性及应用

一、 概述

本文将介绍 NXP S32K1xx 系列 MCU 的 FlexNVM 模块的基本知识,重点将介绍 FlexNVM 的概念、特性、工作原理以及如何使用该模块。

二、FlexNVM 的概念

对于一些初次接触 NXP MCU 的朋友,可能对此感到比较陌生,因此有必要来介绍下 FlexNVM 究竟是什么东西,到底有啥用途。从字面上理解,Flex 即为单词“Flexible”,译为灵活的,而 NVM 是 “Non-Volatile Memory”的单词缩写,为非易失存储器的意思,因此,FlexNVM 实际上就是灵活的非易失存储器的意思,灵活的意思即是为用户提供灵活配置非易失存储器的功能,关于非易失存储器,相信大家都不感到陌生,一般指那些掉电后仍然能保存数据的存储器,主要分为 ROM 和 Flash。那么 FlexNVM究竟为用户提供哪些灵活的配置选项呢?实际上我们可以这么理解,FlexNVM 就是一块 Flash,但是跟普通 Flash 的不同之处是我们可以将这块 Flash 配置成模拟 EEPROM 的备用区域。并且我们可以根据实际的需要配置模拟 EEPROM 的备用区域的大小。我们可以将 FlexNVM 全部配置为 D-Flash,也可以全部配置为模拟 EEPROM 的备用区域,或者两者皆有。

三、  FlexNVM 的特性

首先来了解下S32K1xx 的 FlexNVM 的大小,下图是 S32K1xx 系列的 FlexNVM 的大小。

                                                      图 3.1 S32K1xx FlexNVM 的大小

可以看出 S32K1xx 系列的 FlexNVM 大小从 32KB 到 512 KB 不等。那么 FlexNVM 这段内存大小是如何分配的呢?
S32K1xx 内部为我们配置 FlexNVM 提供了软件接口,用户可以通过向 S32K1xx 内部写相应的命令进行分区操作。
命令的格式如下图所示。

                                               图 3.2 S32K1xx FlexNVM 分区命令格式

                                                                图 3.3 CSEc Key 大小

                                                       图 3.4 EEPROM 大小设置

                                                        图 3.5 FlexNVM 分区配置

分区命令各字节的含义如下:

  • 该字节固定为 0x80,表示该命令为 FlexNVM 分区命令
  • 该字节表示 CSEc Key 的大小,具体大小可查看图 3,如果不使用 CSEc 模块,该字节必须配置为 0
  • 该字节表示是否使用 SFE(Security Flag Extension),仅最低位有效
  • 该字节表示是否在复位时加载有效的 EEPROM 数据到 FlexRAM
  • 该字节表示要设置的 EEPROM 的大小(EEESIZE),具体如图 4 ,该值的大小设置应取决于 FlexRAM 的实际大小
  • 该字节为 FlexNVM 的分区码,表示 FlexNVM 的内存具体分配细节,详见图 5

此外,关于 S32K1xx 的 FlexNVM 的特性,主要包括以下几点:

  • 保护机制防止已存储数据的意外擦除和烧写
  • 内置编程和烧录算法
  • 采用分段编程加速大批量烧录的时间
  • 当对P-Flash 进行擦除或者烧写时允许对 D-Flash 进行读访问

四、  FlexNVM 的工作原理

首先了解下 S32K1xx 模拟 EEPROM 的架构,如下图所示。

                                               图 3.1 S32K1xx 模拟EEPROM 的架构

从上图可以看出当用户请求访问模拟 EEPROM 的数据时,实际是读取 FlexRAM 的内容,而FlexRAM 的内容实际是通过内部的文件系统去模拟 EEPROM 的备份区域去查找的。当系统复位后,FlexNVM 模块内部会去读取模拟 EEPROM 的分区设置,该分区设置存储在 MCU 内部的某个内存区域(data flash IFR),该内存区域对用户是不可见的。此时模拟 EEPROM 的文件系统也会相应地进行初始化。模拟 EEPROM 的文件系统会定位备用分区中的所有有效数据,并将这些数据复制到 FlexRAM 中。
当向 FlexRAM 写入数据时,模拟 EEPROM 的文件系统会自动往模拟 EEPROM 的备用分区写数据,当向 FlexRAM 写入数据后,FlexRAM 将不允许被再次访问,直到FSTAT 寄存器的 CCIF 标志位置位。

五、FlexNVM 的应用实例

下面将用官方的例程讲解 FlexNVM 的使用,该示例使用的板子为 NXP 官网的开发板 S32K144 EVB,如下图所示。

                                                               图 5.1 S32K144 EVB

开发环境使用 S32K 官方推荐的开发环境 S32 Design Studio For Arm V2.2,具体下载链接如下:
https://nxp.flexnetoperations.com/control/frse/order?orderKey=588819317

 首先打开 S32DS,选择 File->New->S32DS Project From Example,导入工程“flash_partitioning_s32k144”。

                                                                  图 5.2 导入例程

后续关于工程编译及调试等步骤在此便不细说。下面将对 FlexNVM 配置的部分代码进行相关说明。

                                               图 5.3 FlexNVM 配置代码

上图所示代码便是对 FlexNVM 模块进行配置的代码,其中第一句便是对 FlexNVM 进行分区配置。该函数的第一个参数是个结构体指针,是用来存储 flash 配置的一段内存空间,用户可以在初始化时进行定义。而其它参数便对应之前所说的分区命令表里面的参数。第二个函数是对 Flash 的配置进行初始化。第三个函数是通过发送相关命令配置 FlexRAM 作为模拟 EEPROM 使用,否则,FlexRAM 将作为普通的 RAM 使用。用户通常完成以上三个代码的调用便可完成对 FlexNVM 的配置。

六、参考资料

  1. NXP ,《S32K1XXRM》,https://www.nxp.com.cn/webapp/sps/download/preDownload.jsp?render=true

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

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

评论