"); //-->
这样可以保证,一定能够正确下载 HEX 文件,而不是下载默认的 axf 文件。
否则,下载的默认 axf 文件会因为 CRC 未修改,程序将不断重启。
完整的修改(可以自行对比官方例程文件):
@echo off ECHO Computing CRC ECHO ------------------------------------- REM Batch script for generating CRC in KEIL project REM Must be placed at MDK-ARM folder (project folder) REM Path configuration SET SREC_PATH=C:\SREC SET MAP_NAME=STM3210C_EVAL SET MAP_PATH=STM3210C_EVAL SET TARGET_NAME=STM3210C_EVAL SET TARGET_PATH=STM3210C_EVAL SET BYTE_SWAP=1 SET COMPARE_HEX=1 SET CRC_ADDR_FROM_MAP=1 REM Not used when CRC_ADDR_FROM_MAP=1 SET CRC_ADDR=0x08007ce0 REM Derived configuration SET HEX_ADRR=0x08000000 SET MAP_FILE=%MAP_PATH%\%MAP_NAME%.map SET AXF_FILE=%TARGET_PATH%\%MAP_NAME%.axf SET INPUT_HEX=%TARGET_PATH%\%TARGET_NAME%.hex SET OUTPUT_HEX=%TARGET_PATH%\%TARGET_NAME%_CRC.hex SET OUTPUT_BIN=.\%TARGET_NAME%_CRC.bin SET TMP_FILE=crc_tmp_file.txt if not exist %SREC_PATH%\srec_cat.exe ( echo %SREC_PATH% is not exit, exit echo ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% --------------- del %INPUT_HEX% %AXF_FILE% exit ) IF NOT "%CRC_ADDR_FROM_MAP%"=="1" goto:end_of_map_extraction REM Extract CRC address from MAP file REM ----------------------------------------------------------- REM Load line with checksum location to crc_search variable ECHO Extracting CRC address from MAP file FINDSTR /R /C:"^ *CHECKSUM" %MAP_FILE%>%TMP_FILE% SET /p crc_search=<%TMP_FILE% DEL %TMP_FILE% REM remove '(' character and string after, which causes errors for /f "tokens=1 delims=(" %%a in ("%crc_search%") do set crc_search=%%a REM remove CHECKSUM string from variable SET crc_search=%crc_search:CHECKSUM=% REM get first word at line, which should be CRC address in HEX format for /f "tokens=1 delims= " %%a in ("%crc_search%") do set CRC_ADDR=%%a REM ----------------------------------------------------------- REM End of CRC address extraction :end_of_map_extraction REM Compute CRC and store it to new HEX file ECHO CRC address: %CRC_ADDR% if "%BYTE_SWAP%"=="1" ( REM ECHO to see what is going on ECHO %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -byte_swap 4 ^ -stm32-b-e %CRC_ADDR% ^ -byte_swap 4 ^ -o %TMP_FILE% -intel %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -byte_swap 4 ^ -stm32-b-e %CRC_ADDR% ^ -byte_swap 4 ^ -o %TMP_FILE% -intel ) else ( REM ECHO to see what is going on ECHO %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -stm32-l-e %CRC_ADDR% ^ -o %TMP_FILE% -intel %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -stm32-l-e %CRC_ADDR% ^ -o %TMP_FILE% -intel ) ECHO %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel -exclude -within %TMP_FILE% -intel ^ %TMP_FILE% -intel ^ -o %OUTPUT_HEX% -intel %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel -exclude -within %TMP_FILE% -intel ^ %TMP_FILE% -intel ^ -o %OUTPUT_HEX% -intel REM Delete temporary file DEL %TMP_FILE% ECHO Modified HEX file with CRC stored at %OUTPUT_HEX% REM Compare input HEX file with output HEX file if "%COMPARE_HEX%"=="1" ( ECHO Comparing %INPUT_HEX% with %OUTPUT_HEX% %SREC_PATH%\srec_cmp.exe ^ %INPUT_HEX% -intel %OUTPUT_HEX% -intel -v ) del %INPUT_HEX% ECHO %SREC_PATH%\srec_cat.exe ^ %OUTPUT_HEX% -intel -offset -%HEX_ADRR% -o %OUTPUT_BIN% -binary %SREC_PATH%\srec_cat.exe ^ %OUTPUT_HEX% -intel -offset -%HEX_ADRR% -o %OUTPUT_BIN% -binary ECHO -------------------------------------
3、 CRC 计算部分代码(摘自官方例程)
完整计算
分小块计算
需要注意的是,每次全部检查完之后得复位一下 CRC 外设,否则会继续用之前的结果继续计算。
4、工程配置
准备好前面的内容后,即可进行工程配置。
生成 HEX
使用 debug 按钮时下载的文件:
crc_load.ini (需要根据自己的工程自行修改)
特别注意里面的双反斜杠,没有它,将找不到正确路径。这里以工程文件(.uvprojx)所在路径为相对路径。
使用 load 按钮时下载配置:
不然你下载(点击 load)的时候,就会下载默认的 axf 文件,而 axf 里面的 CRC 值也是默认的,并没有被修改,所以这一步也是必须的。
使用修改的分散加载文件,这可以保证我们的 CRC 存放位置在代码最后面。
最后一步,当编译完成后,让工具帮我们自动计算 CRC 值,并将值修改到 HEX 文件里面。
添加我们前面的批处理文件:
这样所有的工程配置就完成了。
效果
我们可以看看效果。
首先,我们并没有添加工具,我们可以看到,脚本自动退出了,并且删除了 hex 文件和 axf 文件,这样就不会下载错误的 HEX 文件了(点击下载会发现找不到 axf 文件)。
当我们在 C 盘添加工具后编译:
从这里我们可以得到几点信息:
1、计算范围 0x08000000 ~ 0x08007640。
2、CRC 存放位置在 0x08007640,四个字节
3、可以使用 srec_cmp.exe 比较两个 HEX 文件的区别(修改前和修改后)。这里的区别在 0x08007640 ~ 0x8007643。
4、生成的 bin 文件和 hex 文件相对存放路径。
大功告成!
工具命令解释
现在我们可以从这里了解到三个命令。
C:\SREC\srec_cat.exe STM3210C_EVAL\STM3210C_EVAL.hex -intel -crop 0x08000000 0x08007640 -byte_swap 4 -stm32-b-e 0x08007640 -byte_swap 4 -o crc_tmp_file.txt -intel
这个命令用于截取 0x08000000~0x08007640 的内容并计算 CRC 值,并且在 0x08007640 位置处写入 CRC 值。0x08007640 由 map 文件得出,即 __Check_Sum 的地址。
C:\SREC\srec_cat.exe STM3210C_EVAL\STM3210C_EVAL.hex -intel -exclude -within crc_tmp_file.txt -intel crc_tmp_file.txt -intel -o STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel
该命令用于将两个 HEX 文件合并,如果以 crc_tmp_file.txt 文件为基准,即同一个地址的值如果不同,则保留 crc_tmp_file.txt 里面的(里面有正确的 CRC),-intel 代表 HEX 文件类型。
C:\SREC\srec_cmp.exe STM3210C_EVAL\STM3210C_EVAL.hex -intel STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel -v
终于搞定啦,可以放下这个了。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。