硬汉嵌入式论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: eric2013
收起左侧

[STM32H7] 成功实现MDK自动生成hex文件的crc值并附加到hex文件末尾(bin也支持),然后跟STM32的硬件CRC计算值做比较

  [复制链接]

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-11-7 10:11:50 | 显示全部楼层
硬汉老师,这种方法可以更改校验的方式吗?比如说把CRC-32改成CRC-32/MPEG-2这种方式。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 2024-11-7 12:01:21 | 显示全部楼层
永远是小学生 发表于 2024-11-7 10:11
硬汉老师,这种方法可以更改校验的方式吗?比如说把CRC-32改成CRC-32/MPEG-2这种方式。

可以,但是需要你两端的校验方式一致即可
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2024-11-7 13:54:10 | 显示全部楼层
eric2013 发表于 2024-11-7 12:01
可以,但是需要你两端的校验方式一致即可

硬汉老师指导指导
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 2024-11-8 09:26:57 | 显示全部楼层

你做个上位机软件生成即可。然后同样的CRC代码也在你的板子端实现下
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-2-11 14:05:39 来自手机 | 显示全部楼层
请问有老师做过linux下生成的可执行程序中添加crc校验值嘛
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 2025-2-12 07:21:26 | 显示全部楼层
a1164641067 发表于 2025-2-11 14:05
请问有老师做过linux下生成的可执行程序中添加crc校验值嘛

可以使用IAR,IAR的Linux版支持末尾添加CRC。
回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
发表于 2025-9-23 22:11:00 | 显示全部楼层
wander 发表于 2020-8-5 08:56
我也做了一个,我是直接的在生成的raw.bin最后增加4B的CRC校验。
1,fromelf --bin --output raw.bin "#L" ...

请问大佬 这个怎么实现的?我用您这两条指令,不能生成带CRC校验的bin文件
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 2025-9-24 08:51:15 | 显示全部楼层
caoenq 发表于 2025-9-23 22:11
请问大佬 这个怎么实现的?我用您这两条指令,不能生成带CRC校验的bin文件

这个帖子例子的批处理改成设置到文件末尾了。

BSP视频教程第18期:基于NAND,eMMC,SD卡和U盘的BootLoader实战,带CRC完整性校验(2022-06-16)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=113053
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2025-12-6 17:08:42 | 显示全部楼层
在原来程序的基础上再添加一个生成的output_crc.hex文件转换为bin文件。  1、在路径 \Project\MDK-ARM(AC5) 里面添加了文件hex2bin.exe 2、在批处理文件CopyHex_Flash.bat里面添加 hex2bin ..\output-crc.hex进行以上操作后无法生成bin.文件,但是前面的生成hex的成功的
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 2025-12-8 09:43:03 | 显示全部楼层
华清老头儿 发表于 2025-12-6 17:08
在原来程序的基础上再添加一个生成的output_crc.hex文件转换为bin文件。  1、在路径 \Project\MDK-ARM(AC5) ...

直接手动运行批处理,正常不
回复

使用道具 举报

14

主题

50

回帖

92

积分

初级会员

积分
92
发表于 2025-12-20 00:26:39 | 显示全部楼层
如果想将计算的crc合并到hex文件中是不是也可行,思路:
1、hex转bin;
2、得到bin大小,并计算crc;
3、根据已知烧写首地址,根据bin大小,得到crc实际写入到mcu的地址,生成只有crc四个数据的crc.hex;
4、合并源hex文件和生成的crc.hex文件;
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 2025-12-20 10:21:45 | 显示全部楼层
walk 发表于 2025-12-20 00:26
如果想将计算的crc合并到hex文件中是不是也可行,思路:
1、hex转bin;
2、得到bin大小,并计算crc;

可以。
回复

使用道具 举报

14

主题

50

回帖

92

积分

初级会员

积分
92
发表于 2025-12-20 23:27:23 | 显示全部楼层

分享以下脚本,在bin和hex尾部增加CRC,并单独生产CRC的bin文件,合并app和boot的hex文件

//拷贝文件到xxx文件夹
copy demo\demo.hex .\demo.hex

//hex转bin文件
hex2bin demo.hex

//计算bin文件大小
for /f %%i in ('dir /b demo.bin') do (
set indexdx=%%~zi
)
//打印大小
ECHO %indexdx%

//计算bin文件CRC并将结果追加到bin尾部
srec_cat.exe demo.bin -Binary -Crop 0 %indexdx%  -STM32_Little_Endian %indexdx%  -o demo_CRC.bin -Binary

//计算hex文件CRC,单独生成CRC bin文件
srec_cat.exe demo.hex -Intel -STM32_Little_Endian 0x00000000 -Crop 0x00000000 0x00000004 -o crc_only.bin -Binary

//bin文件转hex,0x08020000为APP起始地址
srec_cat.exe demo_CRC.bin -Binary -Offset 0x08020000 -o demo_CRC.hex -Intel -Output_Block_Size=16

//合并两个hex文件
srec_cat.exe demo_CRC.hex -Intel demo_boot.hex -Intel -o demo_combined.hex -Intel -Output_Block_Size=16
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2025-12-31 16:04:36 | 显示全部楼层
遇到个问题,现在bootloader程序中已经实现了AES128校验,APP生成的bin文件需要16字节对齐,再用AES加密器打包,到bootloader再解密烧写。现在想在生成的bin文件末尾加上CRC校验值校验整文件的完整性,但不知道怎么保证增加CRC后的bin文件16字节对齐。要是生成的不对齐,自己在CRC校验值后面手动填充ff,到bootloader去校验CRC时就很麻烦了。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 3 天前 | 显示全部楼层
lpc980408 发表于 2025-12-31 16:04
遇到个问题,现在bootloader程序中已经实现了AES128校验,APP生成的bin文件需要16字节对齐,再用AES加密器 ...

这个现在同样遇到要是一开始只烧写boot,可以通过之后烧写的bin文件大小来确定应用程序的长度和CRC的位置。但是现在想把boot和APP在第一次烧写时就一起烧进去,然后APP执行一个上电检验的工程,等板子加工回来
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 3 天前 | 显示全部楼层
lpc980408 发表于 2025-12-31 16:04
遇到个问题,现在bootloader程序中已经实现了AES128校验,APP生成的bin文件需要16字节对齐,再用AES加密器 ...

这个问题可以通过批处理命令填充0xff,固定地址或者每次根据生成的文件修改批处理命令里的地址手动对齐。
现在遇到的问题是,boot不好获取app的程序长度。要是一开始只烧写片内的boot,再通过通讯的方式获取APP的bin文件是可以知道长度的。但是现在应用场景要求boot和APP要一开始就一起下载,执行APP的功能做板子的自动检测,然后再通过通讯烧写正式的程序,一起下载的时候整合的hex文件里没有包含程序大小,就找不到CRC在哪了。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 前天 00:24 | 显示全部楼层
lpc980408 发表于 2026-1-6 18:33
这个问题可以通过批处理命令填充0xff,固定地址或者每次根据生成的文件修改批处理命令里的地址手动对齐。 ...

可以搞个骚操作,app的bin文件开头是中断向量表,向量表里面有几个reserve保留地址,程序生成app后,把程序大小通过批处理填充进去。

不知道满足需求不
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 前天 15:39 | 显示全部楼层
eric2013 发表于 2026-1-7 00:24
可以搞个骚操作,app的bin文件开头是中断向量表,向量表里面有几个reserve保留地址,程序生成app后,把程 ...

在APP部分,__attribute__指定全局变量存储在片上flash地址特定地址,
用const修饰该全局变量
最后编译完成后执行脚本,脚本获取程序大小,
将对应大小和校验信息替换掉源程序中对应flash地址上的数据,
利用该方法可以把程序的编译时间,文件大小,自定义校验码等等都存放到整合的hex/bin中
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 前天 15:51 | 显示全部楼层
本帖最后由 大家伙好 于 2026-1-7 16:06 编辑
大家伙好 发表于 2026-1-7 15:39
在APP部分,__attribute__指定全局变量存储在片上flash地址特定地址,
用const修饰该全局变量
最后编译 ...

用C/C++编写可执行程序,将bootloader和app编译后的bin文件合并,
可以做到一次性把boot和app烧录进去,
不需要再借用网上那些hex/bin合并工具,
该可执行程序,可用keil中after build调用传参。


AI提示词如下:
keil 编写C++代码,用于将编译生成后的bin与其他bin合并。
通过传参获取以下参数,
1、编译后的bin文件路径
2、其他bin文件路径
3、合并后的bin文件路径
4、指定自定义存储校验信息的flash偏移地址(十六进制参数)

有兴趣可以自行尝试调试,已在实际项目中应用,
公司代码不便于贴到论坛上

附图
示例.png
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 前天 16:30 | 显示全部楼层
大家伙好 发表于 2026-1-7 15:51
用C/C++编写可执行程序,将bootloader和app编译后的bin文件合并,
可以做到一次性把boot和app烧录进去, ...

我的方案更进一步,自动递增版本号,提交git,编译,bin文件插入CRC、文件size和git commit id
相关的变量地址是读取源文件获取的
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 昨天 10:37 | 显示全部楼层
大家伙好 发表于 2026-1-7 15:39
在APP部分,__attribute__指定全局变量存储在片上flash地址特定地址,
用const修饰该全局变量
最后编译 ...

谢谢分享,这个方法也行。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
 楼主| 发表于 昨天 10:41 | 显示全部楼层
Dravince 发表于 2026-1-7 16:30
我的方案更进一步,自动递增版本号,提交git,编译,bin文件插入CRC、文件size和git commit id
相关的变 ...

终于找到了,就是你分享的这个帖子,我记得有个坛友分享了挺方波的方案,想不起来关键词了,回复的时候还尝试检索了几次,没找到。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 昨天 12:01 | 显示全部楼层
Dravince 发表于 2026-1-7 16:30
我的方案更进一步,自动递增版本号,提交git,编译,bin文件插入CRC、文件size和git commit id
相关的变 ...

你这个方案更牛,直接读取项目文件获取flash地址,不用手动填
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 昨天 12:20 | 显示全部楼层
eric2013 发表于 2026-1-8 10:41
终于找到了,就是你分享的这个帖子,我记得有个坛友分享了挺方波的方案,想不起来关键词了,回复的时候还 ...

看来我的名字起的不够响亮
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-9 16:43 , Processed in 0.076206 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表