英飞凌TC3xx-Overlay机制
今天说要开个专栏讲讲XCP标定,但在将标定之前,先把英飞凌专门为标定功能设计overlay功能讲解清楚。
英飞凌的overlay全称叫做Data Access Overlay,其作用是 redirect selected data access to the OVERLAY memory(意味着通过overlay memory来访问数据?)对于Trcicore系列来说,通过CPU访问PFlash、Online Data Acquisition space或者EBU可以被重定向;OVERLAY memory可以分配到Local memory、Emulation Memory或者DPSR/PSPR。
Overlay功能可以在程序运行时在线实时修改标定参数(这些参数通常存放在Flash中)。注意,overlay仅对数据访问有效;且Overlay机制是针对CPU对数据的访问重定向,一定要注意这点。
1.数据访问重定向
我们首先来看overlay原理图。
对于一个overlay block有三个非常重要的参数:
Target Base Address --需要被重定向的目标起始地址(一般为Flash);
Block Size -- 需要被重定向的块大小;
Redirection Base Address -- 重定向块的起始地址(一般为RAM);
对于这三个参数,都有相应的寄存器来配置:
Target Base Address -- OTARx;
Block Size -- OMASKx;
Redirection Base Address -- RABRx
根据芯片手册,TC3xx有32个block用于overlay功能,且size可配置(32byte~128KB)。
2.寄存器说明
OTARx(i=0-31)
OMASKi(i=0~31)
RABRi(i= 0~31)
OVEN--Overlay 使能
OMEM -- 选取overlay memory
OBASE -- Overlay memory基地址
OVCENABLE
OVCCON
Overlay control register,用于控制某个核的overlay功能
3.Overlay功能配置
3.1 确认用于重定向的CPU
OVCCON.CSEL0 = 1,因为每个CPU都有至少32个可重定向的block,因此这里我们选取block0用于定向到CPU0DSPR,CPU0_OSEL.SHOVEN0=1
3.2 配置重定向Block大小
Block大小为128byte,那么根据芯片手册,配置为0的为有效位,因此根据公式计算2^n * 32 = 128 ,得出n=2,也即OMASK 位域 = 0x 1111 1111 1100 (0xFFC)
OMASKi.OMASK = 0xFFC,OMASK.U = 0x0FFFFF800
3.3 配置目标地址和重定向地址
目标地址寄存器为OTAR,重定向寄存器为RABR,该寄存器配置的难点在于:RABR.OBASE仅有17bit,OTAR.TBASE仅有23bit,如何把目标地址和重定向地址放进去?就需要参考下图:
再来回顾 PF地址0x80001000,DSPR 0x70011000,OMASK 0x0FFFF800。
首先我们来看,Destination有两种来源,一种是Original Address,一种是redirected;那么根据实际情况来看,什么时候选择原始地址,什么时候选择重定向地址,很明显要看左边比较的结果。
根据芯片手册,需要A和TBASE所有参与比较的bit都相同,才会使用重映射地址;参考下图:
源地址绿色部分(bit27:bit7)会参与地址比较,也即OTAR要装绿色部分一样的数据才会使用重映射地址;很明显,要比较的位域位置一样,因此要填到TBASE的值就为Target >> 5。
OTAR - 0x00001000
那么RABR寄存器该如何配置;
我们知道,要定向的ram地址为0x70011000 = Base1+Base2+offset
其中Base1 = b1000 0000 00,Offset = b00000
很明显,需要把绿色部分填进OBASE,因此也是重定向地址 >>5,
故RABR = 0x80011000
配置完成后,来看结果
4.结果验证
Overlay是针对CPU的,由于debug是走bypass功能,因此如果直接去memory看overlay flash值,必定还是原flash的值。因此在代码上做如下工作:
首先在0x70011000 定义一个数组Test_Map_Cal_Ram,值如下:
在0x80001000(flash)定义一个数组Test_Map_Cal_Flash,值如下:
上电时,我们首先看Test_Algo_Update,此时应该为0
Flash值为:
Ram值为:
现在开启overlay功能,
要达到的效果为:通过cpu0读取flash的值,但实际上应该读的是ram的值,如下:
Debug看,确实是通过访问flash实际读取的ram的值
从上图就可以看出,CPU0把数组Test_Map_Cal_Flash赋给了数组Update,如果overlay功能没有奏效,那这个时候应该Update = {0,1,2,3....};
但实际上我们可以看到Update = {20,21,22....},说明CPU0是把Cal_Ram的值赋给了Update,overlay奏效了。
5.小结
通过上面验证,我们就可以用这个功能来做标定啦;标定量A存在PFlash地址0x80004000,使用overlay时,上位机就直接download 该变量的flash地址即可完成标定,不用再做flash和ram的映射了,特别是当有多块标定数据要做标定时,这个功能简直丝滑。