一、简介
srec_cat是一个在嵌入式开发中,使用非常频繁的软件,这里做个常用功能的介绍。
二、常用参数
文件类型
在使用srec_cat指令时,在输入文件和输出文件时,要指明文件的类型,如:
input.hex -intel ::因特尔的十六进制文件
output.bin -binary ::二进制文件
-o 文件名 文件类型(输出)
见如下代码:
srec_cat 输入文件 文件类型 -o 输出文件 文件类型
实例:合并两个hex文件
在平时开发中,使用频率很高的一个功能就是合并两个hex,即boot和app。那这里准备3个文件boot.hex、app.hex、boot_app.hex。boot_app.hex是提前通过jflash合并的。
执行下面的代码:
@echo off
chcp 65001
setlocal enabledelayedexpansion:: 合并两个hex文件
srec_cat boot_jf.hex -intel app_jf.hex -intel -o merge.hex -intelecho 转化结束 pause endlocal
得到merge.hex文件,我们对比merge.hex和boot_app.hex文件。
可以看到,除了第一行,其他全都一样。第一行是因为jflash转化的机制问题,不用管。
-offset 地址(设置偏移地址)
在对二进制文件操作的时候,经常会用到这个参数
srec_cat 输入文件 文件类型 -offset 偏移地址 -o 输出文件 文件类型
实例:bin文件转hex文件
之前介绍过hex转bin文件的方法,这里再介绍一下把bin转hex的方法。hex2bin不会的可以看这篇文章:hex文件转bin文件-CSDN博客
这里,准备2个文件,boot.hex和boot.bin。boot.bin是通过jflash转化来的。
执行如下代码:
@echo off
chcp 65001
setlocal enabledelayedexpansionsrec_cat boot_jf.bin -binary -offset 0x000 -o boot_srec.hex -intelecho 转化结束 pause endlocal
对比boot_srec.hex和boot.hex文件。
发现有好多不一样,为什么会这样?
直接看一下hex的内容。
原来是因为源文件每行是16个字节,srec转化出来的显示32个字节。
实例:hex文件转bin文件
scre_cat同样也是可以把hex转换为bin文件的。
@echo off
chcp 65001
setlocal enabledelayedexpansion:: hex转Bin
srec_cat boot_jf.hex -intel -o boot_srec.bin -binaryecho 转化结束 pause endlocal
对比boot_srec.bin和boot_jf.bin
只是空白区域填充不一样而已。
-Output_Block_Size=长度(限制输出文件每行记录的字节长度)
srec_cat 输入文件 文件类型 -offset 偏移地址 -o 输出文件 文件类型 -Output_Block_Size=限制长度
实例:bin文件转hex文件。
还是准备boot.bin和boot.hex两个文件。
调用如下指令:
@echo off
chcp 65001
setlocal enabledelayedexpansion:: bin转hex,限制每行记录16个字节
srec_cat boot_jf.bin -binary -offset 0x000 -o boot_srec.hex -intel -Output_Block_Size=16echo 转化结束 pause endlocal
再对比boot_srec.hex和boot,hex文件。
这次前面已经完全一样了,但是后面还是不一样。
直接打开内容。
可以看到,boot.hex文件,从0x193c-0x1e40中间是没有任何数据的。而boot_srec.hex是将这些空白内容全部填充为0xff。
实例:起始地址非零的bin文件转hex文件。
很多时候,bin文件的起始地址非零,比如app.bin。此时如果要把其转化为hex,就必需要设置偏移地址,否则转出来的hex将是错误的。
这里准备2个文件,app.bin和app,hex。app.bin是通过jflash转出来的。
执行如下代码:
@echo off
chcp 65001
setlocal enabledelayedexpansion:: bin转hex,限制每行记录16个字节
srec_cat app_jf.bin -binary -offset 0x000 -o app_srec.hex -intel -Output_Block_Size=16echo 转化结束 pause endlocal
对比app_srec.hex和app.hex。
很多地方不一样。直接看hex内容。
可以看到,app_srec.hex的偏移地址是0,而app.hex的偏移地址为0x2000。
修改代码:
@echo off
chcp 65001
setlocal enabledelayedexpansion:: bin转hex,偏移地址为0x2000,限制每行记录16个字节
srec_cat app_jf.bin -binary -offset 0x2000 -o app_srec.hex -intel -Output_Block_Size=16echo 转化结束 pause endlocal
再次对比两个文件。
一样了。
-fill 填充数据 填充起始地址 填充结束地址
在合并Bin文件的时候,会用到该参数
srec_cat 输入文件 文件类型 -fill 填充内容 填充起始地址 填充结束地址 输入文件 文件类型 -o 输出文件 文件类型
实例:合并两个bin文件,并填充内容。
准备三个文件,boot.bin、app.bin、boot_app.bin。boot_app.bin是通过jflash转化来的。
执行如下代码:
@echo off
chcp 65001
setlocal enabledelayedexpansion:: 合并两个bin文件,不填充
srec_cat boot_jf.bin -binary app_jf.bin -binary -offset 0x2000 -o merge.bin -binaryecho 转化结束 pause endlocal
对比merge.bin和boot_app.bin
可以看到,这里有一段不一样。merge.bin的数字是0,而boot_app.bin是0xff。
看一下boot.bin文件
数据到0x1e43就已经结束了,所以0x1e43-0x2000是无数据的。srec_cat就默认填充了0.
使用-fill参数,将空白内容填充为0xff。运行如下代码:
@echo off
chcp 65001
setlocal enabledelayedexpansion:: 合并两个bin文件,填充0xff
srec_cat boot_jf.bin -binary -fill 0xff 0x00000000 0x00002000 app_jf.bin -binary -offset 0x2000 -o merge.bin -binaryecho 转化结束 pause endlocal
再对比merge.bin和boot_app.bin。
完全一样了。
-CRC16_Little_Endian 地址(计算文件CRC16并以小端输出)
在进行OTA的时候,需要提供一个校验值来保证数据传输完成后的正确性。此时CRC就是一个很常用的方式。
srec_cat 输出文件 文件类型 -CRC16_Little_Endian 地址 -o boot_crc.bin -binary
实例:计算bin文件的CRC,并记录
@echo off
chcp 65001
setlocal enabledelayedexpansion:: 计算crc
srec_cat boot_jf.bin -binary -CRC16_Little_Endian 0x00001e50 -o boot_crc.bin -binaryecho 转化结束 pause endlocal
查看boot_crc.bin文件。
在0x1e50的位置,已经有了计算的CRC。
注:如果要计算CRC32,可以把参数修改为 -CRC16_Little_Endian。