S32K1xx系列MCU的EEE(Emulated EEPROM)使用详解 您所在的位置:网站首页 eee诈骗 S32K1xx系列MCU的EEE(Emulated EEPROM)使用详解

S32K1xx系列MCU的EEE(Emulated EEPROM)使用详解

2024-06-02 17:57| 来源: 网络整理| 查看: 265

内容提要

引言(基于MCU的嵌入式系统中EEPROM的实现方式)

1. S32K1xx系列MCU的EEE工作机制详解

1.1 S32K1xx系列MCU的片上存储器资源

1.2 S32K1xx系列MCU的EEE工作机制详解

2. S32K1xx系列MCU的EEE使用常见问题(FAQ)

2.1 如何保护S32K1xx的EEE数据在调试下载过程中不被擦除/清除?

2.2 如何将编译结果中的EEE数据通过调试器下载到S32K1xx的EEE中?

2.3 S32K1xx EEE的写操作注意事项

2.4 S32K1xx 系列MCU的EEE分区和初始化注意事项

3. S32K1xx系列MCU EEE应用指南介绍

3.1 S32K1xx系列MCU EEE应用指南包含的内容

3.2 S32K1xx系列MCU EEE应用指南提供的参考样例工程

3.3 S32K1xx系列MCU EEE应用指南和样例工程及参考资料的下载链接

总结

引言(基于MCU的嵌入式系统中EEPROM的实现方式)

在嵌入式系统软件开发时,我们时常需要在程序运行时修改一些软件运行时的控制参数,比如电机控制的PID算法参数或者发动机控制的海拔高度与进气/氧量标定曲线等,这些参数和标定标量需要掉电不丢失。这时我们就需要用到EEPROM,在基于MCU的嵌入式系统开发过程中,如果MCU内部集成了真EEPROM--比如S12G系列和MagniV S12Z系列MCU则使用十分方便,如果没有集成,则通常有三种方式实现EEPROM功能:

① 通过MCU的I2C/SPI接口扩展外部EEPROM存储器芯片--常见的AT24C02/04等,其为真正的EEPROM存储器;

② 使用MCU内部集成的Flash存储器,用户自己编写代码实现模拟EEPROM(类似于一个微型文件管理系统--File System)。典型MCU如S12HY系列用于4KB的D-Flash用于模拟EEPROM,还有Qorivva MPC56xx/57xx系列MCU配备64KB的D-Flash用于模拟EEPROM;

③ 将Flash模拟EEPROM的代码做成固件(Firmware),芯片出厂时就固化好,并将模拟EEPROM的地址与特定的系统RAM进行映射,然后用户只需要对其进行一定的分区(partition)和使能EEE状态机之后,就可以通过访问映射的RAM地址空间快速高效的访问EEPROM数据了,典型MCU如S12XE系列MCU的EEE;

总结以上三种方式实现EEPROM功能的优缺点如下:

本文将介绍基于上面第三种函数实现EEPROM功能的S32K1xx系列MCU的EEE,介绍其工作机制和使用时的注意事项,以帮助大家更好的使用其EEE。

1. S32K1xx系列MCU的EEE工作机制详解

1.1 S32K1xx系列MCU的片上存储器资源

首先,我们来看看S32K1xx系列MCU的片上存储器资源:

Tips : FlexRAM和CSE_PRAM没有ECC功能,其余存储器资源都带硬件ECC功能。具体每种存储器资源的大小不同的part number不同。

S32K1xx系列MCU的片上存储器资源地址映射如下:

1.2 S32K1xx系列MCU的EEE工作机制详解

S32K1xx系列MCU为了获得增强功能的EEE,使用了FlexRAM、FlexNVM和EEE工作状态机(专门的硬件电路)。一旦通过Flash分区命令对FlexRAM和FlexNVM进行分区(即配置用于EEE的FlexRAM和EEPROM备份的FlexNVM大小)并使能EEE之后,所有的EEPROM操作都仅在EEE_RAM(FlexRAM)中进行,每次用户访问EEE_RAM之后,通过固件实现的EEE状态机就自动检测跟踪用户数据的变化,并将其自动备份在EEE_Flash(FlexNVM)中--这个工程有状态机自动执行,无需CPU参与,从而提高了EEE的访问效率:

S32K1xx系列MCU的EEE状态机使用 72-bit 记录(record)来备份EEPROM数据,其中 32-bit 用于存储用户EEPROM数据,其余 40-bit 是该记录中用户EEPROM数据的地址(在EEE_Flash中的存储地址)、状态(该记录所在EEE_Flash的擦除和编程状态)和奇偶校验(用于保证数据的完整性)信息。

Tips :因此,对S32K1xx系列MCU的EEE写操作,按照32-bit对齐的方式最为高效:

在成功执行EEE分区命令后:

用作EEE备份的FlexNVM区域( EEE_Flash )对CPU不可见,用户代码不能直接访问(读写)该地址映射区域,否则会产生总线错误进入内核 HardFault 异常 (默认配置) 或者 BusFault 异常(使用BusFault异常后),同时在调试界面的Memory窗口中, EEE_Flash 区域显示为未知状态(???).

用作D-Flash的FlexNVM区域( D-Flash )可以进行正常的Flash操作(Erase and Program), 在调试界面的Memory窗口中, D-Flash 区域显示为正常状态(默认值0xFF).

如下为S32K144中,将64KB FlexNVM分区,32KB用作EEE_Flash(地址0x10008000~0x1000FFFF),32KB用作D-Flash(0x10000000~0x10007FFF)的结果:

比如,将S32K144的64KB FlexNVM分区一半(32KB)用作D-Flash,另外一半用作EEE_Flash使用, 然后往EEE_Flash地址 0x10008000 写入任意数据,将出现bus error,进而CPU内核将进入HardFault异常:

*((uint32_t *)My_pSSDConfig.EERAMBase) = 0x12345678;

Tips :S32K1xx系列MCU的 EraseAllBlock 命令能够将S32K1xx系列MCU所有片上Flash—包括P-Flash、D-Flash(FlexNVM) 擦除,并初始化FlexRAM,如果操作成功,还会设置寄存器 FSEC[ SEC ] 让芯片 临时解密 (unsecure),如果要擦除并 永久解密 需要修改其Flash中的加密配置字节,可以使用 Erase All Blocks Unsecure 命令: 

所以,执行 FLASH_DRV_EraseAllBlock (&flashSSDConfig)之后,放在P-Flash中的数据将全部被清除,EEE的数据将丢失。

对于S32K1xx整个系列MCU的 P-Flash sector都是 4KB ,BLOCK的大小为512KB(S32K144/6/8)或者256KB(S32K142/S32K118)或者128KB (S32K116);

FlexNVM/D-Flash的sector大小为 2KB (S32K116/8、S32K142/4/6)或者 4KB (S32K148),BLOCK大小 32KB (S32K116/8)、 64KB (S32K142/4/6)或者 512KB (S32K148);

在调用分区命令(Program Partition command)将FlexRAM和FlexNVM分区为EEE之后,用户将数据放到FlexRAM中后,硬件的状态机电路将自动备份该数据到FlexNVM中的E-Flash空间;FlexRAM本质上还是RAM,掉电后数据会丢失,所以需要将其备份到非易失性存储器E-Flash中,然后,每次上电过程中再将其自动拷贝到EEE(分区后用作EEPROM的FlexRAM)中;

编程 unsecure_key 的目的是保证 EraseAllBlock命令执行后,下一次复位后,芯片依然是解密状态,而不是临时解密,从而调试器可以连接目标MCU,能够正常下载和调试程序。

2. S32K1xx系列MCU的EEE使用常见问题(FAQ)

2.1 如何保护S32K1xx的EEE数据在调试下载过程中不被擦除/清除?

在应用工程的 Debug Configuration 窗口中选中调试目标,然后在 Debugger 一栏中,点击 Advanced Options 进入高级配置选项:

在 Advanced Options 窗口中,勾选Preserve this range(Memory Range 0),并输入起始地址:

From : 首地址;

To :结束地址

比如保护 4KB 的EERAM,则输入( From ) 140000 和( To ) 140FFF 即可:

Tips :通过这种方式最多可以保护 3 块不同的NVM(EERAM/D-Flash/P-Flash)存储器;

这样配置之后,在debug界面的Console窗口中,可以看到保护操作的具体过程如下:

相应的测试结果如下:

在进行EEEPROM的quick write之前,用户必须调用Set FlexRAM Function command,通过Flash command sequence设置FlexRAM Function Control Code为 0x55 ,将EEEPROM操作从normal write模式切换为quick write模式。

在这个过程中,EEEPROM的硬件状态机会将处理之前未完成的normal write操作,必须等待其完成后,才能切换到quick write模式:

2.2 如何将编译结果中的EEE数据通过调试器下载到S32K1xx的EEE中?

首先,从应用工程编译结果的S19/HEX/BIN文件中通过 地址 (0x14000000 ~0x14000FFF/0x140007FF )确认,编译结果中已经包含了EEE的数据:

然后,在应用工程的 调试目标 (Debug Configurations)中,通过 高级选项 (Advanced Options):

勾选“ Enable Partitioning for the devic e”,输入正确的FlexNVM分区命令参数, 其中包含EEE大小( EEESIZE )和分区码( DEPART ):

使能分区命令后,程序下载过程可以看到debugger执行了相应的分区命令: PA 0204 :

下载完成后,在S32DS IDE的调试界面的Memory窗口可以看到S19文件中的EEE数据:

Tips :以上设置时 EEESIZE 和 DEPART 必须按照实际的需求和硬件part number资源选择的正确配置参数:

EEESIZE 的合法配置:

DEPART 的合法配置( 不同的part number存在差异 ):

2.3 S32K1xx EEE的写操作注意事项

如下代码,全速运行可以工作正常:EEPROM中的第一个数据地址被连续写成功,但是每次写之后都进行EEERDY标志检查,等待写到FlexRAM中EEPROM数据被EEEPROM状态机正确写入备份D-Flash中,从而保证下次写入FlexRAM之前,EEEPROM状态机为 ready/idle 状态:

这个备份的过程由硬件状态机自动实现,操作速度非常快,但在下一次操作当前FlexRAM地址之前必须检查 EEERDY 标志,等待当前地址的EEPROM操作完成,否则将引起 HardFault 异常:

地址 0x14000000 被连续写入数据(1->2->3),第二次(即写入3时就发生了总线错误,引起了HardFault异常)

具体的 HardFault 状态原因可以通过查看内核 SCB (System C ontrol B lock,系统控制块), CFSR 寄存器的 BFARVALID 位为1,表明 BFAR总线错误地址寄存器 保存正确的错误地址, 0x140000000 (FlexRAM/EEEPROM的首地址),同时产生了强制的硬件错误HardFault异常( HFSR寄存器的 FORCED 位为1),

当前激活异常向量号为 3 ,即HardFault异常:

Tips :发生了存储器访问时的bus error,如果使能了 BusFault ( SCB -> SHCSR [ BUSFAULTENA ])或者 MemFault ( SCB -> SHCSR [ MEMFAULTENA ])异常则不会进入HardFault,但是 默认的ARM Cortex M4F配置是将BusFault和MemFault异常关闭的 。

Tips : 即使是用作EEPROM的FlexRAM不同地址/数据记录(record)进行写操作,也必须检查EEERDY标志,等待当前地址的EEPROM操作完成,否则也将引起 HardFault 异常 :

鉴于以上原因,推荐大家使用S32K SDK中Flash组件的 FLASH_DRV_EEEWrite() 来操作EEEPROM,其中不但对每次FlexRAM的操作结果进行了 EEERDY 标志位检查,还对操作数据进行了对齐处理,从而保证了EEEPROM写操作的正确和效率:

Tips : 如果使能了EEPROM的Quick Write功能,则操作地址和数据必须按照4字节对齐;

2.4 S32K1xx 系列MCU的EEE分区和初始化注意事项

S32K1xx系列MCU的寄存器 SIM-> FCFG1 ,地址为 0x4004_804C ,其复位值由硬件从Flash存储器的 IFR 区域加载,从该寄存器中可以读到S32K1xx系列MCU的EEEPROM分区信息:

EEERAMSIZE :用作EEE的FlexRAM大小,S32K11x-> 2K ( 0b0011 ), S32K14x-> 4KB ( 0b0010 )

DEPART :FlexNVM分区信息,0xF为默认值,未使能EEEPROM,

在S32K1xx系列MCU的寄存器 FTFC-> FCNFG 中,提供了 EEERDY 位,供用户查询EEE是否准备好(ready):

由于执行FlexNVM分区命令会把FlexNVM和FlexRAM中数据清空,导致之前的D-Flash和EEE数据丢失,所以,在量产项目的整个产品周期中,只做一次FlexRAM分区即可 。

在每次EEE初始化时,需要注意:

① 通过读取寄存器 SIM-> FCFG1 ,判断分区情况,避免重复分区导致数据丢失;

② 访问EEE之前,读取寄存器 FTFC-> FCNFG ,检查其 EEERDY 位是否置位,确保EEE已经ready;

初始化时,使用S32K1xx  SDK的用户只需调用 Flash 组件的 FLASH_DRV_Init() API函数:

在访问EEE数据时使用 Flash 组件的 FLASH_DRV_EEEWrite() API即可:

推荐的EEE初始化代码如下(具体请参考SDK自带的Flash demo工程):

/* Always initialize the driver before calling other functions */ ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig); if (ret != STATUS_SUCCESS) { return ret; }#if ((FEATURE_FLS_HAS_FLEX_NVM == 1u) & (FEATURE_FLS_HAS_FLEX_RAM == 1u)) /* Configure FlexRAM as EEPROM if it is currently used as traditional RAM */ if (flashSSDConfig.EEESize == 0u) { /* Configure FlexRAM as EEPROM and FlexNVM as EEPROM backup region, DEFlashPartition will be failed if the IFR region isn't blank. Refer to the device document for valid EEPROM Data Size Code and FlexNVM Partition Code. For example on S32K144: - EEEDataSizeCode = 0x02u: EEPROM size = 4 Kbytes - DEPartitionCode = 0x08u: EEPROM backup size = 64 Kbytes */ ret = FLASH_DRV_DEFlashPartition(&flashSSDConfig, 0x02u, 0x08u, 0x0, false, true); DEV_ASSERT(STATUS_SUCCESS == ret); else { /* Re-initialize the driver to update the new EEPROM configuration */ ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig); if (ret != STATUS_SUCCESS) { return ret; } /* Make FlexRAM available for EEPROM */ ret = FLASH_DRV_SetFlexRamFunction(&flashSSDConfig, EEE_ENABLE, 0x0u, NULL); DEV_ASSERT(STATUS_SUCCESS == ret); } } else /* FLexRAM is already configured as EEPROM */ { /* Make FlexRAM available for EEPROM, make sure that FlexNVM and FlexRAM are already partitioned successfully before */ ret = FLASH_DRV_SetFlexRamFunction(&flashSSDConfig, EEE_ENABLE, 0x0u, NULL); DEV_ASSERT(STATUS_SUCCESS == ret); }#endif

Tips :在产品量产时,用户也可以选择使用Flash编程器在产线上进行FlexNVM分区,使能EEE。具体方法和步骤,请参考如下公众号文章( 点击文章标题即可直接跳转阅读 ):

《 使用Cyclone 离线编程器对S32K1系列MCU进行NVM(P-Flash, D-Flash和EEE)编程的方法与步骤详解 》;

3. S32K1xx系列MCU EEE应用指南介绍

为了帮助用户更好地使用S32K1xx系列MCU的EEE,NXP应用工程师团队写了一个S32K1xx系列MCU EEE应用指南。

3.1 S32K1xx系列MCU EEE应用指南包含的内容

《 S32K1xx 系列 MCU 应用指南之 EEPROM 模块使用详解 》的内容提要如下:

3.2 S32K1xx系列MCU EEE应用指南提供的参考样例工程

同时,《 S32K1xx 系列 MCU 应用指南之 EEPROM 模块使用详解 》还提供了配套的参考样例工程/代码,帮助大家学习和理解EEE使用要点:

3.3 S32K1xx系列MCU EEE应用指南和样例工程及参考资料的下载链接

大家可以通过以下百度云盘链接下载到《 S32K1xx 系列 MCU 应用指南之 EEPROM 模块使用详解 》 和样例工程:

链接 : https://pan.baidu.com/s/128Ss_qxJVWYvkzbrWWmzQw

提取码 : jr2w

NXP官网提供的应用笔记 AN11983, Using the S32K1xx EEPROM Functionality 是本文和 《 S32K1xx 系列 MCU 应用指南之 EEPROM 模块使用详解 》非常重要的参考资料。

下载链接如下:

https://www.nxp.com/docs/en/application-note/AN11983.pdf

S32K1xx SDK中提供的EEE使用样例代码可以通过 S32DS Project from Example 导出:

选择 SDK版本 -> target MCU  part numbe r-> driver_examples -> system -> flash_partioning_s32k1xx:

除此之外,NXP官网还提供了一个S32K1xx EEE使用寿命的计算器-- Flex-Memory Endurance Calculator :

其下载链接如下:

https://www.nxp.com/downloads/en/calculators/FME-Calculator.zip

Tips : Flex-Memory Endurance Calculator 使用方法请参考 《 S32K1xx 系列 MCU 应用指南之 EEPROM 模块使用详解 》。

总结

本文详细介绍了S32K1xx系列MCU的 EEE 工作机制和使用FAQ,并提供了相关的应用指南和应用笔记以及样例工程供大家参考,希望对大家有所帮助。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有