硬汉嵌入式论坛

 找回密码
 立即注册
楼主: eric2013
收起左侧

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

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2022-6-13 19:54:25 | 显示全部楼层
yuanzhongda 发表于 2022-6-13 17:36
h743的FLASH的2M的CRC也是可以的吧,就是flash全部用的话

__attribute__((at(x)))固定到你的2M末尾即可,这样就不会全部被程序占用。

回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2022-6-16 00:40:39 | 显示全部楼层
ruboss 发表于 2021-11-13 08:54
Keil获取固件末尾的方法:

示例脚本代码,调用了SRecord的-crc32-l-e,并非对应STM32的硬件CRC模块。在普通STM32系列MCU上,需要把-crc32-l-e 改成 -STM32_Little_Endian
1.png 2.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2022-6-16 00:53:09 | 显示全部楼层
Fane_xs 发表于 2022-6-16 00:40
示例脚本代码,调用了SRecord的-crc32-l-e,并非对应STM32的硬件CRC模块。在普通STM32系列MCU上,需要把- ...

他这个是整了一个通用玩法,没有用这个-STM32_Little_Endian。

所以它的代码里面仅做了CRC使能就操作DR寄存器实现了。没有调用HAL库提供的CRC计算API。玩法不太一样。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2022-6-30 09:57:15 | 显示全部楼层
HEX格式是不是没办法根据文件hex大小加到末尾?,只能加到固定位置?
回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
发表于 2022-10-12 17:20:38 | 显示全部楼层
我试了下,这样生成的CRC的hex文件会比原来大很多,因为用了所有的地址计算,有办法解决吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2022-10-13 00:46:35 | 显示全部楼层
q779883414 发表于 2022-6-30 09:57
HEX格式是不是没办法根据文件hex大小加到末尾?,只能加到固定位置?

可以,视频教程里面改成加到末尾了

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

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2022-10-13 00:47:09 | 显示全部楼层
yuanzhongda 发表于 2022-10-12 17:20
我试了下,这样生成的CRC的hex文件会比原来大很多,因为用了所有的地址计算,有办法解决吗

不正常,CRC本身代码非常小的。
回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
发表于 2022-10-13 08:32:54 | 显示全部楼层
eric2013 发表于 2022-10-13 00:47
不正常,CRC本身代码非常小的。

-fill 0xFF  我发现是因为这个导致的,这个有必要加吗
回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
发表于 2022-10-13 08:45:24 | 显示全部楼层
eric2013 发表于 2022-10-13 00:47
不正常,CRC本身代码非常小的。

srec_cat.exe app.hex -intel -crop 0x08040000 0x081FFFFC  -fill 0xFF 0x08040000 0x081FFFFC -o .\appcrc.hex -intel   我是用的全部flash,是不是因为加了-fill 0xFF 很多的ff导致的,这个有必要吗
回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
发表于 2022-12-9 14:36:36 | 显示全部楼层
我现在用的是雅特力的CRC32,计算的flash大小也要4字节对齐,怎么保证生成的app固件的大小是4字节的倍数,还是说32位的MCU生成的固件大小都是4字节的倍数
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2022-12-9 15:48:35 | 显示全部楼层
薪火相传 发表于 2022-12-9 14:36
我现在用的是雅特力的CRC32,计算的flash大小也要4字节对齐,怎么保证生成的app固件的大小是4字节的倍数,还 ...

视频教程里面分享这个问题了。

BSP视频教程第18期:基于NAND,eMMC,SD卡和U盘的BootLoader实战,带CRC完整性校验(2022-06-16)
https://www.armbbs.cn/forum.php? ... 3053&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2022-12-22 09:14:41 | 显示全部楼层
eric2013 发表于 2022-10-13 00:46
可以,视频教程里面改成加到末尾了

这个是放到末尾的。

我现在的做法是 生成bin文件把CRC加到末尾,再把BIN文件转换成HEX。 我想问的是 有没有直接把CRC加到HEX文件末尾的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2022-12-22 11:01:37 | 显示全部楼层
q779883414 发表于 2022-12-22 09:14
我现在的做法是 生成bin文件把CRC加到末尾,再把BIN文件转换成HEX。 我想问的是 有没有直接把CRC加到HEX ...

51楼的回复就是,换了个批处理方法。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-12-22 17:57:19 | 显示全部楼层

h743的FLASH的2M的CRC也是可以的吧,就是flash全部用的话
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2022-12-23 10:09:52 | 显示全部楼层
w356877795 发表于 2022-12-22 17:57
h743的FLASH的2M的CRC也是可以的吧,就是flash全部用的话

是的。此时考虑将CRC值存到其它地方了。
回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
发表于 2023-1-5 10:36:42 | 显示全部楼层
这个小程序是以32位为地址进行计算的吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2023-1-5 13:04:19 | 显示全部楼层
yuanzhongda 发表于 2023-1-5 10:36
这个小程序是以32位为地址进行计算的吗

没太理解你的意思,32位是想表达4字节对齐?
回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
发表于 2023-1-5 14:47:15 | 显示全部楼层
eric2013 发表于 2023-1-5 13:04
没太理解你的意思,32位是想表达4字节对齐?

有个问题我不太清楚,就是这个bin文件如果长度不是4的倍数,比如11个字节,它是先对其到4的倍数,再计算,然后再存放在第13~16字节的位置吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2023-1-6 00:19:44 | 显示全部楼层
yuanzhongda 发表于 2023-1-5 14:47
有个问题我不太清楚,就是这个bin文件如果长度不是4的倍数,比如11个字节,它是先对其到4的倍数,再计算 ...

一定是4字节的整数倍,应该是规约要求还什么,你可以实测下,转换的bin基本不会出现不是4字节的整数倍。

及时不是也没有关系,解决办法比较好弄,使用软件HEX NEO手动添加0就行行,这个在视频教程里面做了新的实现,直接把CRC值放在程序末尾,比此贴的实现更实用些。
BSP视频教程第18期:基于NAND,eMMC,SD卡和U盘的BootLoader实战,带CRC完整性校验(2022-06-16)
https://www.armbbs.cn/forum.php? ... 3053&fromuid=58
(出处: 硬汉嵌入式论坛)



回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2023-8-25 10:13:25 | 显示全部楼层
0x08000000 0x0801FFFC -STM32_Little_Endian 0x0801FFFC   : 计算0x08000000 到 0x0801FFFC的CRC值,以小端格式存储到地址0x0801FFFC 。         这个地方计算的CRC32是常规的计算方式吗?我现在使用GD32的芯片,GD32计算的CRC32是CRC32-MPEG-2方式,现在和这个工具算的不一致,我看-STM32_Little_Endian 这个参数有很多不一样的,算出来结果也不一样,不知道哪里有这个参数的说明,
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-10-19 14:34:19 | 显示全部楼层
楼主,最近项目有这个需求,最终烧入的文件是output.crc.hex 嘛
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2023-10-19 15:01:54 | 显示全部楼层
Embedded_Proter 发表于 2023-10-19 14:34
楼主,最近项目有这个需求,最终烧入的文件是output.crc.hex 嘛

芯片内部运行的必须得是bin,下载器下载的时候你可以选择hex或者bin
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-10-19 15:25:15 | 显示全部楼层
eric2013 发表于 2023-10-19 15:01
芯片内部运行的必须得是bin,下载器下载的时候你可以选择hex或者bin

好的 ,非常感谢    最近才发现您管理的这个硬核论坛 , 相见恨晚呀
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-5-19 17:12:39 | 显示全部楼层
我想问下,如果把带CRC的bin文件写进Flash里,不就会把CRC值也写进Flash吗,这样是没问题的吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2024-5-20 08:51:11 | 显示全部楼层
gdw001107 发表于 2024-5-19 17:12
我想问下,如果把带CRC的bin文件写进Flash里,不就会把CRC值也写进Flash吗,这样是没问题的吗

没问题。

并且这个是用户boot自编程更新app的,可以选择不将CRC所在位置的内容更新到Flash里面。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-7-19 12:17:14 | 显示全部楼层
ruboss 发表于 2021-11-13 08:54
Keil获取固件末尾的方法:

这个适用于bin文件在bat文件的当前目录下,
如果bin文件在其他的目录下,比如:out\Debug\
试了一下会出现这个:Cyclic_Redundancy_Check_32_Little_Endian filter requires an address

要加一个命令,把bin文件复制到当前目录 就好了
[C] 纯文本查看 复制代码
copy out\Debug\app.bin 

@echo off
for /f %%i in ('dir /b app.bin') do (
    set indexdx=%%~zi
    echo File size: %indexdx% bytes
)
ECHO Final file size: %indexdx% bytes
srec_cat.exe app.bin -Binary -crop 0 %indexdx% -crc32-l-e %indexdx% -o app_xxx.bin -Binary
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
发表于 2024-9-3 15:56:40 | 显示全部楼层
大佬,生成的crc32能用软件校验法吗,用的单片机不是stm32也没有硬件crc功能
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
发表于 2024-9-3 16:01:25 | 显示全部楼层
大佬,生成的crc32能用软件校验法吗,用的单片机不是stm32也没有硬件crc功能
回复

使用道具 举报

14

主题

254

回帖

296

积分

高级会员

积分
296
发表于 2024-9-3 16:32:24 | 显示全部楼层
我好奇能把CRC校验藏在代码中间吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2024-9-4 08:23:29 | 显示全部楼层
yyyiiiaaannn 发表于 2024-9-3 15:56
大佬,生成的crc32能用软件校验法吗,用的单片机不是stm32也没有硬件crc功能

可以用软件CRC,计算一样即可。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2024-9-4 08:25:39 | 显示全部楼层
zhang0352505 发表于 2024-9-3 16:32
我好奇能把CRC校验藏在代码中间吗?

可以,这样的话,适合计算完毕后填充到对应的位置。验证的时候把这个位置的值提取出来,换成之前的计算CRC时的值,再验证。
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-10-10 10:06:26 | 显示全部楼层
硬汉老师,上面图片显示不了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2024-10-10 10:11:30 | 显示全部楼层
永远是小学生 发表于 2024-10-10 10:06
硬汉老师,上面图片显示不了

1楼的图片吗,你刷新下试试。
回复

使用道具 举报

78

主题

277

回帖

511

积分

金牌会员

积分
511
发表于 2024-10-15 10:56:07 来自手机 | 显示全部楼层
脚本在IAR下也可以通用吧
回复

使用道具 举报

23

主题

72

回帖

141

积分

初级会员

积分
141
发表于 2024-10-15 17:33:57 | 显示全部楼层
iar有办法放到文件默认,程序里面读取到么?IAR本身提供的只能放到固定地址
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2024-10-16 09:44:30 | 显示全部楼层
zbq 发表于 2024-10-15 17:33
iar有办法放到文件默认,程序里面读取到么?IAR本身提供的只能放到固定地址

可以的,IAR也可以执行脚本处理的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2024-10-16 09:44:59 | 显示全部楼层
logo 发表于 2024-10-15 10:56
脚本在IAR下也可以通用吧

对,IAR也可以脚本处理。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2024-10-17 15:26:01 | 显示全部楼层
测试成功,在BIN文件末尾增加CRC ,感谢eric2013 ,wander    @echo off setlocal enabledelayedexpansion  :: 检查必要的输入文件是否存在 if not exist "Objects\output.hex" (     echo Error: Objects\output.hex does not exist.     exit /b 1 )  if not exist "app.bin" (     echo Error: app.bin does not exist.     exit /b 1 )  :: 获取 app.bin 文件的大小 for /f %%i in ('dir /b .\app.bin') do (     set indexdx=%%~zi ) ECHO File size: %indexdx%  :: 使用 srec_cat 处理文件并添加 CRC32 校验码 srec_cat.exe app.bin -Binary -crop 0 %indexdx%  -crc32-l-e %indexdx%  -o app_becu.bin -Binary if errorlevel 1 (     echo Error: Failed to process app.bin with srec_cat.     exit /b 1 )  :: 将处理后的文件复制到上级目录 copy app_becu.bin ..\app_becu.bin if errorlevel 1 (     echo Error: Failed to copy app_becu.bin.     exit /b 1 )  echo Process completed successfully. endlocal
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2024-10-17 15:29:28 | 显示全部楼层
感谢 eric2013,  生成BIN文件, 把CRC 加在BIN文件末位,已测试成功。
@echo off
setlocal enabledelayedexpansion

:: 检查必要的输入文件是否存在
if not exist "Objects\output.hex" (
    echo Error: Objects\output.hex does not exist.
    exit /b 1
)

if not exist "app.bin" (
    echo Error: app.bin does not exist.
    exit /b 1
)

:: 获取 app.bin 文件的大小
for /f %%i in ('dir /b .\app.bin') do (
    set indexdx=%%~zi
)
ECHO File size: %indexdx%

:: 使用 srec_cat 处理文件并添加 CRC32 校验码
srec_cat.exe app.bin -Binary -crop 0 %indexdx%  -crc32-l-e %indexdx%  -o app_becu.bin -Binary
if errorlevel 1 (
    echo Error: Failed to process app.bin with srec_cat.
    exit /b 1
)

:: 将处理后的文件复制到上级目录
copy app_becu.bin ..\app_becu.bin
if errorlevel 1 (
    echo Error: Failed to copy app_becu.bin.
    exit /b 1
)

echo Process completed successfully.
endlocal
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
 楼主| 发表于 2024-10-18 09:32:20 | 显示全部楼层
q16312610 发表于 2024-10-17 15:29
感谢 eric2013,  生成BIN文件, 把CRC 加在BIN文件末位,已测试成功。
@echo off
setlocal enabledelaye ...

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 04:01 , Processed in 3.087212 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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