【嵌入式烧录/刷写文件】-S19文件解析(首行数据解析)

本文详细介绍了MotorolaS19文件格式,它是FreescaleCodeWarrior编译器生成的用于MCU编程的文件,涉及记录类型、数据结构及解析过程,帮助读者理解S19文件的组成和使用方法。
摘要由CSDN通过智能技术生成

目录

               一、概述

               二、S19文件解析

               三、举例


 

一、概述:

Motorola S-record是一种文件格式,由摩托罗拉在20世纪70年代中期为Motorola 6800处理器创建,以ASCII文本形式传达二进制信息的十六进制值,其文件格式也可能为SRECORD,SREC,S19,mot,.S28,S37,SX,.s,.s1,.s2,.s3,. exo,.mxt。

S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。

注意:

上面“是一段直接烧写进MCU的ASCII码”,这样说可能会误导初学者,因为并不是直接将ASCII码写进MCU,写进MCU前还要对S19文件进行一个解析,把有用的机器代码分解出来,然后再进行写入,写入的也不是ASCII而是二进制码。

二、S19文件解析

S19文件格式与mot、SREC文件只是命名方式不同,看数据格式的话,其实是同一种文件,这里以S19文件为例。

S19文件每一行数据全部由记录类型和十六进制数字组成,包含类型、长度、地址、数据和校验和五个部分。

以下举例详细介绍每个组成部分

S19中记录类型包括S0、S1、S2、S3、S5、S7、S8、S9,S4是保留的,目前没有定义。

S0:
位于文件的第一行,和其他行不同,地址部分没有使用,用“0000”置位,整行表示记录的开始;

数据场中的信息被划分为以下四个子域(此行表示程序的开始,不需烧入memory):

                    name(名称):20个字符,用来编码单元名称

                    ver(版本):2个字符,用来编码版本号

                    rev(修订版本):2个字符,用来编码修订版本号

                    description(描述):0-36个字符,用来编码文本注释。

S1
表示地址长度为两字节(4字符)的记录,包含类型、长度、地址、数据和校验和五个部分;

S2:
表示地址长度为三字节(6字符)的记录,包含类型、长度、地址、数据和校验和五个部分;

S3:
表示地址长度为四字节(8字符)的记录,包含类型、长度、地址、数据和校验和五个部分;

S5:
表示文件中含有S1、S2、S3记录的个数,其后不接数据,包含S5的记录并不是每个文件必须的;

S7:
表示地址长度为四字节(8字符)的记录,包含类型、长度、地址和校验和四个部分,此行表示程序的结束;

S8:
表示地址长度为三字节(6字符)的记录,包含类型、长度、地址和校验和四个部分,此行表示程序的结束;

S9:
表示地址长度为两字节(4字符)的记录,包含类型、长度、地址和校验和四个部分,此行表示程序的结束;

只有S1、S2、S3、S5需要写入Flash中。

三、举例                 

S0 11 0000 0000486578766965772056312E31 08 :

长度:长度包含一个字节,长度 = 地址字节数 + 数据字节数 + 校验和字节数;

0x11转换成十进制为17,即地址2+数据14+校验1 三部分长度为17;

地址:表示该行的起始地址,字节数由类型决定,S1两个字节,S2三个字节,S3四个字节;

0000.由于是S0类型,所以地址位不用,使用0000置位,表示记录的开始;

数据:0000486578766965772056312E31,解析为HexviewV1.1(版本生成工具信息)

校验和:08, 校验和=0xff – (记录长度 + 存储地址 + 数据)——>0xff-(0x11+0x00+0x00 +0x00+0x00+0x48+0x65+0x78+0x76+0x69+0x65+0x77+0x20+0x56+0x31+0x2E+0x31)=0xff-(0x3F7)——>0x3F7取0xF7——>0xff-0xf7=0x08

S3 0D 00F98000 015A000000FA0400 20:

类型:S3,地址长度为4个字节

长度:0x0D转换成十进制为13,即地址4+数据8+校验1 三部分长度为13;

地址:00F98000.表明将数据015A000000FA0400下载到从地址00F98000开始的一段连续的地址中;

数据:015A000000FA0400

校验和:20, 校验和=0xff – (记录长度 + 存储地址 + 数据)——>0xff-(0x0D+0x00 +0xF9 +0x80 +0x00 +0x01 +0x5A +0x00 +0x00 +0x00 +0xFA +0x04 +0x00)=0xff-(0x2DF)——>0x3F7取0xDF——>0xff-0xDF=0x20

累加和checksum在线校验工具
1)累加和checksum校验算法,不同领域可能采用不同算法,算法存在细微差别
2)本工具采用简便累加和计算方法,对十进制串按8位进行分割,对各8位值进行累加,即得校验和;
         如果校验和的数值超过十六进制的FF,也就是255,就要求其补码作为校验和
3)如01 12 45 30 22 11,将各8位数值进行相加,即得校验和bb
4)如01 12 45 30 22 11 cc,将各8位数值相加后,结果大于255,对结果取补码后,得校验和为79
5)校验和checksum算法不一致,可能结果不一样,后续增加其它checksum算法,如通信领域8位校验和、16位校验和、IP/TCP/UDP头部校验和算法

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用CAPL语言编程可以实现S19文件解析和CANoeS19文件的读取。以下是一个简单的实现过程: 1.首先,在CANoe中创建一个新的CAPL程序。 2.通过使用ANSI C库函数来实现文件的打开和读取。使用函数fopen来打开S19文件使用fscanf来读取文件中的数据。 3.根据S19文件格式的规则来解析读取到的数据。 4.根据解析后的数据,进行CANoe中的相关操作,比如发送CAN消息或者将数据输出到日志中。 5.使用函数fclose来关闭文件。 以下是一个简单的示例代码: ```c variables { FILE* file; int dataSize; int address; char recordType[3]; char data[256]; char checksum[3]; } on start { file = fopen("example.s19", "r"); if (file == NULL) { write("文件打开失败"); return; } while (!feof(file)) { fscanf(file, "S1%2X%4X%2s%[^*]%2s", &dataSize, &address, &recordType, &data, &checksum); //根据recordType的值判断数据类型并进行相应操作 if (strcmp(recordType, "00") == 0) { //数据记录处理 for (int i = 0; i < dataSize; i++) { //将数据发送到CANoe总线上 //例如:can_SendMsg(0x123, &data[i], 1); } } else if (strcmp(recordType, "01") == 0) { //结束记录处理 } } fclose(file); } ``` 上述示例代码是一个简单的S19文件解析的例子,根据S19文件的规则,解析文件中的数据,并根据数据类型进行相应的操作。具体的操作可以根据需求定制。 需要注意的是,以上代码中的can_SendMsg函数是一个虚拟的函数,需要根据实际情况修改为CANoe中发送CAN消息的函数。 通过以上CAPL程序的编写,我们可以实现在CANoe中对S19文件进行解析和读取。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值