<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > CRC校驗 | 程序如何檢查自身完整性?(2)

CRC校驗 | 程序如何檢查自身完整性?(2)

發(fā)布人:魚(yú)鷹談單片機 時(shí)間:2021-08-12 來(lái)源:工程師 發(fā)布文章

這樣可以保證,一定能夠正確下載 HEX 文件,而不是下載默認的 axf 文件。

否則,下載的默認 axf 文件會(huì )因為 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 計算部分代碼(摘自官方例程)

完整計算

7.png

分小塊計算

8.png

需要注意的是,每次全部檢查完之后得復位一下 CRC 外設,否則會(huì )繼續用之前的結果繼續計算。

4、工程配置

準備好前面的內容后,即可進(jìn)行工程配置。

生成 HEX

9.png

使用 debug 按鈕時(shí)下載的文件:

crc_load.ini (需要根據自己的工程自行修改)

10.png

特別注意里面的雙反斜杠,沒(méi)有它,將找不到正確路徑。這里以工程文件(.uvprojx)所在路徑為相對路徑。

11.png

使用 load 按鈕時(shí)下載配置:

12.png

不然你下載(點(diǎn)擊 load)的時(shí)候,就會(huì )下載默認的 axf 文件,而 axf 里面的 CRC 值也是默認的,并沒(méi)有被修改,所以這一步也是必須的。

使用修改的分散加載文件,這可以保證我們的 CRC 存放位置在代碼最后面。

13.png

最后一步,當編譯完成后,讓工具幫我們自動(dòng)計算 CRC 值,并將值修改到 HEX 文件里面。

添加我們前面的批處理文件:

14.png

這樣所有的工程配置就完成了。

效果

我們可以看看效果。

首先,我們并沒(méi)有添加工具,我們可以看到,腳本自動(dòng)退出了,并且刪除了 hex 文件和 axf 文件,這樣就不會(huì )下載錯誤的 HEX 文件了(點(diǎn)擊下載會(huì )發(fā)現找不到 axf 文件)。

15.png16.png

當我們在 C 盤(pán)添加工具后編譯:

17.png

從這里我們可以得到幾點(diǎn)信息:

1、計算范圍 0x08000000 ~ 0x08007640。

2、CRC 存放位置在 0x08007640,四個(gè)字節

3、可以使用 srec_cmp.exe 比較兩個(gè) HEX 文件的區別(修改前和修改后)。這里的區別在 0x08007640 ~ 0x8007643。

4、生成的 bin 文件和 hex 文件相對存放路徑。

18.png

大功告成!

工具命令解釋

現在我們可以從這里了解到三個(gè)命令。

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

這個(gè)命令用于截取 0x08000000~0x08007640 的內容并計算 CRC 值,并且在 0x08007640 位置處寫(xiě)入 CRC 值。0x08007640 由 map 文件得出,即 __Check_Sum 的地址。

19.png

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

該命令用于將兩個(gè) HEX 文件合并,如果以 crc_tmp_file.txt 文件為基準,即同一個(gè)地址的值如果不同,則保留 crc_tmp_file.txt 里面的(里面有正確的 CRC),-intel 代表 HEX 文件類(lèi)型。

C:\SREC\srec_cmp.exe   STM3210C_EVAL\STM3210C_EVAL.hex -intel STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel -v

終于搞定啦,可以放下這個(gè)了。

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。

斷路器相關(guān)文章:斷路器原理


高壓真空斷路器相關(guān)文章:高壓真空斷路器原理
漏電斷路器相關(guān)文章:漏電斷路器原理


關(guān)鍵詞: 單片機

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>