来源:公众号【鱼鹰谈单片机】
作者:鱼鹰Osprey
ID :emOsprey
自检内容
资料
FLASH 检查
如何检查 | 基本原理
实操
;*******************************************************************************; User Checksum - must be placed at the end of memory;*******************************************************************************AREA CHECKSUM, DATA, READONLY, ALIGN=6EXPORT __Check_Sum; Alignement here must correspond to the size of tested block at FLASH run time test (16 words ~ 64 bytes)!!!ALIGN__Check_Sum DCD 0x3D334398; ; Check sum computed externaly
ER_IROM1 0x08000000 0x10000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO)*.o (CHECKSUM, +Last) ;放置在最后}
if not exist %SREC_PATH% (echo %SREC_PATH% is not exit, exitecho ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% ---------------del %INPUT_HEX% %AXF_FILE%exit)
@echo offECHO Computing CRCECHO -------------------------------------REM Batch script for generating CRC in KEIL projectREM Must be placed at MDK-ARM folder (project folder)REM Path configurationSET SREC_PATH=C:\SRECSET MAP_NAME=STM3210C_EVALSET MAP_PATH=STM3210C_EVALSET TARGET_NAME=STM3210C_EVALSET TARGET_PATH=STM3210C_EVALSET BYTE_SWAP=1SET COMPARE_HEX=1SET CRC_ADDR_FROM_MAP=1REM Not used when CRC_ADDR_FROM_MAP=1SET CRC_ADDR=0x08007ce0REM Derived configurationSET HEX_ADRR=0x08000000SET MAP_FILE=%MAP_PATH%\%MAP_NAME%.mapSET AXF_FILE=%TARGET_PATH%\%MAP_NAME%.axfSET INPUT_HEX=%TARGET_PATH%\%TARGET_NAME%.hexSET OUTPUT_HEX=%TARGET_PATH%\%TARGET_NAME%_CRC.hexSET OUTPUT_BIN=.\%TARGET_NAME%_CRC.binSET TMP_FILE=crc_tmp_file.txtif not exist %SREC_PATH%\srec_cat.exe (echo %SREC_PATH% is not exit, exitecho ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% ---------------del %INPUT_HEX% %AXF_FILE%exit)IF NOT "%CRC_ADDR_FROM_MAP%"=="1" goto:end_of_map_extractionREM Extract CRC address from MAP fileREM -----------------------------------------------------------REM Load line with checksum location to crc_search variableECHO Extracting CRC address from MAP fileFINDSTR /R /C:"^ *CHECKSUM" %MAP_FILE%>%TMP_FILE%SET /p crc_search=<%TMP_FILE%DEL %TMP_FILE%REM remove '(' character and string after, which causes errorsfor /f "tokens=1 delims=(" %%a in ("%crc_search%") do set crc_search=%%aREM remove CHECKSUM string from variableSET crc_search=%crc_search:CHECKSUM=%REM get first word at line, which should be CRC address in HEX formatfor /f "tokens=1 delims= " %%a in ("%crc_search%") do set CRC_ADDR=%%aREM -----------------------------------------------------------REM End of CRC address extraction:end_of_map_extractionREM Compute CRC and store it to new HEX fileECHO CRC address: %CRC_ADDR%if "%BYTE_SWAP%"=="1" (REM ECHO to see what is going onECHO %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 onECHO %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% -intelREM Delete temporary fileDEL %TMP_FILE%ECHO Modified HEX file with CRC stored at %OUTPUT_HEX%REM Compare input HEX file with output HEX fileif "%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% -binaryECHO -------------------------------------
效果
工具命令解释
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 -intelC:\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 -intelC:\SREC\srec_cmp.exe STM3210C_EVAL\STM3210C_EVAL.hex -intel STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel -v如果对你有帮助,欢迎转发支持鱼鹰



















