S-Record (.srec) 文件

S-Record (SREC or S19) 是一种常用于微控制器和嵌入式系统编程的文件格式,它是一种 ASCII 格式的文件,用于存储二进制数据。 S-Record 文件最初由摩托罗拉公司开发,广泛用于固件编程和调试。

S-Record 文件格式

S-Record 文件由一系列记录组成,每条记录表示一块数据。每条记录的格式如下:

SxLLAAAAAADD...DDCC
SxLLAAAAAAAADD…DDCC
记录类型长度地址数据校验和

其中各部分含义如下:

  • Sx:记录类型,由一个字符 S 和一个数字 x 组成,数字 x 指定记录类型
  • LL:两个十六进制字符,表示记录中剩余字节数(地址+数据+校验和)。
  • AAAAAA:地址字段,长度可变,表示数据的起始地址。地址字段长度取决于记录类型。
  • DD…DD:数据字段,包含实际数据,长度由记录的长度字段决定。
  • CC:校验和字段,用于校验记录的正确性。

记录类型

S-Record 有多种类型的记录,每种记录类型的含义不同:

  • S0:起始记录,通常包含文件名或其他信息。
  • S1:数据记录,包含 2 字节地址和数据。
  • S2:数据记录,包含 3 字节地址和数据。
  • S3:数据记录,包含 4 字节地址和数据。
  • S5:计数记录,包含记录数量。
  • S7:结束记录,包含 4 字节执行地址。
  • S8:结束记录,包含 3 字节执行地址。
  • S9:结束记录,包含 2 字节执行地址。

示例

一个简单的 S-Record 文件可能如下所示:

S00F000068656C6C6F202020202000003C
S1130000285F245F2212226A000424290008237C2A
S11300100002000800082629001853812341001813
S107002000065A8B1E
S5030003F9
S9030000FC

解释:

  1. S00F000068656C6C6F202020202000003C 是一条起始记录,表示一些文件信息。
  2. S1130000285F245F2212226A000424290008237C2A 是一条数据记录,地址为 0000,包含实际数据。
  3. S11300100002000800082629001853812341001813 是另一条数据记录,地址为 0010,包含实际数据。
  4. S107002000065A8B1E 是一条数据记录,地址为 0020,包含实际数据。
  5. S5030003F9 是一条计数记录,表示文件中包含 3 条数据记录。
  6. S9030000FC 是一条结束记录,表示程序的执行地址为 0000。

校验和计算

校验和用于检测记录的传输或存储过程中是否发生错误。计算步骤:

1、计算所有字节的总和:
  • 包括记录中的长度、地址和数据字段中的所有字节。
  • 不包括起始字符’S’和记录类型(如"S1", “S2”, "S3"等)。
2、取总和的最低字节:
  • 通过对总和执行AND操作(与0xFF)来获取最低字节。
3、取反最低字节:
  • 通过对最低字节进行按位取反(~运算符)或使用 255 - 最低字节 来完成。
4、输出结果:
  • 输出的校验码通常是一个单字节十六进制数。
例子

假设一个简单的S-Record数据行如下(仅示例数据):

S207 785634 010203

解释:

  • S2 表示类型为S2(数据记录,带有3字节地址)
  • 07 是后续字节的数量(包括地址、数据和校验码)
  • 785634是地址
  • 010203是数据
def calculate_checksum(s_record):
    # 去掉开头的记录类型,并分割成单独的字节
    data = s_record[2:]
    # 将数据每两个字符分割并转换为十六进制整数
    bytes_data = [int(data[i:i + 2], 16) for i in range(0, len(data), 2)]

    # 计算总和
    total_sum = sum(bytes_data)
    # 取最低字节
    lowest_byte = total_sum & 0xFF
    # 取反最低字节
    checksum = ~lowest_byte & 0xFF

    # 将校验码转换为十六进制字符串并转换为大写
    return hex(checksum)[2:].upper()

# 示例使用
s_record = "S207785634010203"
print(calculate_checksum(s_record))		# F0

使用 S-Record 文件

S-Record 文件通常用于:

  • 编程嵌入式设备的固件。
  • 在不同系统之间传输二进制数据。
  • 在调试工具中加载和查看内存内容。

许多嵌入式系统编程工具和调试器都支持 S-Record 文件格式,可以将其加载到目标设备的内存中或从目标设备中导出。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值