汽车电子expert成长之路

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

Qorivva MPC56xx系列MCU的Flash加密解密原理与工程实现方法详解

0
阅读(9077)

内容提要

引言

1. Qorivva MPC56xx系列MCU的加解密原理

2. Qorivva MPC56xx系列MCU的Shadow Flash与加密配置

2.1 非易失系统加密寄存器--NVSCC0和NVSCC1

2.2 Qorivva MPC56xx系列MCU加密秘钥寄存器NVPWD1和NVPWD01

3. Qorivva MPC56xx系列MCU的加密配置规则

4. 具体应用工程中的加密配置实现

第一步、在任意C源文件中添加以下秘钥和加密配置定义:

第二步、配置应用工程链接文件

第三步、编译链接应用工程,生成Shadow Flash秘钥配置S19文件

第四步、选择目标MCU的Shadow Flash算法文件,下载elf:

    ①使用CodeWarrior 10.6 IDE + U-Multilink调试器

    ②使用Cyclone离线Flash编程器

第五步、断电重启MCU,通过POR上电复位让加密配置生效

5. Qorivva MPC56xx系列MCU的复位启动过程和Flash解密流程

5.1 Qorivva MPC56xx系列MCU的引导启动模式选择

5. 2 Flash存储器引导启动

5.3 串行引导启动模式(基于BAM的默认固化bootloader)

    A.下载并执行新程序

    B.下载64-bit秘钥并检查秘钥

5.4  Qorivva MPC56xx系列MCU的Flash解密方法

    第①种、通过JTAG调试接口提供64-bit秘钥解密

    第②种、配置进入串行引导启动模式,通过串行通信接口提供64-bit秘钥解密

总结


引言


详细介绍了S12(X)的片上NVM(非易失性存储器--包括EEPROM/D-Flash和P-Flash)以及RAM资源的分页访问机制以及加解密原理和方法;NXP的8-bit 汽车级MCU--S08系列以及基于ARM Cortex M系列内核的KEA/S32K1xx系列汽车级MCU的加解密原理和方法与S12(X)系列类似,大家可以参考学习。

广泛使用的NXP的32-bit汽车级MCU--Qorivva MPC56xx/系列MCU的加解密原理和方法是怎样的呢?很多读者留言希望我能够介绍一下。本文就以MPC5604B为例给大家详细介绍Qorivva MPC56xx系列MCU的加解密原理和方法,希望对大家有所帮助和启发。


1. Qorivva MPC56xx系列MCU的加解密原理


Qorivva MPC56xx系列MCU中对存储在其片上NVM中的用户应用程序和数据的保护是通过审查(Censorship)机制实现的,其本质上与S12(X)系列MCU的加密(Security)都是禁止调试接口(Qorivva MPC56xx系列MCU的JTAG/Nexus,S12(X)系列MCU的BDM)的读写访问权限,从而阻止非法读取和修改存储在NVM上的用户程序和数据以及对通过调试接口对MCU内部寄存器资源的控制和调试。所以为了方便大家理解和记忆,本文中我们暂且也将Qorivva MPC56xx系列MCU的审查等效为加密。


具体而言,Qorivva MPC56xx系列MCU审查(Censorship)机制控制以下模块对片上NVM资源的访问权限:


A. JTAG/Nexus调试接口;

B . BAM(Boot Assit Module-启动辅助模块)的串行引导启动模式(Serial Boot Mode)(该模式为Qorivva MPC56xx系列MCU提供了一种下载并执行代码以查询或者修改NVM的出厂默认bootloader,下文将对其进行详细介绍)

加密后,为了重新获得NVM的访问权限,需要提供加密时设置的64-bit正确秘钥(password).


Tips:使能Qorivva MPC56xx系列MCU的加密(审查(Censorship)机制)后,重新获得MCUNVM访问权限的唯一方式就是通过秘钥,如果秘钥忘记或者未被正确配置,将无法恢复;


Tips:当然,与S12(X)系列MCU的NVM加密一样,Qorivva MPC56xx系列MCU的加密(审查(Censorship)机制)针对的也仅是外部调试器或者BAM上位机软件对MCU片内NVM的访问权限,其并不影响MCU中运行的用户程序对片上NVM的正常访问。


2. Qorivva MPC56xx系列MCU的Shadow Flash与加密配置


Qorivva MPC56xx系列MCU的加密配置由位于地址0x203DE0~0x203DE7的非易失系统审查控制寄存器NVSCC0~1以及位于地址0x203DD8~0x203DDF的非易失审查私钥寄存器NVPW0~1共同完成,下图为MPC5604B的Shadow Flash扇区结构:

10.jpg

 


Tips:NVSCC0~1和NVPW0~1都位于Qorivva MPC56xx系列MCU的Shadow Flash中,其独立于用于存储用户程序和代码的Code Flash和Data Flash,其编程所使用的算法也不一样,从而防止了用户在编程应用程序时意外修改MCU的加密配置,保证了系统的可靠性和安全性;


2.1 非易失系统加密寄存器--NVSCC0和NVSCC1


这两个寄存器用于定义加密配置,工厂出厂测试后,默认关闭加密的值如下:


NVSCC0 = 0x55AA_55AA;

NVSCC1 = 0x55AA_55AA;


每个寄存器的32-bit被分为高低两个16-bit,高16-bit用于控制串行引导模式加密(SC-Field, Serial boot mode Censorship),而低16-bit用于控制Flash引导启动加密(CW-field).


Tips:如果影子Flash(Shadow Flash)被擦除,而且NVSCC0和NVSCC1未被重新编程为正确值,那么该MCU将被永久加密而无法访问,处于此状态的MCU将不可被调试或者重新编程,即成为“砖头”,彻底报废掉!


2.2 Qorivva MPC56xx系列MCU加密秘钥寄存器NVPWD1和NVPWD01


NVPWD1和NVPWD01两个私钥寄存器组合形成一个64-bit的秘钥,MCU出厂测试后其默认的值如下,是固定公开的,故也称作公钥:


NVPWD0 = 0xFEED_FACE;

NVPWD1 = 0xCAFE_BEEF;


这也就意味着,即使用户通过修改加密控制寄存器加密了Flash,如果未修改NVPWD1和NVPWD01这两个寄存器的值,也可以通过以上默认私钥0xFEED_FACE_CAFE_BEEF解密该MCU。


Tips:配置以上加密私钥寄存器时,每个半字(16-bit)必须包含至少一个1和1个0,下表列举了一些合法和非法的秘钥配置:

11.jpg

 


即使存储在Flash中或者在引导过程中提供的秘钥不符合以上规则,未加密的MCU也可以通过串行启动模式(Serial Boot Mode)从LINFlex0或者FlexCAN0下载代码到内部SRAM中。


3. Qorivva MPC56xx系列MCU的加密配置规则


对Qorivva MPC56xx系列MCU进行加密配置时, 首先需要定义一个符合秘钥规则的正确64-bit秘钥;这个64-bit秘钥是加密能否实现的关键所在,其需要满足上面2.2小节所介绍的秘钥配置规则--每个半字(16-bit)必须包含至少一个1和1个0。


其次,用户需要按照下表和流程图,决定所需的加密等级并配置寄存器NVSCC0和NVSCC1;

 

12.jpg

其中红色区域的配置会造成芯片死锁,无法解密恢复,所以需要避免。

为了通过私密实现Flash加密,用户需要修改NVSCC0和NVSCC1寄存器,让NVSCC0=NVSCC1,但其低16-bit的CW field不等于0x55AA;这样加密之后,可以通过输入正确的私钥解密,然后从串行引导模式或者Flash引导模式启动MCU;


Tips:如果NVSCC0和NVSCC1不一致或者NVSCC0和NVSCC1被置为非0x55AA的值,则MCU将被永久加密而无法恢复;


4. 具体应用工程中的加密配置实现


第一步、在任意C源文件中添加以下秘钥和加密配置定义:


①使用以下配置使能Flash加密,并将秘钥配置为0x89ABCDEF01234567,加密控制寄存器NVSCC0=NVSCC1=0x55AA1234:

 

13.jpg

②若使用以下配置则可以将芯片恢复为出厂配置,解密状态且并将秘钥配置为公钥0xFEEDFACECAFEBEEF,加密控制寄存器NVSCC0=NVSCC1=0x55AA55AA:

14.jpg

 


第二步、配置应用工程链接文件


在应用工程链接文件中的存储器分区MEMORY{}中添加如下Shadow Flash加密秘钥和加密控制寄存器配置分区:


/*the shadow Flash used to store the 64-bit Nonvolatile Private Censorship PassWord 0–1 registers configuration*/

   shadow_flash_NVPWD:    org = 0x203DD8,   len = 8

   /*the shadow Flash used to store the 64-bit Nonvolatile System Censorship Control 0–1 registers configuration*/

   shadow_flash_NVSCC:    org = 0x203DE0,   len = 8


在应用工程链接文件中的存储器分区SECTIONS{}中添加如下Shadow Flash加密秘钥和加密控制寄存器配置值放置段,使用关键词KEEP()以保留其未使用段:


.__NVPWD_Config LOAD (ADDR(shadow_flash_NVPWD)): { KEEP(*(.__NVPWD_Config)) } > shadow_flash_NVPWD

   .__NVSCC_Config LOAD (ADDR(shadow_flash_NVSCC)): { KEEP(*(.__NVSCC_Config)) } > shadow_flash_NVSCC


第三步、编译链接应用工程,生成Shadow Flash秘钥配置S19文件

15.jpg

15.jpg

 

 


第四步、选择目标MCU的Shadow Flash算法文件,下载elf:


有两种方法可以实现对MPC56xx系列MCU的Shadow Flash的编程;


①使用CodeWarrior 10.6 IDE + U-Multilink调试器


首先,使用默认配置,把用户自己的应用工程编译结果下载到Flash中,若有Data-Flash数据或者外部QSPI Flash数据(比如MPC5606S),需要下载2次,并手动选择Data-Flash算法文件或者外部QSPI Flash算法;

具体方法和步骤请参考我之前的文章《CodeWarrior IDE使用Tips之Qorivva MPC56xx新建应用工程选项、调试高级选项及下载过程控脚本详解

最后,按照下图选择目标MCU的Shadow Flash算法文件,进行下载,以将以上用户配置的加密配置和秘钥下载到Shadow Flash中:

 

16.jpg

Tips:默认CodeWarrior 10.6 IDE安装时,并不会安装Qorivva MPC56xx系列MCU的Shadow Flash算法,仅在CodeWarrior 2.10 IDE和Cyclone离线编程器上位机软件的安装目录下提供:

17.jpg

如果你未安装CodeWarrior 2.10 IDE和Cyclone离线编程器上位机软件,可以在本文最后提供的百度云盘分享链接下载。


在未选择目标MCU的Shadow Flash算法文件进行下载之前,可以在CodeWarrior 10.6的调试界面的Memory窗口中,输入地址0x203DD8,查看到默认的Shadow Flash出厂加密配置如下图:

 


18.jpg

而在选择目标MCU的Shadow Flash算法文件进行下载之后,在CodeWarrior 10.6的调试界面的Memory窗口中,输入地址0x203DD8,查看编程结果如下图,此时Shadow Flash已经编程成功为使能加密,且秘钥为0x89ABCDEF-01234567:

 

19.jpg


②使用Cyclone离线Flash编程器


一方面,上面介绍的CodeWarrior 10.6 + Multilink通过debug下载程序的方式对Shadow Flash进行编程的方式时一种低成本的方案,可以方便大家学习和掌握MPC56xx系列MCU的加密配置,但是其实现流程十分繁琐,不便于操作;另一方面,对NVM的加密往往是量产阶段才需要配置的,在产品开发阶段使能加密需要不断的解密从而影响项目进度,而且没有必要。所以我们推荐的Shadow Flash编程方法是使用Cyclone离线编程器--Cyclone MAX或者Cyclone Universal(FX)。


其步骤如下:


首先,分割应用工程S19文件为独立的NVM编程S19文件


将上面第四步生成的应用工程S19文件(默认为<project name>.mot,将其后缀改为.s19后即可使用)按照具体MCU的NVM资源地址映射,将其s19文件分割,成独立的Code Flash编程S19文件、Data Flash编程S19文件(若存在Data Flash编程数据)、ShadowFlash编程S19文件(需要加密配置)和QSPI Flash编程S19文件(如果需要,比如MPC5606S/5645S或者Halo-MAC57D5xx);

本文使用的示例工程中只有MPC5604B的CodeFlash数据和存储在Shadow Flash的NVM加密配置,故只需将其分割为两个独立的S19文件即可:

 


20.jpg

然后,配置SAP文件,加载对应的Flash算法和S19编程文件


打开Cyclone Universal的离线编程文件SAP文件配置工具--Cyclone Image Creation Utility(该上位机软件需要用户自己下载安装);


使用脚本向导(Lanunch Script Wizard)先加载Code Flash的算法和Code Flash的S19编程文件,然后在手动添加其他Flash的编程文件(CM)和S19文件(SS)以及非空擦除(EN)、模块编程(PM)和CRC校验(VC)命令脚本,并配置解密使用64-bit公钥,Cyclone 继电器控制目标MCU供电并在编程完成中将JTAG接口的RESET管脚拉低以避免Flash编程过程中的EOS和ESD:

 

21.jpg

最后,将SAP文件保存在硬盘并加载到Cyclone离线编程器中


在完成了以上配置之后,通过USB连接Cyclone Universal编程器到PC,并点击上面截图界面中的Save Image to: Cyclone & Disk-->在弹出的Cyclone控制GUI界面中,选择连接的Cyclone编程器端口-->Connect,确认需要加载SAP文件之后,选择Apply Changes,即可将SAP文件加载到Cyclone Universal编程器中:

 

22.jpg

加载成功后,在Cyclone Universal编程器的人机界面上就能够看到最新加载的SAP文件,按下右下角的Start按键,即可开始编程了:

 

23.jpg

Tips:按照Cyclone Universal编程器背面的继电器供电管理方案配置为使用Cyclone内部电源通过JTAG编程接口供电(Internal Power-->Target Power Pin):

24.jpg

 

将电源配置跳线设置为:Jumper 1,2,3短接,而Jumper 4断开:

 


25.jpg

这样,就可以直接通过Cyclone Universal对MPC5604B进行编程了,无需给目标MCU外部供电;


第五步、断电重启MCU,通过POR上电复位让加密配置生效


虽然完成了以上四个步骤,但此时JTAG还是可以链接,并正常调试的(包括复位,或者重新下载elf到Code-Flash/Data-Flash/Shadow-Flash),必须将目标MCU断电重启之后,也就是发生POR上电复位之后,Flash加密才会生效。


此时,用户通过JTAG接口在连接ebug目标MCU时,使用默认的公钥--0xFEEDFACECAFEBEEF已经无法连接了,


26.jpg

 

 

27.jpg

需要修改为配置的私钥--0x89ABCDEF01234567才能对目标MCU进行解密和连接,故加密成功:

28.jpg

 

 

29.jpg

5. Qorivva MPC56xx系列MCU的复位启动过程和Flash解密流程


Qorivva MPC56xx系列MCU每次POR复位之后都会自动运行BAM,检查外部管脚FABM和ABS的状态,从而判断启动模式。如下图所示,如果FABM管脚为高电平,则进一步判断ABS管脚:若为低电平,则从LINFlex0串行引导启动;若为高电平,则从FlexCAN0串行引导启动;如果FABM管脚为低电平,则检查Flash中的启动扇区(boot sector)中的RCHW中是否存在合法的启动ID(boot ID):若存在,则从该扇区开始启动(应用程序开始地址--复位向量位于合法启动扇区的开始地址偏移4个字节的位置);若不存在合法的boot ID,则芯片进入静态模式(Static Mode,死机模式,不允许任何程序):

 

30.jpg

5.1 Qorivva MPC56xx系列MCU的引导启动模式选择


在Qorivva MPC56xx系列MCU中,有两个外部引脚FAB(Force Alternate Boot mode,强制备选引导模式)和ABS(Alternate Boot Select,串行引导模式选择),其状态在每次MCU复位时被锁定读取用于决定MCU是从Flash引导启动还是常数通过FlexCAN或者LINFlex下载程序引导;


FAB和ABS引脚状态与MCU引导启动模式选择的关系如下表:

31.jpg

 


Tips:默认MCU复位之后,FAB引脚有内部弱下拉,而ABS引脚为内部弱上拉,即保证这两个管脚外部悬空时,FAB=0,ABS=1,MCU从Flash引导启动,而FAB和ABS引脚往往还与其他功能复用,因此在进行Qorivva MPC56xx系列MCU的硬件电路设计时,必须保证在任何复位过程中这两个引脚处于你所想要的引导模式配置状态;


比如在MPC5604B中, FAB引脚就与SIUL和EMIOS_0模块复用,而ABS引脚则与SIUL、EMIOS_0以及LINFlex_3等模块功能复用:

 

32.jpg

以上读取FAB和ABS引脚状态的过程通常由Qorivva MPC56xx系列MCU的SSCM(System Status and Configuration Module--系统状态与配置模块 )硬件模块通过以下流程实现:

 

33.jpg

然后,MCU运行芯片出厂时固化的BAM代码以判断具体的引导启动模式:

BAM代码驻留在地址0xFFFF_C000开始预留的8KB ROM存储器映射空间中;

如果进入串行引导模式,BAM运行时下载代码的基地址为0x4000_0100开始的SRAM空间:

34.jpg

 


BAM代码执行的流程逻辑如下:

 

35.jpg

5. 2 Flash存储器引导启动


为了成功地从Qorivva MPC56xx系列MCU的 Flash存储器引导启动,必须在MCU规定的Flash引导扇区(boot sector)之一中编程2个32-bit的入口,Qorivva MPC56xx系列MCU的引导扇区结构如下,这2个32-bit入口包括如下信息:


A. 16-bit的复位配置半字(RCHW),由合法的引导ID(BOOT_ID =0x5A)标识该扇区是否为正确且可引导的扇区;

 

36.jpg

B .32-bit的复位向量(用户代码的开始地址,也即入口函数_Start()地址)

37.jpg

 


Flash引导启动模式下,MCU的加密和解密控制流程如下:

38.jpg

 


5.3 串行引导启动模式(基于BAM的默认固化bootloader)


若在复位时将MCU的FAB引脚拉倒高电平(FAB=1),则MCU进入串行引导启动模式。具体选择FlexCAN0(ABS=1)还是LINFlex0(ABS=0)作为通信接口则取决于ABS引脚的状态。


串行引导启动模式下,Qorivva MPC56xx系列MCU的串口通信(LINFlex0和FlexCAN0)波特率取决于外部晶振的频率:

 

39.jpg

BAM串行引导启动模式下,MCU与上位机软件通信协议具体如下:


A.下载并执行新程序


从顶层看,BAM串行引导启动模式下,MCU与上位机软件通信的程序下载流程如下:


1. 上位机发送消息并接受确认是否使能自动波特率(可选);

2. 发送64-bit秘钥;

3. 发送开始地址、下载代码大小(以字节计算)和是否为VLE指令程序;

 

4.下载代码/数据;

5.从起始地址执行代码;

40.jpg

Tips:以上每一步的执行都必须保证:开始下一步之前,上一步已经完成。以上通信以半双工方式进行:


1. 上位机发送数据到MCU并等待;

2. MCU应答数据已经收到;

3. MCU进行数据验证如果回答正确:

    --如果数据正确,上位机可以继续发送数据;

    --如果数据不正确,上位机停止发送,MCU需要复位重启;

多字节数据按照高位优先(MSB)方式发送。


B.下载64-bit秘钥并检查秘钥


MCU通过BAM接收到的第一个64-bit数据将被当做秘钥,发送到秘钥检查程序以验证其正确与否:


秘钥检查的流程图如下:

41.jpg

 


如果Flash为公开访问状态(默认),接收到的秘钥将与公共秘钥0xFEED_FACE_CAFE_BEEF进行比较;而如果Flash不能被公开访问,但是也没有加密,则接收到的秘钥将于保存在NVPWD0 和NVPWD1寄存器中的值进行比较;此时,秘钥的比较都由BAM程序完成,如果失败,则BAM将MCU置于静态模式;


钥匙Flash不能被公开访问而且处于加密状态,接收到的秘钥将被写入到PWCMPH和PWCMPL寄存器,等待固定的时间后,将有SSCM模块硬件进行比较并更新结果到SSCM_STATUS的SEC位, 接着BAM程序再次检查SSCM_STATUS的SEC标志位:


SEC= 0: Flash已经被解密,BAM程序继续执行;

SEC= 1: Flash依然处于加密状态因为秘钥错误,BAM程序将MCU置于静态模式;


此处固定的等待时间取决于外部晶振频率,若外部为12MHz时钟时,固定时间为350ms。


Tips:MPC560xx系列MCU的SSCM(System Status and Configuration Module--系统状态与配置模块 )的PWCMPH和PWCMPL寄存器定义如下,其用于验证加密秘钥:

42.jpg

 

为了成功解密芯片,秘钥(password)必须按照如下序列写入以上寄存器:先写入秘钥的高32-bit到PWCMPH寄存器,在将秘钥的低32-bit写入PWCMPL寄存器。这样SSCM模块就会自动比较秘钥,如果正确,则芯片解密。


总结一下,进入串行引导启动模式后(FAB=1),Qorivva MPC56xx系列MCU的加密和解密控制流程如下:

 

43.jpg

Tips:在BAM允许时,Qorivva MPC56xx系列MCU的SWT看门狗时默认关闭的,所以若在BAM期间发生意外,将有可能导致CPU挂掉(stalled),此时需要外部复位才可恢复。


5.4  Qorivva MPC56xx系列MCU的Flash解密方法


从前面的介绍控制, 加密后,为了解密Flash,必须通过JTAG调试接口或者串行通信接口给BAM模块提供正确的秘钥(password),从而恢复调试接口对MCU片上资源或者BAM对片上NVM资源的访问权限。


第①种、通过JTAG调试接口提供64-bit秘钥解密


用户可以通过CodeWarrior 10.6启动调试过程中,通信失败时弹出的秘钥输入窗口输入正确64-bit秘钥,对MCU解密,进而重新下载应用程序并进入调试模式:

 

44.jpg

另外一种通过JTAG调试接口提供64-bit秘钥的方法是,在配置生成Cyclone离线Flash编程器编程镜像SAP文件时,使能加密设置(Security Settings-->Device supports uncensoring):


①Cyclone MAX 离线编程镜像SAP配置解密界面:

45.jpg

 

②Cyclone Universal/FX离线编程镜像SAP配置解密界面:

46.jpg

若已经将MCU加密使能,且秘钥设置为0x89ABCDEF01234567,则解密配置如下:

47.jpg

Tips:以上解密都是临时的,在下一次POR复位之后,依然需要输入秘钥才能解密。为了彻底解密MCU,需要将使用如下配置编译生成NVPWD0/1和NVSCC1的默认配置,并加载Shadow Flash算法,将Shadow Flash重新编程为默认出厂解密状态才行:

48.jpg


第②种、配置进入串行引导启动模式,通过串行通信接口提供64-bit秘钥解密


第二种解密的途径是,配置MCU的FAB引脚为高电平(FAB=1),使其进入串行引导启动模式,然后通过NXP官网提供的RAppID Boot Loader Utility软件,设置使能BAM,下载符合BAM串行通信协议的bootloader,并配置正确的解密秘钥即可:

49.jpg


Tips:RAppID Boot Loader Utility软件可以在NXP官网上免费下载(下载链接如下):

https://www.nxp.com/support/developer-resources/run-time-software/rappid-initialization-for-power-architecture:RAPPID?tab=Design_Tools_Tab

50.jpg


关于RAppID Boot Loader Utility软件的具体使用方法请参考其用户手册,通过其菜单Help-->User Manual即可打开:

51.jpg


Tips:由于默认RAppID Boot Loader Utility软件自带的BAM串行通信bootloader不包含Shadow Flash的驱动,因此无法对Shadow Flash进行编程,因此,也不能通过其永久解密MCU(无法将Shadow Flash中的加密配置重新编程为默认出厂解密状态)


总结


本文对Qorivva MPC56xx系列MCU的Flash加密解密原理和工程实现方法进行了全面系统的介绍,其加解密实现的关键是按照Censorship秘钥配置规则对MCU Shadow Flash的编程;解密实现可以通过JTAG调试口或者配置FAB=1,使MCU进入串行引导启动模式(SBL)通过BAM串行通信接口提供64-bit的解密秘钥,要永久解密需要将Shadow Flash中的加密配置重新编程为默认出厂解密状态。


Qorivva MPC57xx系列和S32R系列MCU的Flash加密较MPC56xx更加复杂,其通过UTEST Flash中存储的256-bit秘钥和DCF配置实现,具体我将在接下来的公众号文章中为大家详解介绍,敬请关注!


最后,我将本文介绍使用的MPC5604B测试工程和最新的NXP Qorivva MPC56xx系列MCU的Shadow Flash算法文件分享到百度云盘,供大家参考学习:

52.jpg

链接:https://pan.baidu.com/s/1fdnoTOdsYZ3U6MHt4n6Jug

密码:1fsg

胡恩伟

NXP汽车电子FAE

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

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