一、摘要
1.描述
- 本文主要描述的是如何通过使用C#解析常用MCU的刷写格式文件,如Bin,S19,Hex,Mot,Serc。
- 本软编写的语言是基于C#语言,并未使用其他关联的DLL文件,所以不同的电脑之间兼容性很好,不会出现调用异常的问题。
- 郑重申明,关于实现方法,我也是从网上很多地方学习而来,大家若觉得版权问题可以联系我随时删除。
2.关键字
文件解析,C#,Bin,S19,Hex,Mot,Serc。
二、为什么要文件解析
- 平常使用编译器的时候会自动生成相应格式的烧录文件,直接进行烧录即可,但是在有的时候我们需要使用对文件格式进行转换,比较好用刷写文件解析工具推荐使用HexView,也可以使用J-Flash进行查看。
- 若通过BootLoader进行升级,或者需要对文件进行补齐填充的时候,或者需要自己进行文件提取的时候,我们就需要自己编写代码进行解析,搭配上位机等进行使用。
三、BIN文件格式
- bin后缀的是一种二进制文件,它的用途是根据用户系统或者电脑内的应用而定 的。这是文件格式binary的缩写,bin文件没有什么特别之处,直接解析即可,bin文件不带
四、S19,M0T,SREC文件格式
-
s19,mot,serc文件格式之所以放在一起说明,是因为这几种格式的文件是相同的,除了后缀名不同,文件的排列格式是一样的,没有特别之处。采用同一种方式解析即可。
-
文件格式内容如下:
-
文件结构
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
S | Record type | Byte Count | Address | Data | Checksum |
- Record type: 两个字节,一个大写“S” 和 一个0~9的数字,定义数据类型。
- Byte count: 一个字节,表示后面其余部分(地址+数据+校验和)的字节数。该字段最小值为3(两个字节地址字段+1个字节校验和)。
- Address: 地址段长度由Record type来决定。地址字节对齐方式为大端对齐。
- Data: 数据段。一般建议该段最大32字节。S0/S1/S2/S3 类型的最小数据数是0。最大可记录的数据数由地址段来决定,因为数据段最大记录数是255,减去1个字节的校验位,再减去地址段,剩下的才是数据段长度,因此S0/S1最大支持252字节数据,S2最大支持251字节数据,S3最大支持250字节数据。
- Checksum: 一个字节。Checksum = 取补码( (Byte count + Address + Data) )
- 记录类型
RecordField | Record Purpose | Address Field | Data Field | Record Description |
---|---|---|---|---|
S0 | Header | 16-bit“0000” | √ | 此记录包含特定于供应商的ASCII文本,表示为一系列十六进制数字对。通常可以看到此 记录的数据是以空结尾的字符串格式的。文本数据可以是任何内容,包括以下信息的混 合:文件据块名称、版本号/修订号、日期/时间、产品名称, 供应商名称、PCB上的内 存指示符、版权声明。常见的是:48 44 52,这是ASCII H、D和R--"HDR"。 |
S1 | Data | 16-bit Address | √ | 此记录包含从16位地址字段开始的数据。此记录通常用于8位微控制器,如AVR、PIC、 8051、68xx、6502、80xx、Z80。此记录中包含的数据字节数为"字行计数字段”减去3(即,"16位地址字段"为2字节,"校验和字段"为1字节)。 |
S2 | Data | 24-bit Address | √ | 此记录包含从24位地址开始的数据。此记录中包含的数据字节数为“字行计数字段“减去 4(即,3字节表示“24位地址字段',1字节表示"校验和字段")。 |
S3 | Data | 32-bit Address | √ | 此记录包含从32位地址开始的数据。此记录通常用于32位微控制器,如ARM和680x0. 此记录中包含的数据字节数为'字行计数字段“减去5 即,"32位地址字段"为4字节,"校 验和字段"为1字节)。 |
S4 | Reserved | N/A | N/A | 此记录已被保留。 |
S5 | Count | 16-bit Count | × | 此可选记录包含16位的S1/S2/S3记录计数。如果记录计数小于或等于 65535 ( 0xFFFF) ,则使用此记录,否则将使用S6记录。 |
S6 | Count | 24-bit Count | × | 此可选记录包含24位的S1/S2/S3记录计数。如果记录计数小于或等于 16777215 ( 0xFFFFFF) ,则使用此记录。如果小于65536( 0x010000) ,则将使用S5记录。 |
S7 | Start Address(Termination) | 32-bit Address | × | 此记录包含32位地址处的开始执行位置。这用于终止一系列S3记录。如果SREC文件仅用 于对内存设函进行编程,而忽略执行位置,则可以使用零地址。 |
S8 | Start Address(Termination) | 24-bit Address | × | 此记录包含24位地址处的开始执行位置。这用于终止一系列S2记录。如果SREC文件仅用 于对内存设函进行编程,而忽略执行位置,则可以使用零地址。 |
S9 | Start Address(Termination) | 16-bit Address | × | 此记录包含16位地址处的开始执行位置。这用于终止一系列S1记录。如果SREC文件仅用 于对内存设函进行编程,而忽略执行位置,则可以使用零地址。 |
五、HEX文件格式
- hex文件是由一行行符合Intel hex文件格式的文本所构成的ASCII 文本文件。在Intel hex文件中,每一行包含一 个hex记录 。 这些记录由对应机器语言码和/或常量数据的十六 进 制编码数字组成。
- 文件格式内容如下:
- 文件结构
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
: | A | B | C | D | E |
- 描述
内容 | 描述 |
---|---|
: | 数据每行都由冒号开头 |
A | 数据长度 1 Byte ,表示本行数据的长度 |
B | 数据地址 2 Byte ,表示数据的起始地址 |
C | 数据类型 1 Byte |
D | 具体数据 N Byte ,表示本行中数据字节的数量,它和A说明的数据长度一致 |
E | 校验和 1 Byte ,检验和 = 0x100 - 累加和 |
- 数据类型
内容 | 描述 |
---|---|
"00" | 数据记录:用来记录数据,HEX文件的大部分记录都是数据记录 |
"01" | 文件结束记录:用来标识文件结束,放在文件的最后,标识HEX文件的结尾 |
"02" | 扩展段地址记录:用来标识扩展段地址的记录 |
"03" | 开始段地址记录:开始段地址记录 |
"04" | 扩展线性地址记录:用来标识扩展线性地址的记录 |
"05" | 开始线性地址记录:开始线性地址记录 |
六、源码下载
七、其他
本文主要是讲解BIN,S19,M0T,SREC,HEX文件解析,后续章节会对源码的内容进行讲解,方便新手查询,有些地方可能会有描述性的错误,希望看到的朋友及时指出,我会及时更正错误,其他地方有些借鉴的描述,写此文章的目的是为了交流,非商业用途,欢迎私信讨论,感谢大家阅读。