锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-09-08 04:07:02 90k1集成电路

内容提要

引言(基于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区域显示为正常状态(默认值0)xFF).

如下为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-Flashsector都是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 并输入起始地址:

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,并提供了相关的应用指南和应用笔记以及样例工程供大家参考,希望对大家有所帮助。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章