汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

外设使用Tips之MPC57xx系列MCU C55 Flash模块详解及其SSD(标准软件驱动)使用

0
阅读(12512)

内容提要

引言

1. Qorivva MPC57xx系列的C55 Flash模块详解

1.1 Qorivva MPC57xx系列的C55 Flash芯片级平台配置

1.2 c55 嵌入式Flash存储器c55FMC)特性和功能模块框图介绍

1.3 MPC57xx系列MCU C55 Flash的Block大小与地址映射

1.4 MPC57xx系列MCU C55 Flash的操作的注意事项

2.  C55 Flash的SSD介绍和使用

2.1 C55 Flash SSD的获取和安装

2.2 C55 Flash SSD功能简介

2.3 C55 Flash SSD的测试与正常的编译环境IDE

2.4 C55 Flash SSD提供的Flash驱动函数及其功能说明

总结


引言


NXP的Qorivva MPC57xx系列MCU采用55nm工艺,其片上集成的Flash也是COMS 55nm工艺,故称之为C55 Flash,其分区和操作方式与之前的介绍的S12(X)系列MCU的P-Flash有所不同。虽然官方提供了C55 Flash的SSD(Standard Software Driver--标准软件驱动),但要真正使用好其SSD,还需要先了解MPC57xx系列MCU C55 Flash模块的工作特性和访问机制。


本文就以Qorivva MPC5744P为例,先介绍其C55 Flash的地址映射和分区以及访问机制和操作注意事项,然后再介绍C55 SSD以及如何调用SSD对C55 Flash进行操作。


1. Qorivva MPC57xx系列的C55 Flash模块详解


1.1 Qorivva MPC57xx系列的C55 Flash芯片级平台配置


在Qorivva MPC57xx系列MCU中,其片上集成的存储器资源(SRAM和NVM)通过AHB总线(地址总线宽度为32-bit,数据总线宽度为64-bit)作为Slave连接到内部Cross Bar Switch(基于AMBA 2.0)总线矩阵上,从而作为Cross Bar Switch Master的CPU内核(PowerPC e200zx),JTAG/NEXUS调试接口,eDMA模块以及有些高级外设(比如ENET以太网控制器)等可以高效访问。

而在整个Qorivva MPC57xx系列MCU中其存储器控制模块(SRAM控制器和Flash控制器)都带有e2eECC(end to end Eorr Correction Code,端到端错误纠正码),其会对地址和数据同时进行ECC校验以保证数据在传输过程中的完整性,实现更高的ISO-26262功能安全等级。


下图为MPC5744P的片上存储器资源在芯片级系统框图中的连接:

2.jpg

具体到本文要介绍的Flash模块,其芯片平台连接示意图如下,在某些MPC57xx系列MCU中其Flash与SRAM之间通过相应的控制器模块还可能存在RAM overlay映射关系,以简化实现在线标定功能(比如常见的发动机控制ECU的CCP标定)。

3.jpg

Flash存储器控制模块提供IPS编程模型映射到PowerPC架构的16KB空间的平台外设地址槽(slot)。这个IPS编程模型包含若干寄存器以控制Flash存储器的访问配置和overlay/remap映射配置。这些Flash存储器控制器IPS编程模型的配置寄存器只能使用32位访问(读/写),使用非32位对齐访问或者未定义地址访问都会引起IPS错误,所有的系统总线master都可以访问这些寄存器,但只能在监督员模式(supervisor mode)下访问

4.jpg

Tips:

A. 在Flash存储器控制模块正常工作时,更新这些配置寄存器都会导致不可预期的结果,因此用户软件必须避免此类操作(Flash控制器没有寄存器提供空闲指示标志)。对于多核MCU的推荐配置流程是在启动内核(boot core)启动的过程中运行对Flash模块的配置初始化,完成之后在启动其他内核。初始化这些寄存器配置Flash模块时必须将相应的配置代码拷贝到SRAM中运行。

 


B. 其中的平台Flash配置寄存器1(PFLASH_PFCR1)的APC和RWSC位域配置Flash访问时的地址流水线和数据读等待周期,其与CPU的性能(工作频率和工作温度)发挥密切相关,需要根据实际需要进行配置,具体允许的配置值与CPU允许频率之间的推荐关系请参考所使用芯片的datasheet:

5.jpg

比如,下图就是MPC574xP系列MCU的datasheet给出的推荐配置:

6.jpg

1.2 c55 嵌入式Flash存储器c55FMC)特性和功能模块框图介绍


c55 嵌入式Flash存储器具有如下特性:


  • 测试信息保存在专用非易失性区块(称作UTest区块);

  • 在UTest区块保留有OTP(One Time Program)空间,可用于保存一次性编程的用户配置信息(典型如MPC57xx系列MCU启动过程中用到的DCF Records配置信息);

  • 读访问页大小为256位(即8words--32位CPU,其字宽(word)为32-bit),即Cross Bar Switch Master(比如e200 CPU内核)每次可以读取256比特数据(256-bit read bus);

  • 带单比特纠错,多比特检错的ECC功能(64bit data + 7 bit ECC);

  • 编程/写访问页大小为64位(8Byte),即Cross Bar Switch Master(比如e200 CPU内核)每次可以写入的最小数据为64比特(64-bit write bus),因此在编程Flash是需要按照8字节对齐;

  • 软件可编程块擦除和编程限制控制(通过配置Flash控制模块寄存器);

  • 可对选定Flash区块进行擦除;

  • 独立的UTest NVM区块编程;

  • 内嵌硬件编程和擦除算法;

  • 当访问不同分区(partition)时支持RWW(Read-While-Write)操作;

  • 支持擦除暂停、编程暂停和擦除暂停编程操作;

  • 在UTest模式下支持存储阵列完整性检查和边缘读(Margin Read);

  • Flash功能的三态翻转(Triple Voted Flops)要求高的完整性,比如内部修整(trim),冗余和模式控制;


c55 嵌入式Flash存储器控制功能模块框图如下所示:

7.jpg

C55FMC的控制寄存器如下:

8.jpg

其中模块配置寄存器 (C55FMC_MCR)包括很多Flash操作的控制和状态位,需要编写Flash驱动时将使用到,具体请参考芯片参考手册;扩展模块配置寄存器(C55FMC_MCRE)为只读寄存器,其中包含了芯片出厂时对片上Flash资源大小的设定值;锁定寄存器0~3(C55FMC_LOCK0~3)用于保护和解保护Flash区块(block),而选择寄存器0~3(C55FMC_SEL0~3)用于选择Flash操作的对象区块(block)。地址寄存器(C55FMC_ADR)提供Flash操作失败的第一个地址所在Flash Block及地址信息;UTest 0寄存器(C55FMC_UT0)提供了对UTest NVM资源的控制和操作,该寄存器只有在输入密码切换至UTest模式之后才可写。UMISR(Multiple Input Signature Registers--多输入签名寄存器) (C55FMC_UMn~9),用于对Flash的阵列完整性进行评估(evaluate array integrity);过编程(Over-Program)保护寄存器0~3 (C55FMC_OPP0~3)位只读寄存器,其值为芯片出厂时设定,以表征相应的Flash Block是否支持过编程相应的位映射与配置寄存器(C55FMC_MCRE)和选择寄存器0~3(C55FMC_SEL0~3)相同;


Tips:


A. 在对某一Flash Block操作时,锁定寄存器0~3(C55FMC_LOCK0~3)中相应的为必须被置为0,以允许编程/擦除操作,而具体每次Flash操作的对象,则是通过择寄存器0~3(C55FMC_SEL0~3)来控制,其也是每个位对应一个Flash Block。


B. 可以通过写锁定寄存器0~3(C55FMC_LOCK0~3)一次保护或解保护多个Flash Block,操作Flash时,也可以通过择寄存器0~3(C55FMC_SEL0~3)将相应的位置1来选择一个或多个Flash Block;


C. 用户自己编写Flash驱动对MPC57xx系列MCU的片上Flash进行操作时,就需要要配置以上寄存器先对Flash Block解保护(unlock),然后选择根据操作的选择具体的Flash Block,并写入地址和数据,最后配置C55FMC_MCR寄存器相应位开始操作并根据其中的标志位判断操作是否成功;如果用户使用官网提供的SSD,虽然不需要具体操作这些寄存器,但仍然需要搞清楚其中的Block映射关系;


D. 如下为C55FMC_LOCK0~3寄存器的详细介绍,其中每个位对应的Flash Block是否存在以及每个Block的具体大小取决于具体的芯片,不同的part number不同。


C55FMC_LOCK0寄存器中提供了对UTest NVM区和14个Low Flash Block以及16个 Mid Flash Block的锁定保护/解保护功能,其中每个位映射到具体的一个Flash Block:

9.jpg

C55FMC_LOCK1寄存器中提供了对16个 High Flash Block的锁定保护/解保护功能,其中每个位映射到具体的一个Flash Block:

10.jpg


C55FMC_LOCK2寄存器中提供了对32个 256KB Flash Block的锁定保护/解保护功能,其中每个位映射到具体的一个Flash Block:

11.jpg

C55FMC_LOCK3寄存器中提供了对额外的16个 256KB Flash Block的锁定保护/解保护功能,其中每个位映射到具体的一个Flash Block:

12.jpg

选择寄存器0~3(C55FMC_SEL0~3)的位定义和映射与锁定寄存器0~3(C55FMC_LOCK0~3)一致,只是其功能变成了选择,每次只能选择其中的一个位。如下为C55FMC_SEL2的定义:

13.jpg

1.3 MPC57xx系列MCU C55 Flash的Block大小与地址映射


从以上1.2节的介绍,在其c55FMC控制寄存器中,保护,选择和过编程保护寄存器的每一个为对应一个实际的Flash Block,那么在MPC57xx系列MCU中,其片上Flash资源的具体Block大小和地址映射关系是怎样的呢?


下面我们就一起来看看MPC5744P的Flash映射:


MPC5744P总共有2.5MB片上Flash存储器,包括4个16KB的Low Flash Block(4*16KB =64KB)、2个32KB的Mid Flash Block(2*32KB = 64KB)和6个64KB的High Flash Block(6*64KB = 384KB)以及8个256KB的 256KB Flash Block(8*256KB = 2MB):


            64KB + 64KB + 384KB + 2MB = 2.5MB


具体映射地址和Flash Block分配以及RWW分区和Block大小如下表:


14.jpg

Tips:属于不同RWW分区的Flash Block间支持Read-While-Read操作,即允许在A Flash Block的Flash驱动可以操作B Flash Block;地址0x80000~0x817FFF的96KB Flash空间包含 LowFlash Block0~1和Mid Flash Block0~1总共4个Flash Block被分配作为模拟EEPROM使用,在整个2.5MB的Flash地址空间中,只有Low Flash Block2~3, High Flash Block0~1和和256KB Flash Block0~3四个Flash Block可以作为启动位置(boot location0~7),所谓boot location就是每次MCU复位后运行BAM时寻找合法启动半字和复位向量的区域。其会从boot location0~7顺序查找合法的合法启动半字(RCHW)和复位向量:

15.jpg

17.jpg


Tips:关于Qorivva MPC57xx系列MCU的启动过程,请参考本公众号的另外一篇文章《S32DS使用Tips--S32DS for Power V1.2 链接文件和启动过程详解》(直接点击跳转阅读)


1.4 MPC57xx系列MCU C55 Flash的操作的注意事项


通过以上对Qorivva MPC57xx系列MCU C55 Flash模块的功能和特性介绍,我们在对其操作时需要注意以下事项:


A.  C55 Flash的最小擦除单元为Block,而不是之前S12(X)的Sector,在Qorrivva MPC57xx系列MCU中,最小的Block Size为16KB;Flash必须先擦除在编程; C55 Flash的最小编程单元为Page=64 bit;


B.  C55 Flash的ECC结构是64bit data + 7bit ECC,即每8个字节的用户数据产生一个7比特的ECC结果,所以,在对 C55 Flash编程/写入数据时,必须8字节地址对齐/数据对齐(不够的字节补0xFF),以保证其ECC结果的完整性;


C. 为了保证MCU性能的发挥,需要根据实际的CPU内核运行频率配置修改Flash配置寄存器1(PFLASH_PFCR1)的APC和RWSC位域配置匹配的Flash访问地址流水线和数据读等待周期(具体允许的配置值与CPU允许频率之间的推荐关系请参考所使用芯片的datasheet)


2.  C55 Flash的SSD介绍和使用


2.1 C55 Flash SSD的获取和安装


NXP为其几乎所有的汽车级MCU--S08、S12(X)、MagniV S12Z、KEA/S32K以及Qorivva MPC56xx/57xx系列都提供了Flash的SSD驱动,在其产品官方网页上就可以下载到,对于MPC57xx系列来说,其Flash都是COMS 55nm工艺的,所以其公用同一个SSD--C55 NVM SSD,可以在任一MPC57xx系列MCU的产品官方网站的软件和工具(SOFETWARE & TOOLS)-->中间组件-设备驱动(Midware-DeviceDrivers)


比如MPC574xP系列的产品官方网站:www.nxp.com/mpc574xp;

18.jpg


下载后,点击运行C55_JDP_SSD.exe,选择安装目录即可完成SSD的安装。


2.2 C55 Flash SSD功能简介


C55 Flash SSD安装完成后,在其安装目录下,提供了详细的用户手册--SSD_C55_UM_v1.1.pdf,其中提供了SSD调用时用到的数据结构、配置参数、驱动函数的功能描述及其输入输出参数说明和返回错误处理建议等,同时还提供了每个SSD驱动函数编译后的代码大小、堆栈使用量以及运行时间和使用限制、ECC引起IVOR1/2异常处理等信息。

 

19.jpg


Tips:强烈建议大家使用SSD前仔细阅读,其中关于SSD配置参数和每个驱动函数功能和输入参数的描述部分需要结合前文C55 Flash模块详解或者芯片的参考手册,才能正确理解:


在C55 NVM SSD的安装目录下还有以下文件夹,

20.jpg


其内容介绍如下:


Demos文件夹:其中提供了SSD参考使用示例代码,是我们学习使用SSD的起点,其中分文件夹提供了不同MPC57xx系列MCU的CW、Diab和GHS三种不同编译器的使用示例工程;


Driver文件夹:提供SSD驱动的PowerPC BookE指令集编译和VLE指令集编译结果,均提供了C数组格式和S19文件格式;


Tool文件夹:提供命令行的ECC计算软件和MISR--Flash 阵列完整性输入生成软件,关于其具体使用方法,请参考各自目录下的readme.text说明文件;


Tips:

A. 使用了SSD时,不同的编译器IDE其汇编指令的原语(directive)、注释方式、启动库等存在差异,所以需要区别使用;


B. 另外,千万不能把BookE和VLE指令集的SSD搞混使用,即使用的编译器设置必须与所调用的SDD指令集一致。否则会出现运行异常和编译错误等;


C. 此版本的SSD中未提供S32DS for Power V1.x IDE版本的demo工程,如果大家想在S32DS for Power V1.x IDE使用此SSD,建议大家从CW demo工程中一致,相对会比较容易;使用C55 SSD时需要在应用工程的C编译器选择Symbols下添加“FLASH_TARGET”的全局预定义符号/宏:


D. SSD中提供的C数组格式的Flash驱动程序,其各个驱动函数单独使用一个C文件,其编译时使用了位置独立代码(PIC--Position Independent Code)选项,从而保证了其可以在任意存储器中正常运行,比如需要在SRAM中运行也是OK的。

21.jpg


2.3 C55 Flash SSD的测试与支持的编译环境IDE


C55 Flash SSD测试EVB和芯片maskset 版本:

  • MPC5746M EVB, silicon version cut2 (mask set 0N42G)

  • MPC5744P EVB, silicon version cut2.1B (mask set 0N15P)

  • MPC5775K EVB, silicon version cut 3 (mask set 0N76P)

  • MPC5746R EVB, silicon version cut 2.0B (mask set 1N83M)

  • MPC5777M EVB, silicon version cut 2 (mask set 0N78H)

  • MPC5777C EVB, silicon version cut 1.0B (mask set 2N45H)


Tips: 使用时请注意芯片的maskset是否与C55 Flash SSD的测试芯片一致,如果不找,可能会导致某些SSD功能不支持或者驱动函数不能正常运行,具体请不同maskset的芯片差异,请到其官方网站的文档(DOCUMENT)栏下载芯片的勘误表(errata): Qorivva MPC57xx系列MCU的官方网站列表如下:


MPC574xP系列:www.nxp.com/mpc574xp;

MPC577xK系列:www.nxp.com/mpc577xk;

MPC574xB-C-G系列:www.nxp.com/mpc5748g;

MPC5746R系列:www.nxp.com/mpc5746r;

MPC5777M系列:www.nxp.com/mpc5777m;

MPC5777C系列:www.nxp.com/mpc5777c;


C55 Flash SSD支持的编译环境IDE如下:

22.jpg


2.4 C55 Flash SSD提供的Flash驱动函数及其功能说明


在C55 Flash SSD TRM-V1.1.0中提供了如下Flash驱动函数,其相应的功能如下表:

 

23.jpg


总结


本文详解介绍了Qorivva MPC57xx系列MCU的C55 Flash模块功能及其SSD驱动以及使用C55 Flash驱动时需要注意的事项,这是开发了Qorivva MPC57xx系列MCU bootloader必须要掌握的知识点。


关于了Qorivva MPC57xx系列MCU C55 Flash SSD驱动的使用,大家可以参考其安装目录下的demo工程,以及接下来本公众号推出的文章《汽车电子ECU BootLoader开发之基于CAN总线通信的MPC57xx系列MCU bootloader开发详解(以MPC574xP为例介绍)》及其基于S32DS for Power v1.2 IDE的demo工程。


胡恩伟

NXP汽车电子FAE


若对本文观点有任何意见和建议欢迎留言指出。

如果喜欢,可以关注本人公众号,阅读更多精彩内容。