前言
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次。
交流电机和直流电机的区别
干货:加湿器 CE 整改案例分享
物联网加持后煤炭时代 数字货舱一个会说话的箱子
机场综合监控系统的结构组成和方案应用
hdmi转dvi是双向的吗_hdmi转dvi显示器黑屏
AURIX™ TC3xx NVM是非易失性存储器学习笔记
最佳开源模型刷新多项SOTA,首次超越Mixtral Instruct!「开源版GPT-4」家族迎来大爆发
测力传感器的工作流程
防水透气膜和隔汽膜的比较,它们之间有什么区别
中立格林发布新款传感器模块_应用于空气质量监测仪
联想Z6评测 是中端产品线中的扛鼎之作
基于单片机和红外遥控技术实现通用多址遥控系统的设计
我国为什么要发射自己的二氧化碳监测卫星
RC和RCD缓冲电路的工作方式、区别和优缺点?
现代化万能试验机的新特点和应用
tvs二极管选型与二极管电路分析
A-10战机GAU-8机炮有多强?酒瓶差不多的子弹将坦克打成筛子
Infineon IRS2982多种开关电源(SMPS)解决方案
瑞萨电子推出能处理多个摄像头图像数据的全新RZ/V2MA器件
薄壁件切削加工中几个方面的正确选择