本篇文章是在介绍学习AutoSAR基础软件中XCP模块之前的必备基础内容,包括A2L文件以及英飞凌Overlay功能详解。在介绍A2L文件的时候,文章首先介绍了A2L文件的由来以及其组成,并提供了一个A2L文件示例帮助读者更好的理解A2L文件包含的内容;然后,又介绍了英飞凌TC3xx提供的Overlay功能,文章从功能寄存器讲起,并依据实际的Overlay功能实现代码帮助读者更好的理解Overlay功能实现。
目录
A2L文件
A2L文件遵循ASAM MCD-2 MC标准 (ASAP-2)。为了实现对应用系统进行测量、标定和诊断,ASAP工作组根据MCD(Measurement,Calibration and Diagnostics)模型将该标准分成ASAP-1、ASAP-2和ASAP-3三个子标准,ASAP-2定义了MCD系统需要使用到的数据库,就是我们常说的A2L文件,用来描述ECU内部数据。下图为三层系统的的总览接口图。
想要实现CCP/XCP测量与标定的功能,需要A2L文件的辅助,它定义了测量标定过程中,上位机与ECU之间通信所需的信息,包括了设备参数信息、接口数据信息和ECU内部的数据信息(数据存储的地址,数据长度、数据类型等)。
- 设备参数信息:描述了ECU的基本信息和ECU数据单元的一些公共属性。
- 通信接口信息:描述了标定系统与ECU通信时所需配置的通信接口信息。
- ECU 参数信息:描述了ECU内部数据单元的详细内容。
A2L文件组成
一个A2L文件只能对应一个项目工程,其中至少包含一个MODUL用于存放标定测量所需的信息,A2L的注释方法与C语言相同(//或者/* */)。A2L文件由多种不同名称定义的信息块组成,它们可以分为以下两类:
- 第一类信息会在ECU与CCP确定交互方案后得到固化,例如HEADER、MOD_PAR、MOD_COMMON等信息块中的信息。
- 第二类信息在ECU软件做出调整后(标定观测量发生变化之后),已有的标定变量和监控变量的地址,变量名称都可能发生改变,例如CHARACTERISTIC、MEASUREMENT等关键字中的信息。
在ECU软件做出调整后,CHARACTERISTIC和MEASUREMENT中变量的地址信息更都可能会做出边度,每次应用层软件修改后,都会重新编译,使得这部分信息更新,需要从编译生成的map文件中找到相应的变量名称与地址信息,手动的更改A2L文件,才能与当前的软件相配置,进行正确的标定和测量。这一部分在项目实操中一般会由各个应用层软件提供其组件包含的标定/测量数据符号信息,集成人员执行项目A2L生成脚本,其根据刚才提到的标定/测量数据符号信息,基于map文件就可得到CHARACTERISTIC和MEASUREMENT信息块,再整合ECU设备参数信息与通信接口信息,就可得到完成的A2L文件,下图为使用vector公司的ASAP2 Tool-Set工具生成A2L的完成过程。
A2L文件涉及的信息块名称如下:
- ASAP2_VERSION: ASAP2版本号,对于不同的标定测量软件要求不同,部分标定软件并不会读取版本号信息。
- PROJECT:包含了整个项目的信息,一个A2L文件对应一个项目工程 。
- HEADER:包含了项目信息,包括项目编号,项目版本等信息。
/begin HEADER "" VERSION "1.0.0.0" PROJECT_NO LBN_AUTOSAR /end HEADER
- MODULE:一个ECU对应一个MOUDLE模块,其中包含了标定测量需要的所有信息,例如MOD_PAR,MOD_COMMON,RECORD_LAYOUT,MEASUREMENT,CHARACTERISTIC,COMPU_METHOD,GROUP等信息块。PROJECT和MODULE是贯穿整个A2L文件的。
- A2ML:用于描述接口特定的数据格式。在A2ML里包含了许多类型的结构体定义,其中包括XCP协议层所用的结构体、DAQ、program,基于CAN的协议参数等。
- MOD_PAR:用于管理ECU的数据,例如客户名,编号,CPU类型,ECU的内存分配等。其中最重要的就是ECU的内存分配, 开发人员需要根据实际ECU内存分段情况定义标定起始地址以及SEGMENT的长度与其中的详细参数,包括working与reference的page,这与在线标定软件中的概念一致。
-
MOD_COMMON:用来指定ECU的一些标准的一般性描述信息,比如字节格式Intel或Motorola、数据格式的对齐方式、FLOAT变量的处理方式等,一个MODULE里也只能出现一次。
/begin MOD_COMMON "" DEPOSIT ABSOLUTE BYTE_ORDER MSB_LAST ALIGNMENT_BYTE 1 ALIGNMENT_WORD 2 ALIGNMENT_LONG 4 ALIGNMENT_FLOAT32_IEEE 4 ALIGNMENT_FLOAT64_IEEE 4 /end MOD_COMMON
- IF_DATA XCPplus:其包含了一个XCP通信栈里的常用参数(Common Parameters),它至少包含一个XCP_ON_XXX(XXX是具体的通信方式,如CAN或者网口)并且包含PROTOCOL_LAYER,其中有传输层的协议参数。
- XCP_ON_CAN:包含了XCP使用CAN的一些配置参数,如帧ID,波特率等。
/************************ start of CAN *********************/ 0x0102 /* XCP on CAN version */ CAN_ID_MASTER 0x98EF27F8 /* CMD/STIM CAN-ID */ /* master -> slave */ CAN_ID_SLAVE 0x98EFF827 /* RES/ERR/EV/SERV/DAQ CAN-ID */ /* slave -> master */ /* Bit31= 1: extended identifier */ BAUDRATE 500000 /* BAUDRATE [Hz] */ SAMPLE_POINT 60 /* sample point */ /* [% complete bit time] */ BTL_CYCLES 11 /* BTL_CYCLES */ /* [slots per bit time] */ SJW 0 /* length synchr. segment */ /* [BTL_CYCLES] */ MAX_BUS_LOAD 100 /* maximum available bus */ /************************* end of CAN **********************/
- PROTOCOL_LAYER:XCP协议参数。
/begin PROTOCOL_LAYER /* At MODULE */ 0x0102 /* XCP protocol layer version */ 2000 /* T1 [ms] */ 2000 /* T2 [ms] */ 0 /* T3 [ms] */ 0 /* T4 [ms] */ 0 /* T5 [ms] */ 0 /* T6 [ms] */ 2000 /* T7 [ms] */ 8 /* MAX_CTO */ 8 /* MAX_DTO default for DAQ and STIM */ BYTE_ORDER_MSB_LAST /* BYTE_ORDER: INTEL */ ADDRESS_GRANULARITY_BYTE /* ADDRESS_GRANULARITY */ OPTIONAL_CMD GET_SEED OPTIONAL_CMD UNLOCK OPTIONAL_CMD SET_MTA OPTIONAL_CMD UPLOAD OPTIONAL_CMD SHORT_UPLOAD OPTIONAL_CMD BUILD_CHECKSUM OPTIONAL_CMD DOWNLOAD OPTIONAL_CMD DOWNLOAD_NEXT OPTIONAL_CMD DOWNLOAD_MAX OPTIONAL_CMD MODIFY_BITS OPTIONAL_CMD SET_CAL_PAGE OPTIONAL_CMD GET_CAL_PAGE OPTIONAL_CMD COPY_CAL_PAGE OPTIONAL_CMD CLEAR_DAQ_LIST OPTIONAL_CMD SET_DAQ_PTR OPTIONAL_CMD WRITE_DAQ OPTIONAL_CMD SET_DAQ_LIST_MODE OPTIONAL_CMD START_STOP_DAQ_LIST OPTIONAL_CMD START_STOP_SYNCH OPTIONAL_CMD GET_DAQ_CLOCK OPTIONAL_CMD READ_DAQ OPTIONAL_CMD GET_DAQ_PROCESSOR_INFO OPTIONAL_CMD GET_DAQ_RESOLUTION_INFO OPTIONAL_CMD GET_DAQ_EVENT_INFO OPTIONAL_CMD FREE_DAQ OPTIONAL_CMD ALLOC_DAQ OPTIONAL_CMD ALLOC_ODT OPTIONAL_CMD ALLOC_ODT_ENTRY COMMUNICATION_MODE_SUPPORTED /* optional modes supported */ BLOCK SLAVE /* Slave Block Mode supported */ MASTER /* Master Block Mode supported */ 255 /* MAX_BS */ 0 /* MIN_ST */ SEED_AND_KEY_EXTERNAL_FUNCTION "XcpSeedNKey.dll" /* Name of the SeedAndKey function */ /* including file extension */ /* without path */ /end PROTOCOL_LAYER
- DAG(Data Acquisition):一个完整的DAQ数据采集流程有两步,上位机发送要获取的数据地址和长度等信息给ECU做采集前的初始化,然后ECU在做完初始化后,周期性的把数据发送出来,ECU需要有一个数据结构来维护发送数据的地址和长度,这个数据结构在XCP中称为ODT(Object Description Table),该结构中的每一个条目代表一个数据所处的地址和它的长度,XCP中称之为ODT Entry。应用中希望一个周期内采集非常多的数据(超过一帧),那么就需要把多个ODT组合起来,这种组合在XCP中称为DAQ List。
/begin DAQ /* DAQ supported, at MODULE*/ DYNAMIC /* DAQ_CONFIG_TYPE */ 65535 /* MAX_DAQ */ 3 /* MAX_EVENT_CHANNEL */ 0 /* MIN_DAQ */ OPTIMISATION_TYPE_DEFAULT /* OPTIMISATION_TYPE */ ADDRESS_EXTENSION_FREE /* ADDRESS_EXTENSION */ IDENTIFICATION_FIELD_TYPE_ABSOLUTE /* IDENTIFICATION_FIELD */ GRANULARITY_ODT_ENTRY_SIZE_DAQ_BYTE /* GRANULARITY_ODT_ENTRY_SIZE_DAQ */ 255 /* MAX_ODT_ENTRY_SIZE_DAQ */ NO_OVERLOAD_INDICATION /* OVERLOAD_INDICATION */ PRESCALER_SUPPORTED /begin TIMESTAMP_SUPPORTED 1 /* TIMESTAMP_TICKS */ SIZE_WORD /* TIMESTAMP_SIZE */ UNIT_1MS /* RESOLUTION OF TIMESTAMP */ /end TIMESTAMP_SUPPORTED /begin DAQ_MEMORY_CONSUMPTION 8187 /* DAQ_MEMORY_LIMIT: in Elements[AG] */ 46 /* DAQ_SIZE: number of elements[AG] per DAQ list */ 6 /* ODT_SIZE: number of elements[AG] per ODT */ 5 /* ODT_ENTRY_SIZE: number of elements[AG] per ODT_entry */ 2 /* ODT_DAQ_BUFFER_ELEMENT_SIZE: number of */ /* payload elements[AG]*factor = sizeof(send buffer)[AG] */ 0 /* ODT_STIM_BUFFER_ELEMENT_SIZE: number of */ /* payload elements[AG]*factor = sizeof(receive buffer)[AG] */ /end DAQ_MEMORY_CONSUMPTION /******************* start of EVENT ************************/ /begin EVENT /* EVENT */ "10msRStr" /* EVENT_CHANNEL_NAME */ "10ms" /* EVENT_CHANNEL_SHORT_NAME */ 0 /* EVENT_CHANNEL_NUMBER */ DAQ /* EVENT_CHANNEL_TYPE */ 1 /* MAX_DAQ_LIST */ 1 /* EVENT_CHANNEL_TIME_CYCLE */ 7 /* EVENT_CHANNEL_TIME_UNIT: UNIT_10MS */ 8 /* EVENT_CHANNEL_PRIORITY (0xFF = highest) */ /end EVENT /begin EVENT /* EVENT */ "100msRStr" /* EVENT_CHANNEL_NAME */ "100ms" /* EVENT_CHANNEL_SHORT_NAME */ 1 /* EVENT_CHANNEL_NUMBER */ DAQ /* EVENT_CHANNEL_TYPE */ 1 /* MAX_DAQ_LIST */ 1 /* EVENT_CHANNEL_TIME_CYCLE */ 8 /* EVENT_CHANNEL_TIME_UNIT: UNIT_100MS */ 10 /* EVENT_CHANNEL_PRIORITY (0xFF = highest) */ /end EVENT /begin EVENT /* EVENT */ "50msRStr" /* EVENT_CHANNEL_NAME */ "50ms" /* EVENT_CHANNEL_SHORT_NAME */ 2 /* EVENT_CHANNEL_NUMBER */ DAQ /* EVENT_CHANNEL_TYPE */ 1 /* MAX_DAQ_LIST */ 5 /* EVENT_CHANNEL_TIME_CYCLE */ 7 /* EVENT_CHANNEL_TIME_UNIT: UNIT_10MS */ 9 /* EVENT_CHANNEL_PRIORITY (0xFF = highest) */ /end EVENT /********************* end of EVENT ************************/ /end DAQ
- RECORD_LAYOUT:定义标定类型的物理存储结构,例如:单个变量,二维表,三维表等。
- MEASUREMENT:监控变量,也称为观测量,用于实时监测ECU运行内存中的变量,例如发动机扭矩、转速、冷却液温度等。每一个监控变量都需要建立自己的变量描述。一个常见观测量包含以下几个参数描述。
/begin MEASUREMENT /* Name */ /* Long identifier */ /* Data type */ /* Conversion method */ /* Resolution (Not used) */ /* Accuracy (Not used) */ /* Lower limit */ /* Upper limit */ ECU_ADDRESS /end MEASUREMENT
- CHARACTERISTIC:标定变量,修改储存在ECU内存中的变量参数,一般是固定的数值、曲线、MAP图。例如:PID参数、传感器电压曲线、扭矩输出MAP等。一个常见标定量包括以下几个参数描述。
/begin CHARACTERISTIC /* Name */ /* Long Identifier */ /* Type */ /* ECU Address */ /* Record Layout */ /* Maximum Difference */ /* Conversion Method */ /* Lower Limit */ /* Upper Limit */ /end CHARACTERISTIC
- COMPU_METHOD:用于定义计算公式以及原始值和物理值的转换关系,可以被标定变量和测量变量来引用,从而将原始值转换成便于用户阅读和使用的物理值。一个常见计算方法包括以下几个参数描述。
/begin COMPU_METHOD /* Name of CompuMethod */ /* Long identifier */ /* Conversion Type */ /* Format */ /* Units */ /* Coefficients */ /end COMPU_METHOD
- 预定义类型:最后我们介绍XCP的常见预定义类型。它主要分为四类,datatype数据类型,Type类型,ConversionType类型和IndexMode类型。
datatype类型 描述 UBYTE 1字节无符号整型 SBYTE 1字节有符号整型 UWORD 2字节无符号整型 SWORD 2字节有符号整型 ULONG 4字节无符号整型 SLONG 4字节有符号整型 A_UINT64 8字节无符号整型 A_INT64 8字节有符号整型 FLOAT32_IEEE 4字节浮点型 FLOAT64_IEEE 8字节浮点型 Type 描述 VALUE 数值 CURVE 曲线图 MAP MAP表 ConversionType类型 描述 RAT_FUNC 有理转换Rational, y=(axx+bx+c)/(dxx+ex+f) TAB_VERB 字符表转换Verbal Table IndexMode类型 描述 COLUMN_DIR 竖向排序 ROW_DIR 横向排序 addrtype类型 描述 PBYTE 相关内存位置有一个指向该表值或轴点值的1字节指针 PWORD 相关内存位置有一个指向该表值或轴点值的2字节指针 PLONG 相关内存位置有一个指向该表值或轴点值的4字节指针 DIRECT 相关的内存位置具有第一个表值或轴点值,所有其他的都跟随递增地址
A2L文件示例
使用Simulink/ECUCoder搭建模型,编译模型时,会自动生成对应的A2L文件,节省了手动制作A2L文件的时间。以下是一个简易的A2L文件示例。其中隐去了SWC以及标定/观测量的名称。
/******************************************************************************
*
* ASAP2 file: XXXXXX.a2l
*
* Code generation for model "XXXXXX".
*
* Model version : 1.2
* Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
* C source code generated on : Wed Feb 5 15:43:14 2025
*
* Target selection: autosar.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*
* (add additional file header information here)
*
******************************************************************************/
ASAP2_VERSION 1 31 /* Version 1.31 */
/begin PROJECT ProjectName "Project Comment Goes Here"
/begin HEADER "Header Comments go here"
/end HEADER
/begin MODULE ModuleName "Module Comment Goes Here"
/begin MOD_PAR "MOD PAR Comment Goes Here"
/end MOD_PAR
/begin MOD_COMMON "Mod Common Comment Here"
BYTE_ORDER MSB_LAST
/end MOD_COMMON
/begin RECORD_LAYOUT Scalar_BOOLEAN
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_UBYTE
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_BYTE
FNC_VALUES 1 SBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_UWORD
FNC_VALUES 1 UWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_SWORD
FNC_VALUES 1 SWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_ULONG
FNC_VALUES 1 ULONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_LONG
FNC_VALUES 1 SLONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_FLOAT32_IEEE
FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_FLOAT64_IEEE
FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_BOOLEAN
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_BOOLEAN
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_BYTE
FNC_VALUES 1 SBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_BYTE
AXIS_PTS_X 1 SBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_UBYTE
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_UBYTE
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_UWORD
FNC_VALUES 1 UWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_UWORD
AXIS_PTS_X 1 UWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_WORD
FNC_VALUES 1 SWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_WORD
AXIS_PTS_X 1 SWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_ULONG
FNC_VALUES 1 ULONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_ULONG
AXIS_PTS_X 1 ULONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_SLONG
FNC_VALUES 1 SLONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_LONG
AXIS_PTS_X 1 SLONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_FLOAT32_IEEE
FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_FLOAT32_IEEE
AXIS_PTS_X 1 FLOAT32_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_FLOAT64_IEEE
FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_FLOAT64_IEEE
AXIS_PTS_X 1 FLOAT64_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_BOOLEAN
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_BOOLEAN
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_UBYTE
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_UBYTE
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_BYTE
FNC_VALUES 1 SBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_BYTE
AXIS_PTS_X 1 SBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_UWORD
FNC_VALUES 1 UWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_UWORD
AXIS_PTS_X 1 UWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_WORD
FNC_VALUES 1 SWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_WORD
AXIS_PTS_X 1 SWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_ULONG
FNC_VALUES 1 ULONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_ULONG
AXIS_PTS_X 1 ULONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_LONG
FNC_VALUES 1 SLONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_LONG
AXIS_PTS_X 1 SLONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_FLOAT32_IEEE
FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_FLOAT32_IEEE
AXIS_PTS_X 1 FLOAT32_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_FLOAT64_IEEE
FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_FLOAT64_IEEE
AXIS_PTS_X 1 FLOAT64_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin CHARACTERISTIC
/* Name */ XXXXXX
/* Long Identifier */ ""
/* Type */ VALUE
/* ECU Address */ 0x0000
/* Record Layout */ Scalar_BOOLEAN
/* Maximum Difference */ 0
/* Conversion Method */ XXXXXX
/* Lower Limit */ 0.0
/* Upper Limit */ 1.0
/end CHARACTERISTIC
/begin COMPU_METHOD
/* Name of CompuMethod */ XXXXXX
/* Long identifier */ "Q = V"
/* Conversion Type */ RAT_FUNC
/* Format */ "%1.0"
/* Units */ ""
/* Coefficients */ COEFFS 0 1 0 0 0 1
/end COMPU_METHOD
/begin GROUP
/* Name */ XXXXXX
/* Long identifier */ "XXXXXX"
/* Root */ ROOT
/begin REF_CHARACTERISTIC
Confg_Cbl_BoschCell_flg
/end REF_CHARACTERISTIC
/end GROUP
/end MODULE
/end PROJECT
/* (add any file trailer comments here) */
/* EOF Gonfg_Model_TMS.a2l */
可以看到,其中包含了A2L文件以及模型名称等基础信息,字节序以及标定变量格式,标定变量,计算方法,以及GROUP信息。
英飞凌TC3xx芯片Overlay
Overlay功能是英飞凌芯片为支持在线标定而提供的将选定的数据访问重定向到一片特定内存的能力。具体来说,通过正确配置映射关系和使能并启动Overlay功能之后,实现对Flash上数据的访问映射到一段对应Ram上,XCP从而可以在该段RAM上实现标定存储在Flash中数据的功能。其过程图对应如下:
Overlay寄存器介绍
首先,我们需要初始化Overlay相关的寄存器,完成映射关系的配置,涉及的寄存器如下(包含两个全局寄存器和四个针对单个Block的寄存器):
- OVCENABLE:Overlay功能使能寄存器。完成在不同核上使能Overlay功能。
- OVCCON:这个寄存器比较重要,首先是配置影响的核心,然后是OVSTRT/OVSTP分别控制Overlay功能是否启动,还有DCINVAL控制是否non-cached访问等。
- OSEL:Overlay功能以Block为单位进行映射,这个寄存器可以与OVCCON.OVSTRT配合单独控制某个Block是否使能Overlay的,最多支持32个Block。
- OMASKi:对应32个Block的大小,从128Kbyte到32byte不等。
- OTARi:配置映射源Flash地址的寄存器,具体的地址到配置位域的关系可以由下面示例代码中的注释得到,这里就不赘述了。
- RABRi:配置映射目的Ram地址的寄存器,包括不同的Ram片区和具体的偏移地址,具体的地址到配置位域的关系可以由下面示例代码中的注释得到,这里就不赘述了。
Overlay功能实现
下面的例程完成了对Overlay功能的初始化,在核0上完成对Flahs地址0x801C_0000对Ram地址0x70004000的16K空间的映射。
void Overlay_Init(void)
{
/* The calibration size is 16KB,
* Flash CAL: 0x801C_0000H - 0x801C_3FFFH, 16KB
* Ram CAL : 0x7000_4000H - 0x7000_7FFFH, 16KB
*/
/* The calibration size is 16KB
* Here 1 overlay blocks are configured
* Block 0: size 16KB
*/
// Mcal_ResetCpuENDINIT(-1);
// Mcal_ResetCpuENDINIT(0);
// SCU_OVCENABLE.B.OVEN0 = 1; /*OVC is enable on CPU0*/
// Mcal_SetCpuENDINIT(0);
// Mcal_SetCpuENDINIT(-1);
Mcal_WriteSafetyEndInitProtReg(&SCU_OVCENABLE, 0x00000001U); /*SCU_OVCENABLE.B.OVEN0 = 1, OVC is enable on CPU0*/
/* ----------------------------Start Configuration for Block 0 -----------------------------------*/
/*Enable overlay on Block 0*/
OVC0_OSEL.U = (uint32)0x00000001U;
CPU0_BLK0_OMASK.B.OMASK = 0xE00U;
// CPU0_OMASK0.B.OMASK = 0xE00; /* 111000000000B, 16K block size */
/* Base Address
* |<-- OMASK--->|
* 0x801C_0000= 1000|0000|0001|1100|0000|0000|0000|0000
* OMASK = 0000|1111|1111|1111|1100|0000|0000|0000 (0xE00)
* TBASE = ****|0000|0001|1100|0000|0000|000*|****
* = 000 0000 1110 0000 0000 0000 = 0x00E000
*/
CPU0_BLK0_OTAR.B.TBASE = 0x00E000U;
/* Configure RABR, OTAR and OMASK for the configured overlay block */
/* Redirection to Core 0 DSPR/PSPR memory for Block 0 - 4kB */
CPU0_BLK0_RABR.B.OMEM = 0x0U; /* 0, Core 0 DSPR; 1, Core 1 DSPR; 6 - Redirect to LMU memory; 7 - Redirection to EMEM; 3..5H Reserved, do not use */
/* Overlay Address
* |<-- OMASK--->|
* 0x70004000 = 0111|0000|0000|0000|0100|0000|0000|0000
* OMASK = 0000|1111|1111|1111|1100|0000|0000|0000 (0xE00)
* OBASE = ****|****|**00|0000|0100|0000|000*|****
* = 0 0000 0010 0000 000 =0x200
*/
CPU0_BLK0_RABR.B.OBASE = 0x200U;
/* ---------------------------- End Configuration for Block 0 -------------------------------------*/
/* ---------------------------- Start Configuration for Block 1 -----------------------------------*/
// OVC0_OSEL.B.SHOVEN1 = 1; /* Enable overlay on Block 1 */
//
// OVC0_OMASK1.B.OMASK = 0xF00; /* 111100000000B, 8K block size */
//
// /* Base Address
// * |<-- OMASK---->|
// * BaseAddr = 1010|1111|0000|0101|1100|0000|0000|0000 (,,)
// * OMASK = 0000|1111|1111|1111|1110|0000|0000|0000 (0xF00)
// * TBASE = ****|1111 0000 0101 1100 0000 000*|****
// * = 111 1000 0010 1110 0000 0000 = 0x782E00
// */
// OVC0_BLK1_OTAR.B.TBASE = 0x782E00;
// /* Redirection to Core 0 DSPR/PSPR memory for Block 1 - 8kB */
// OVC0_BLK1_RABR.B.OMEM = 0x0; /* 0, Core 0 DSPR; 1, Core 1 DSPR; 6 - Redirect to LMU memory; 7 - Redirection to EMEM; 3..5H Reserved, do not use */
//
// /* Overlay Address
// * |<-- OMASK---->|
// * OverAddr = 0111|0000|0000|0000|0100|0000|0000|0000 (0x70004000)
// * OMASK = 0000|1111|1111|1111|1110|0000|0000|0000 (0xF00)
// * OBASE = ****|****|**00 0000 0100 0000 000*|****
// * = 00 0000 0100 0000 000 =0x200
// */
//
// OVC0_BLK1_RABR.B.OBASE = 0x200;
/* ---------------------------- End Configuration for Block 1 -------------------------------------*/
SCU_OVCCON.B.CSEL0 = 1U; /* Select CPU0 */
SCU_OVCCON.B.DCINVAL = 1U; /* only use non-cached access */
SCU_OVCCON.U = 0x03000001U;
}
下面的代码完成对映射的Flash区域到Ram区域的数据拷贝工作。
void Overlay_Sync(void)
{
Xcp_MemCopy((uint32 *)CALRAM_START_ADDR,
(uint32 *)CALFLASH_START_ADDR,
CAL_MEM_SIZE);
}
最后,是Overlay功能的启动和停止实现。
void Overlay_Enable()
{
/* XcpApp_CurrentCalPage is WORKING_CAL_PAGE; */
SCU_OVCCON.U = 0x00050001; // Overlay Start, OVSTRT = 1
}
void Overlay_Disable()
{
/* XcpApp_CurrentCalPage is REFERENCE_CAL_PAGE; */
SCU_OVCCON.U = 0x00060001; // Overlay Stop, OVSTP = 1
}
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。