Keil+Simulink生成Xcp标定协议A2L文件

2023-05-16

Keil+Simulink生成Xcp标定协议A2L文件

由于最近要为ECU移植XCP协议,所以记录一下,我使用的MCU为NXP S32K144,IDE选用MDK(官方IDE S32DS无代码联想功能,所以放弃,本来用vscode+ld+make来开发,但是发现还是用keil比较方便,具体方法,可以在S32DS生成外设配置,然后将Generated Code 拷贝到Keil中去,Keil中已自带S32K144官方驱动,但是版本较老,编译出错的地方需要及时修改),Xcp协议可以参考Vector 官方提供的Xcp_Basic SDK
  • 定义一个Keil 链接脚本.sct文件(S32K144_64_flash_user.sct),至于怎么使用,请参阅其他文章,对S32K内存进行分区,该文件决定了链接后的可烧写、调试文件axf或hex中内存分布,以及运行时MCU flash+ram分布,同时还在编译过后的.map文件中提供分区变量具体的内存地址信息,供生成A2L文件使用。
  • 此处目的在于将测量变量(Measurement)和标定变量(Characteristic)分配到单独的内存分区里,便于管理,便于上位机Xcp_Master寻址。这里在S32K P_Flash 两个扇区上分别为 标定 和测量变量分了两个区(对应加载地址LR_Adrr,对应Xcp参考页),以及Ram上分了对应的两个区(对应运行地址ER_Adrr,对应Xcp工作页)
  • m_flash_upload_start 0x00001000 Measurement Flash分区起始地址,0x1000=4096/1024=4KB,S32K一个扇区为4KB,所以为第二个扇区
  • m_flash_upload_size 0x00000800 长度2K
  • m_flash_cali_start 0x00001800 CharacteristicFlash分区,第三扇区
  • m_flash_cali_size 0x00000400
#define m_interrupts_start             0x00000000
#define m_interrupts_size              0x00000400
#define m_flash_config_start           0x00000400
#define m_flash_config_size            0x00000010
#define m_flash_upload_start           0x00001000 //如果使能加解密功能,第一扇区不能保存数据(会被擦除)
#define m_flash_upload_size            0x00000800
#define m_flash_cali_start             0x00001800
#define m_flash_cali_size              0x00000400
#define m_text_start                   0x00002000
#define m_text_size                    0x0007E000
  • S32K144_64_flash_user.sct中宏定义
LR_m_data_upload_Rom m_flash_upload_start m_flash_upload_size
{
	ER_m_data_upload_Ram m_data_upload_start m_data_upload_size
	{
		* (section_upload)
	}
}
LR_m_data_cali_Rom m_flash_cali_start m_flash_cali_size
{
	ER_m_data_cali_Ram m_data_cali_start m_data_cali_size
	{
		* (section_cali)
	}
}
  • Sector划分,关于加载地址和运行地址请自行百度,简单的说,比如变量LR分配到Flash,ER分配到Ram,则在S32K初始化流程中会将Flash中的变量拷贝到Ram对应的区中去运行(keil编译器会在__main函数中加入自带的库函数,使MCU上电时完成该任务,如果是其他编译器可能需要手动拷贝),这样对变量的测量和标定可以是读和写(Ram)(前提是切换到工作页,参考页工作页的定义会在A2L文件体现),但是Ram区掉电及失,所以可以在标定的过程中使用EEPROM进行备份(暂时没调通S32K自带的片上EEPROM功能)进行备份,如果LR ER都是Flash区,则该变量就只能读不能写(S32K写入Flash需保证该位置是擦除状态,而擦除命令又是以扇区为单位,要擦只能擦整个扇区)。
#define  Upload_Section  __attribute__((section ("section_upload")))
#define  Cali_Section  __attribute__((section ("section_cali")))
  • 定义两个宏定义,每次定义变量时,调用,就可以告诉编译器将该变量划分到对应的Section(分区,包含LR和ER)上去。
Upload_Section float me_Steerag_rate  = 2.0f ;
Cali_Section float ca_Para1  = 1.0f ;
  • 定义变量例子,这里定义了两个测试变量,一定要注意这两个变量的名字要和A2L的变量名对应,因为这两个变量的信息会存于.map文件,在调用Simulink
asap2post(".a2l文件地址",".map文件地址")
  • 时会根据变量名来索引,将map文件中对应的地址填到A2L文件对应的位置,如下0X1FFF8000,0X1FFF880就是这个地址
	/begin CHARACTERISTIC
      ca_Para1  
      "This is Gain"
      VALUE 
      0x1FFF8800 //characeristic 这里不能写 ECU Address?
      Scalar_FLOAT32_IEEE //如果定义了这个数据类型,则要定义record_layout
      0 
      untitled_CM_single_None 
      -2.0 
      10.0
    /end CHARACTERISTIC

    /begin MEASUREMENT
      me_Steerag_rate
      "steer wheel angle"
      FLOAT32_IEEE
      untitled_CM_single_deg_S
      0
      0
      -250.0
      250.0
      0x1FFF8000 //都不用写ECU Address
    /end MEASUREMENT
/* 在MCU将ROM RW拷贝进ram之前,先将upload_ram ,cali_ram区清空,然后后面MCU会调用库将upload_rom(ldr adrr) cali_rom拷贝
		进upload_ram(exc_adrr) cali_ram*/
		uint32_t upload_ram_start=0x1fff8000;
		uint32_t upload_ram_end=0x1fff8000+0x800;
		while(upload_ram_start != upload_ram_end)
		{
			*((uint32_t *)upload_ram_start)=(uint32_t)0x00000000;
			upload_ram_start=upload_ram_start+4;
		}
		uint32_t cali_ram_start=0x1fff8800;
		uint32_t cali_ram_end=0x1fff8800+0x400;
		while(cali_ram_start != cali_ram_end)
		{
			*((uint32_t *)cali_ram_start)=(uint32_t)0x00000000;
			cali_ram_start=cali_ram_start+4;
		}
  • 由于上面定义了分区,所以将Flash中的变量拷贝到Ram前需要清空该Ram区,将这段代码放大S32K startup.c 中的void
    init_data_bss(void)函数中去

MCU 侧要做的工作暂时就只有这些,下一篇文章会初步解析A2L文件,以及用Simulink如何生成A2L文件并关联编译器生成的.map文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keil+Simulink生成Xcp标定协议A2L文件 的相关文章

  • CAN通信最常用的标定协议--CCP与XCP

    CCP与XCP CCP协议 CAN Calibration Protocol CAN标定协议 基于CAN总线的标定协议 XCP协议 Universal Measurement and Calibration Protocol 通用测试标定协
  • Matlab Simulink 常用快捷操作和功能(1)

    1 快速查找library里面的模块 双击左键 然后输入要查询的模块名称 gt 2 block 和 signal 的命名修改 单击block 显示 修改名字 3 Simulink支持从块参数对话框中创建变量 可以在Simulink中创建MA
  • L6050U compile erro

    L6050U The code size of this image exceeds the maximum allowed for this version of the linker 原因 是 用的 是 EVb版本 需要 正版 才没有
  • 【SIMULINK】基于DQ0模型的三相异步电机自制仿真模型教程

    SIMULINK 基于DQ0模型的三相异步电机自制仿真模型 其实 打开simscape自带的异步电机模型 里面也是基于DQ0的 电机的模型定子电压作为输入 定子电流是输出 内部结构 omega 1 是DQ坐标系的转速 为0时退化为 alph
  • 感应(异步)电机磁场定向控制MATLAB/Simulink建模

    电机控制系列文章 感应 异步 电机磁场定向控制电流环PI控制参数设计 感应 异步 电机磁场定向控制速度环PI控制参数设计 目录 电机控制系列文章 前言 一 控制器与被控对象的采样周期 二 系统解算器设置 三 被控对象建模 四 控制器建模 1
  • keil_lic.exe注册机使用

    第一步 以管理员身份运行keil5 第二步 打开File中的License Management 第三步 复制CID 第四步 选择对应的Target为ARM 粘贴CID 复制生成的注册码 第五步 将注册码粘贴到这 就ok了
  • MDK5__配色方案的修改

    一 必要的知识 与MDK主题相关的文件有两个 在X Keil v5 UV4路径下 global propglobal prop def其中global prop def是系统默认的主题配置 如果修改过字体等 系统会生成一个global pr
  • matlab中的mod和rem的异同

    rem和mod是求余的 但是算法不同 差异在哪呢 就在于分别使用了fix和floor 函数fix和floor都是圆整用的 fix是向0的方向圆整 如fix 1 5 1 fix 1 5 1 而floor是向下圆整 如floor 1 5 2 f
  • 2021-02-28

    simulink控制器封装库 控制器封装库 一 封装库的安装和LADRC模块的使用
  • simulink仿真 adc 采样ePWM输出例程

    新建文件夹并用matlab打开 写入这两个模块 配置 ADC 配置ePWM 不使能B 关了就行 其他的默认即可 配置烧录 连线 示波器接pwma1 和地 adc chanl1接 3 3v或者 0 3 3 都行 转化是 x 3 3 2 12
  • WIN10下各种软件字体模糊解决

    WIN10下uvision字体模糊解决 有时会出现软件模糊的情况 如图 解决方法很简单 重新打开工程我们就能发现字体已经变清晰了 该方法适用于解决大部分win10软件字体模糊的问题 而不仅是keil 有时会出现软件模糊的情况 如图 以我经常
  • keil mdk代码提示与代码补全设置

    主要参考https blog csdn net w5862338 article details 50520423 结合自己的实际问题 一旦习惯了一些实用的功能 当进入到类似的环境中而没有熟悉的功能 会觉得很不方便 代码提示与补全就是这样实
  • [keil5] 中有关“TOOLS.INI-Section ‘[C51]‘ : missing ‘PATH‘ enty “错误

    在安装vdmagdi后 打开keil5 uVision5出现 gt gt gt TOOLS INI Section C51 missing PATH enty lt lt lt 错误 原因如下 双击运行vdmagdi exe文件 选择了AG
  • 如何确定嵌入式系统中的最大堆栈使用率?

    当我给Keil编译器 callgraph 选项时 它为我静态计算准确的 最大堆栈使用量 唉 今天它给了我一条 最大堆栈使用量 284 字节 未知 没有堆栈大小的函数 消息 以及 没有堆栈信息的函数 列表 Nigel Jones 表示递归在嵌
  • 如何将 simulink 文件转换为 XML

    我需要将 Simulink 文件 mdl 转换为 XML 文件 经过任何搜索后 我没有找到任何内容来帮助我解决此问题 您知道 Java 中的某种方法或现成的解决方案吗 从 R2008b 开始 您可以使用以下命令将 mdl 文件导出到 xml
  • 您能解释一下这个嵌入式 MATLAB 函数错误吗?

    我在将值从 GUI 发送到 Simulink 模型中的嵌入式 MATLAB 函数 EMF 时遇到问题 我从 GUI 中的滑块获取该值 并将其发送到模型中的 EMF 块 我可以确认该值已从 GUI 正确传输到 Simulink 模块 因为我可
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 如何将变量放置在内存中给定的绝对地址处(使用 GCC)

    RealView ARM C 编译器supports使用变量属性将变量放置在给定的内存地址处at address int var attribute at 0x40001000 var 4 changes the memory locate
  • 基于PI控制器的光伏并网逆变器系统simulink建模与仿真

    目录 1 算法仿真效果 2 MATLAB源码 3 算法概述 4 部分参考文献 1 算法仿真效果 matlab2022a仿真结果如下
  • 从 Python 访问/调用 Simulink

    我想在 Simulink 中对系统进行建模 然后从 python 程序访问该模拟以为其提供新的条件或输入 我知道有一个模块允许您从 Python 访问 Matlab 引擎 但这有点不同 我想要一个在 Simulink 中建模的系统 并使用

随机推荐

  • FSK,PSK,ASK,BPSK调制

    信号调制常用的三种基本方法是 xff1a 调幅 调频和调相 1 振幅调变 xff0c 简称为调zhi幅 xff0c 通过改变输出dao信号的振幅 xff0c 来实现传送信息的目的 一般在调制端输出的高频信号的幅度变化与原始信号成一定的函数关
  • STM32 FreeRTOS 队列 及 xQueueGenericSend使用

    1 xff0c 队列中比较重要的结构体 xff1a xQUEUE xff08 Queue t xff09 2 xff0c 入队相关API xff1a xQueueSendToFront xQueueSendToBack xQueueSend
  • 移植FreeRTOS到 Xilinx ZYNQ Microblaze IP核

    1 xff0c 运行环境vivado2019 2 xff0c win10 ZYNQ 7000系列 2 xff0c FreeRTOS官网源码下载 https www freertos org 3 xff0c FreeRTOS 是一个迷你的实时
  • linux下网络设备驱动开发

    一 xff0c 网络OSI参考模型分为 从上到下 应 xff0c 表 xff0c 会 xff0c 传 xff0c 网 xff0c 数链 xff0c 物 物理层 gt 数据链路层 gt 网络层 gt 传输层 gt 会话层 gt 表示层 gt
  • freeRTOS系统静态与动态建立任务

    一 xff0c 静态建立任务 1 xff0c 定义任务函数 xff08 一个无限循环且不带返回值的函数 xff09 任务必须是死循环 xff0c 否则任务将经过 LR 返回 xff0c 如果 LR 指向了非法内存就会产生HardFault
  • Ubuntu18.04安装Ceres1.14

    Ubuntu18 04安装Ceres1 14 1 下载Ceres2 安装依赖项3 编译4 安装 1 下载Ceres 链接Github下载地址 2 安装依赖项 sudo apt get install liblapack dev libsui
  • SSH登录出现REMOTE HOST IDENTIFICATION HAS CHANGED故障的解决办法

    今天登录一台交换机 xff0c 出现如图错误 xff1a 原因 该IP分配给过另一台交换机 xff0c 在knows hosts文件中保留了当时的rsa信息 xff0c 将这个IP有分配给新设备 xff0c SSH登录时会提示RSA key
  • 外贸函电常用词汇

    外贸函电常用词汇 xff1a xff08 1 xff09 贵函 Your letter Your favour your esteemed letter Your esteemed favour Your valued letter You
  • 匿名拓空者Pro开源飞控使用介绍-1-飞控特点

    匿名团队 是一个爱好技术 xff0c 爱好创新的团队 做自己 xff0c 发现兴趣 xff0c 追随兴趣 xff0c 分享兴趣 非常欢迎大家关注我们匿名 xff0c 交流群 xff1a 190169595 匿名拓空者Pro 飞控 xff0c
  • 匿名拓空者Pro开源飞控使用介绍-2-硬件配置及拓展接口

    硬件配置 主控 STM32F407 xff1a 1M FLASH xff0c 192K RAM xff0c 运行频率168MHz xff1b 惯性传感器 icm20602 xff1a 3轴陀螺 43 3轴加速度 43 恒温设计 xff08
  • 匿名拓空者Pro开源飞控使用介绍-3-连接上位机及基本测试

    飞控连接上位机方法 飞控可以通过底板上的USB端口连接上位机 xff0c 使用USB线连接飞控和电脑 xff0c 飞控买家版程序会将USB端口初始化成HID设备 xff0c 免安装驱动程序 xff0c 只要打开匿名上位机 xff0c 打开程
  • 匿名拓空者Pro开源飞控使用介绍-4-飞控安装及坐标系定义

    飞控安装 将机架组装好 xff0c 电机安装于机架上 xff0c 飞控安装于机架重心位置 xff08 一般为机架中心板中心位置 xff0c 也就是两条电机对角线交点 注意 xff0c 飞控尽量水平安装于机架上 xff0c 飞行效果最好 xf
  • 匿名拓空者Pro开源飞控使用介绍-5-接收机连接

    确定使用何种接收机连接方式 匿名拓空者PRO飞控支持SBUS PPM PWM型接收机 xff0c 根据推荐程度依次为SBUS gt PPM gt PWM SBUS PPM均可以实现1根信号线传输多通道遥控数据的功能 xff0c SBUS为串
  • 匿名科创--匿名拓空者PRO—TI版全开源飞控使用入门—TM4C123

    1 飞控介绍 匿名团队针对TI芯片的强烈学习需求 xff0c 推出了匿名拓空者PRO飞控的TI版 使用TI公司的 TM4C123G 主控芯片 xff0c 打造了一款完全开源的飞控产品 xff0c 提供完全开源的飞控整体工程文件 xff0c
  • 匿名科创--ANO_OPENMV视觉开发板介绍

    1 ANO OPENMV介绍 官方OPENMV体积大 xff1f 在飞行器上不方便安装 xff1f 串口通过杜邦线容易接触不良 xff1f 不可否认 xff0c OPENMV为大家提供了一个非常方便 易用的视觉开发环境 xff0c 但是在实
  • 匿名科创--匿名拓空者PRO--开源光流融合算法使用教程

    1 总体介绍 为了更好的支持匿名TI飞控买家 xff0c 匿名团队开源了基于优象光流模块的飞控算法 xff0c 光流传感器直接连接至匿名拓空者PRO TI版飞控 xff0c 由飞控读取原始光流传感器的光流数据 xff0c 结合高度传感器以及
  • Linux 设备驱动开发实例

    编译和运行 驱动编译要用到kernel的Makefile文件 也就是源码树的编译系统 因此 xff0c 源码需要被配置和编译 xff0c 以ubuntu自带的源码为例 xff1a 编译外部模块 ko 的编译命令是 xff1a make C
  • 匿名科创-匿名光流V3版对天安装介绍

    安装介绍 光流模块对天安装时 xff0c 方向参考上图 注意 xff0c 只有光流模块对上安装 xff0c 激光或超声波测距模块仍然对地安装 配置介绍 如需使用对天模式 xff0c 硬件安装好后 xff0c USB线连接光流模块至上位机 x
  • 从 C51+uCos-II 近距离了解操作系统任务切换原理

    前言 从 C51 43 uCos II 简单介绍下任务切换的原理 方便大家更形象的理解多任务怎么切换 为后续写 x86 43 Linux 任务切换做铺垫练手吧 参考资料如下 xff1a uCos II 源码 单片机原理与应用及 C51 编程
  • Keil+Simulink生成Xcp标定协议A2L文件

    Keil 43 Simulink生成Xcp标定协议A2L文件 由于最近要为ECU移植XCP协议 xff0c 所以记录一下 xff0c 我使用的MCU为NXP S32K144 IDE选用MDK 官方IDE S32DS无代码联想功能 xff0c