内容提要

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

S32K1xx系列MCU的EEE(Emulated EEPROM)使用详解相关推荐

  1. S32K1xx系列MCU的Flash擦除与编程

    List item S32K1xx系列MCU的Flash擦除与编程 (使用S32K1xx SDK Flash驱动API) S32K1xx系列MCU的Flash资源包括P-Flash和Flex NVM, ...

  2. 浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解

    内容提要 注:本文摘自NXP工程师胡恩伟的微信公众号"汽车电子expert成长之路",大家感兴趣可以关注一下. 引言 1. S32K1xx系列MCU启动过程详解(startup_S ...

  3. 【×××系列八】Dynamic Multipoint *** for IPv6 详解

    [×××系列八]Dynamic Multipoint *** for IPv6 详解 一.前言 由于涉及IPV6加密,所以根据思科标准此次配置使用思科7200系列高级企业版IOS (详情参考我的上一篇 ...

  4. 接口与继承系列教材 (十)- Java 内部类详解

    接口与继承系列教材 (十)- Java 内部类详解 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤1:非静态内部类 步骤2:静态内部类 步骤3:匿名类 步骤4:本地类 步骤5:在匿名 ...

  5. 跟着小马哥学系列之 Spring AOP(Pointcut 组件详解)

    学好路更宽,钱多少加班. --小马哥 版本修订 2021.5.19:去除目录 2021.5.21:引用 Spring 官方 Pointcut 概念,修改 Pointcut 功能表述 简介 大家好,我是 ...

  6. 浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作)

    引言 一般工程师都怕研究MCU的startup过程,其原因可能有:1.觉得没有必要,startup的过程和启动代码在新建工程时,并且已经默认加入并配置好,能够保证MCU正常工作,只要关系main()函 ...

  7. 【经验】8位MCU EFM8LB1 I2C_Slave多地址接收原理详解,光模块普遍使用该功能

    8位MCU EFM8LB1是Silicon Labs专门针对光模块.小家电推荐的一款小封装.高性价比微控制器解决方案,EFM8LB1系列MCU,可选I2C bootloader.UART bootlo ...

  8. socket 获取回传信息_Luat系列官方教程5:Socket代码详解

    文章篇幅较长,代码部分建议横屏查看,或在PC端打开本文链接.文末依然为爱学习的你准备了专属福利~ TCP和UDP除了在Lua代码声明时有一些不同,其他地方完全一样,所以下面的代码将以TCP长连接的数据 ...

  9. [CentOS Python系列] 六.阿里云搭建Django网站详解

    本篇文章主要介绍讲述部署阿里云服务器Django网站环境,并通过IP地址访问网页的过程.写代码过程中往往第一步需要解决的就是配置开发环境,对于新手来说,这是非常头疼的事情,而当配置好之后或者对于老手来 ...

  10. CSS3 经典教程系列:CSS3 圆角(border-radius)详解

    <CSS3 入门教程系列>前一篇文章详细介绍了 CSS3 RGBA 特性的用法,今天这篇文章我们在一起来看看 CSS3 中用于实现圆角效果的 border-radius 属性的具体用法. ...

最新文章

  1. Python装饰器与面向切面编程
  2. node nest 框架学习(一)
  3. 第二弹:超全Python学习资源整理(进阶系列)
  4. 将k8s制作成3D射击游戏,好玩到停不下来,附源码
  5. sas 检测到开型代码语句的递归_对于标准答案的递归很多人都看不懂,其实就是一个深度优先的遍历。我写了段伪代码,将递归步骤还原并注释了一下,供大家参考,希望大家有所收获。...
  6. Software Project Management之EVM问题的求解
  7. 【Qt教程】3.5 - Qt5 QPainter绘图抗锯齿、相对坐标/平移坐标系、QPainter画图片、手动调用QPainter绘图事件
  8. 浮动元素引起的问题和解决办法
  9. 火龙果卡密生成获取get!{火龙果邀请码指定卡密}
  10. Excel如何将数据填充完下方的空白单元格
  11. keil 安装 for NRF52832
  12. 专利代理人资格考试怎么准备
  13. 关于 Private strand flush not complete
  14. html a5 尺寸,纸型尺寸大小(A1,A2,A3,A4,A5,A6,B1,B2,B3,B4,B5......)
  15. educoder——面向对象程序设计java——实验实训——实验三 - 集合框架
  16. 哈利波特魔法游戏(原创)
  17. 如何批量将 jpeg、png、gif、bmp、webp 转换为 svg 格式
  18. avalonia 控件TextBox 及其他控件文本改变事件
  19. 真实版“删库跑路”?程序员蓄意破坏线上生产环境
  20. html css 清除 button 选中时的边框样式 CSS outline属性

热门文章

  1. 速读水浒!108将的简介与结局
  2. android代码签名和混淆打包
  3. selenium模拟刷百度流量源码
  4. 用基带等效的方式仿真8-DPSK载波调制信号在AWGN信道下的误码率和误比特率,并与理论值相比较。
  5. 镜头焦距、光圈、物距与景深之间的关系
  6. 新元宇宙每周连载《地球人奇游天球记》第十七回海王会龙
  7. 成为虚无鸿蒙系统掌控者,飞剑问道:烟雨飞剑破开鸿蒙空间,秦云成第四位鸿蒙掌控者!...
  8. Python教程传送门,手把手带你学会Python!
  9. Incorrect string value: '\\xE6\\xBF\\x80\\xE5\\x85\\x89...' for column 'rukuName' at row 1 QMYSQL:
  10. 贪心算法——国王游戏(洛谷P1080)