瑞萨回读hex文件对比数据(因格式不一致)
工作中遇到芯片初次烧录跑不起来的问题,遂让回读片内数据查看与烧录文件一直不一致(有大佬知道此方法不对的麻烦评论一下)
使用的是瑞萨的RH850系列r7f701411
使用Renesas Flash Programmer V3.11 搭配E1 进行回读
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231094058653-981087216.png
选择对应的烧录机器 其他默认则好 这里选择的E1
点击 connect 出现选择芯片晶振,这里按自己的芯片来(注意必须物理连接上)
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231094246972-1756649466.png
进入这个界面 大概介绍一下,我也认得不全
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231094340380-1037299750.png
导入烧录文件 start就可以烧录
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231094915096-1087506310.png
常规烧录选前三个就可以
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095100709-264310564.png
没点过
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095138644-1660388804.png
这里的OPBT数据不对芯片启动不起来,可以先读取好的板子
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095238121-443292686.png
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095446258-1002163400.png
这个id也是可以改的
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095512473-49810941.png
可以读出好的板子这个(我读新板子也有这个所以可以先读一下)
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095606408-1248822103.png
勾选这个就可以填到我们的配置里了
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095701212-164482020.png
修改后可以写道芯片里
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095745266-1163516639.png
同样 设置位set后可以修改id
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095819832-1426608639.png
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095828237-22408392.png
这两个地方没改过
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231095855313-1082195529.png
可以通过这里读取芯片某些信息
点击第一个后会把设置的区域内代码读出
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231100015567-2115253286.png
选择一个保存地方
我这个版本支持.mot和.hex选择hex
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231100118703-90662282.png
选择读取的区域
我选择 code区read就好了
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231100215572-482404117.png
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231100258821-1930309064.png
勾选 读信息里的第二个
可以看到那些区域上锁没 打钩的
第四个检查空白区
这里进行题目的hex对比工作
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231100443414-73644783.png
直接读出的数据
可以看到
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231100527964-2034241493.png
0x10这段的数据有16字节
0000地址
00 数据类型 00标准格式 04 扩展地址(01 结束 05 开始地址等)
A2 这16的数据的校验值
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231100803993-610087904.png
而我要烧写的数据
0x20 32字节
所以要对这些数据进行掐头去尾比较
import sysdef parse_hex_to_dict(filename): """ 解析 HEX 文件,提取 {地址: 数据字节} 的映射。 处理记录类型 00 (数据) 和 04 (扩展线性地址)。 """ data_map = {} extended_linear_address = 0 with open(filename, 'r') as f: for line_num, line in enumerate(f, 1): line = line.strip() if not line.startswith(':'): continue try: # 解析 HEX 行结构 byte_count = int(line, 16) address = int(line, 16) record_type = int(line, 16) if record_type == 0x00:# 数据记录 full_address = extended_linear_address + address data_hex = line # 将每一位数据存入字典 for i in range(byte_count): byte_val = data_hex.upper() data_map = byte_val elif record_type == 0x04:# 扩展线性地址记录 extended_linear_address = int(line, 16)10: print("... 剩余差异已省略") if only_in_file1: print(f" 文件 1 独有的地址数据量: {len(only_in_file1)} 字节") if only_in_file2: print(f"文件 2 独有的地址数据量: {len(only_in_file2)} 字节") print("="*40)if __name__ == "__main__": # 使用方法: python script.py file1.hex file2.hex if len(sys.argv) < 3: print("使用方法: python compare.py") else: compare_hex_files(sys.argv, sys.argv)运行时须在命令行执行 python compare.py Rj.hex du1.hex
例如
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231101343916-1898322380.png
新建文件夹,将py文件名为compare.py以及导入要对比的数据
在文件位置输入cmd回车召除命令行
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231101555459-677488238.png
便可看到结果
现在记录一下脚本内容
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231101710365-1662721097.png
初始化变量
data_map = {}# 存储最终结果:地址->数据字节
extended_linear_address = 0# 高16位地址
逐行解析
跳过不以:开头的行
使用enumerate(f, 1)跟踪行号便于错误报告
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231102154545-291948602.png
解析关键字段
byte_count = int(line, 16)# 数据字节数
address = int(line, 16) # 低16位地址
record_type = int(line, 16) # 记录类型
计算完整32位地址:高16位 + 低16位
full_address = extended_linear_address + address
提取数据部分:line
逐字节存入字典
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231102327786-526282168.png
https://img2024.cnblogs.com/blog/3688973/202512/3688973-20251231102338087-90725047.png
地址合并排序
all_addresses = sorted(list(set(data1.keys()) | set(data2.keys())))
set(data1.keys()) | set(data2.keys()):取两个地址集的并集
list():转换为列表
sorted():排序,确保按地址顺序比对
检查地址有效性
if not all_addresses:
print("错误: 未在文件中找到有效数据。")
return
定义三种队列
mismatches = [] # 地址相同但数据不同
only_in_file1 = [] # 只在文件1中出现的地址
only_in_file2 = [] # 只在文件2中出现的地址
比较逻辑
for addr in all_addresses:
val1 = data1.get(addr)# 使用get()避免KeyError
val2 = data2.get(addr)
if val1 and val2: # 两个文件都有这个地址 if val1 != val2: # 但数据不同 mismatches.append((addr, val1, val2))elif val1: # 只在文件1中 only_in_file1.append(addr)elif val2: # 只在文件2中 only_in_file2.append(addr)输出结果
print("\n" + "="40)
print("比对结果汇报:")
print("="40)
一致的话
if not mismatches and not only_in_file1 and not only_in_file2:
print("恭喜!两个文件的【数据内容】完全一致。")
print(f"有效数据总量: {len(all_addresses)} 字节")
不一致的话
else:
# 显示数据不一致的地址
if mismatches:
print(f"发现 {len(mismatches)} 处数据不一致 (地址: 文件1 vs 文件2)
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 用心讨论,共获提升! 感谢分享,下载保存了,貌似很强大 收藏一下 不知道什么时候能用到 收藏一下 不知道什么时候能用到 感谢,下载保存了 yyds。多谢分享 谢谢分享,试用一下 热心回复! 这个有用。 懂技术并乐意极积无私分享的人越来越少。珍惜 收藏一下 不知道什么时候能用到 感谢分享,下载保存了,貌似很强大 谢谢分享,试用一下 热心回复! 喜欢鼓捣这些软件,现在用得少,谢谢分享! 前排留名,哈哈哈 懂技术并乐意极积无私分享的人越来越少。珍惜 很好很强大我过来先占个楼 待编辑 谢谢楼主提供!
页:
[1]
2