前言
NVM是非易失性存储器(Non Volatile Memory)的简称,在这里是指MCU的内部Flash。本文首先介绍了MCU的整个memory map的分布,接着介绍NVM子系统(主要指如何访问Flash),然后介绍PFlash/DFlash的特性,分布,Flash命令等内容,最后介绍了SOTA和AB swap实现原理以及各个UCB的作用。
正文
1.Overview
TC3xx芯片最多有6个内核,每个核有自己的私有的Memory以及共有的Memory。
私有的:PSPR, DSPR, PCache, DCache, DLMU, LPB。PSPR主要用来运行RAM Code,比如说有些代码要放到RAM里面运行。DSPR主要当成SRAM来用,比如用来存放全局变量。每个内核可以通过私有的SPB总线访问自己私有的3M的Local PFlash Bank。
共有的:
其他核可以通过SRI总线访问其他核的私有Memory。
带Cache的PFLASH的地址从0x80000000开始,不带Cache的PFLASH的地址从0xA0000000开始。
不管是0x80000000还是0xA0000000他们在物理上映射到的地址都是一样的,使用0x80000000访问就会经过Cache,0xA0000000不用经过Cache。
DFlash 0和DFLash 1可以当作模拟EEPROM来用,其中DFash1可以被HSM访问,也就是说DFLASH1可以被HSM当成模拟的EEPROM来用。0xAFE00000到0xAFFFFFFF可以用来外扩FLASH时使用。
0x90000000开始是经过DCache访问核外部Ram的地址,0xB0000000是不经过DCache访问核外部Ram的地址。二者最终访问的物理地址就是0xB0000000开始的核外部Ram。
2.NVM Sub-system
DMU提供操作Flash的接口,每个CPU通过PFI总线访问Local Flash。
Prefetch Path指的是我们可以从Flash里面预取一部分指令放到Flash Prefetch Buffer里面,提高程序的运行速度。
Demand Path没有预取指令功能,通过具体地址去Flash取某一行指令,
不管是Prefetch Path还是Demand Path,在取指的时候都会有Ecc的自动纠错功能,比如我们从Flash取数据出来,中间有一位有错误,经过Ecc的自动纠错功能能把这一位给纠正过来。
DMU是操作Flash的接口部分,它有两个接口,一个是Host Command接口,一个是HSM Command接口,Host接口主要给Tricore用的,HSM接口主要给HSM操作DFlash1的时候用的。
3.PFlash和DFlash
Flash主要用来存储和运行代码的,TC3xx里面的所有Flash的Sector都是16K(Logic Sector),128个Logic Sector组成一个1M的Physical Sector。PFlash出来用来存放主核运行的代码外,还可以用来存放HSM运行的代码以及TP Code,TP Code存放在Flash,SSW启动程序里面可以调用这些TP Code。
Flash的操作都按页作为单位的,PFlash一页是32个Byte,DFlash一页是8个Byte。Write Burst指令可以一次操作8个Page。
TC2xx和TC3xx的Flash的比较。
AURIX 2G相对于AURIX 1G的主要变化点。
4.SOTA & AB SWAP
当SOTA功能激活时,PFLash被划分为两部分,一部分用来存储可执行代码(active bank),另一部分可用来读取和写入(inactive bank)。当APP更新完毕后,两个部分互换,即切换上面两种地址映射方式。在标准模式下使用PF0-1和PF4作为active bank,在Alternate模式下使用PF2-3和PF5作为active bank,就可以实现在A和B分区中写入完全相同的APP程序,以相同的地址进行运行。
需要注意的是,所有NVM操作都是通过DMU使用PFLASH的物理系统地址执行的,也就是说,NVM操作总是使用标准的地址映射,而不管选择使用哪种地址映射。“NVM操作”是一个术语,用于任何针对FLASH的命令,如程序、擦除等,但不包括读取和执行代码。
有关SOTA地址映射的参数在Flash中的UCB(User Configuration Block)中进行配置,在UCB中配置后,只有当下次MCU复位的时候才会更新配置。
AB SWAP是TC3xx新增加的功能,主要给Software update over the air (OTA)用的。
简单来讲,TC3xx里面的Flash我们可以简单的分为Bank A和Bank B,在Bank A运行程序的时候我们可以同步的去擦写Bank B,也就是说Bank A和Bank B是完全独立的,这样在应用程序运行的时候也能同步的更新应用程序。
所谓的AB Swap也就是等更新完了程序之后,可以在UCB里面修改Swap mode,程序复位后新的程序就会运行。这样的好处就是不需要bootloader也可以在线更新程序,并且在线更新程序的时候不影响当前程序的执行的。
TC3xx中Flash最大为16M,其中的7M是支持SWAP功能的。
A Bank分为A0, A1, A2
B Bank分为B0, B1, B2
在Standard模式下,程序是从A Bank开始运行的,也就是A0, A1, A2是Active Bank,当A Bank运行的时候需要程序更新,程序更新到B Bank,更新完后切换到B Bank,程序从B Bank开始运行。
没有使能AB Swap功能时,A0, A1, A2和B0, B1, B2是CPU0-5的Local Flash,CPU可以通过私有的总线访问Local Flash(速度更快),使能了AB Swap之后,CPU不能使用私有总线访问Local Flash了(速度下降),需要使用外部的SRI总线访问Flash。
TC397有7M空间可以进行AB Swap,Tx377是3M。
如果使用HSM,则在进行SWAP只想,HSM的代码也需要下载到inactive Bank里面,防止芯片锁死。
不管是Standard模式还是Alternate模式,程序的执行都是从0x80000000开始的,也就是说下载一个新的程序到B Bank,这个程序本身的地址是不需要变的,原来是0x80000000开始现在也是从0x80000000开始。
不管是Standard还是Alternate模式,在操作Flash的时候,传入的参数都必须是绝对地址。如果是从Flash里面读取数据,则需要使用相对地址。
程序在A Bank运行时,接收到新的应用程序Program到B Bank以后,接下来需要配置新的UCB_SWAP,最多可以配置16条SWAP Mode,一般来说在设置一条新的SWAP Mode以后需要把前面一条的SWAP Mode给Invalid掉。
初始化状态是使用标准地址映射,此时SOTA模式未启用。按以下步骤启用SOTA:
① 用烧写器把APP烧写进PFlash的组A地址处。
② 向MARKERL0写入0x00000055。
③ 向MARKERH0写入MARKERL0的系统地址。
④ 向CONFERMATIONL0写入0x57B5327F。
⑤ 向CONFERMATIONH0写入CONFERMATIONL0的系统地址。
⑥ 将UCB_OTP0中SWAPEN标志位置为Enable。
⑦ 重启MCU。
经过上面的步骤,就事MCU进入了SOTA模式,其中步骤②-⑤是为了启用标准地址映射。手册中给了如下的流程图供参考:
上面说的是第一次启用SOTA时的配置,下面我们就来看一下SOTA启用后,进行APP更新的步骤:
① 将新的APP写入PFlash中未激活的部分,即上文提到的Inactive Bank,并进行准确性校验。
② 如果新的APP被写入组B,则向MARKERLx.SWAP写入0x000000AA,启用Alternate地址映射模式;如果新的APP被写入组A,则向MARKERLx.SWAP写入0x00000055,启用标准地址映射模式。(x是0-15的值,从0开始向上递增,由上文可知UCB_SWAP最多能存储16组标志值,存满后再擦除重新写入。)
③ MARKERHx.ADDR、CONFIRMATIONLx.CODE和CONFIRMATIONHx.ADDR配置同上文。
④ 向CONFIRMATIONL(x-1).CODE再次写入0xFFFFFFFF,来使上一组UCB_SWAP值失效。向PFlash再次写入全1的值不会导致PFlash操作错误。
手册中给了下面这个流程图供参考:
5.UCB
参考:TC3xx芯片的UCB详解
UCB里面如果带Password,即使UCB已经Confirm了,还是可以通过输入Password擦写UCB。如果是不带Password的UCB,如果UCB配置成Confirm了,那这个UCB就无法改写了。
对于有些UCB是不可以被擦掉或者有ECC的Error,如果这个UCB被擦除或者含有ECC的Error,这个芯片可能就会被锁死。
UCB_BMHD的BMI,BMHDID,STAD,CRCCBMHD,CRCBMHD_N这5个位域不能有Uncorrectable ECC Error,否则芯片就会锁死。所以在不能在操作UCB_BMHD的时候突然掉电,或者没有擦除已有的BMHD就去写BMHD。
UCB的Confirmation Code中UNLOCKED和CONFIRMED是合法的,ERASED和ERRORED状态是Error状态。所有的UCB在出场的时候都是处于UNLOCKED状态的,在UNLOCKED状态时所有的UCB内容都是可以读出来的,包括Password。UCB在CONFIRMED状态时,除了Password其他都是可以读出来的。
UCB_BMHD主要是用来设置程序的启动地址的。UCB_BMHD_COPY主要起到一个备份的作用,比如在擦除UCB_BMHD_ORIN的时候突然掉电,导致UCB_BMHD_ORIN变成Error状态,这个时候就可以读取UCB_BMHD_COPY的内容。
BMHD0中Password是被BMHD1-3所共享的,也就是说BMHD1-3被设为Confirmed后需要通过BMHD0的Password调用disable protection去解锁其他BMHD1-3。
BMHD被写保护的条件有两个:
1.UCB_BMHDx的Confirmation状态处于CONFIRMED状态,并且Disable Protection没有被激活(通过加载UCB_BMHD0中的Password)。
2.UCB_BMHDx的confirmation状态是ERRORED。
UCB_PFLASH主要用来设置PFLASH的读写保护。PFLASH的读保护是全局的(只有一个配置项),写保护是每个Sector都能进行单独设置的,如果PFLASH读保护了,相当于也是写保护了(不让读,肯定就不能写了)。
UCB_DFLASH主要用来配置DFLASH0的模式,Single Ended Sensing还是Complement Sensing。配置RAM是否在Power On Reset后是否进行清零,以及选择那几块RAM进行清零。
UCB_SWAP主要用来配置SWAP模式的。
所有UCB的擦写是有次数限制的,这个擦写的限制是保证UCB中数据可以保存20年。在数据保存20年的前提下,对每一个UCB的擦写次数是100次,对所有UCB的擦写次数总共是500次。
审核编辑:刘清
评论
查看更多