通過這種方式,可以實時檢查程序的完整性,防止盜取程序時對程序的修改。
也可以用來驗證程序的完整性,特別是IAP升級等場合。
【准備工作】
需要一個srec_cat.exe小軟件,在下面的軟件包里面。
srecord-1.64-win32.zip (1.88MB)
【理論基礎】
http://www.keil.com/support/docs/3806.htm
an277.pdf (428.74KB)
全部理論都在這個文檔上面.
【操作步驟】
注意,我是按照我們的工程操作的,其它工程大家自行做適配,推薦將CRC值放在扇區末尾,方便程序設計和配置。
1、下載此貼里面的RTX5 BOOT例子:鏈接
2、將srec_cat.exe文件,放在路徑\Project\MDK-ARM(AC5)
3、在原有的批處理文件CopyHex_Flash.bat,加上一行處理:
srec_cat.exe Objects\output.hex -intel -crop 0x08000000 0x0801FFFC -fill 0xFF 0x08000000 0x0801FFFC -STM32_Little_Endian 0x0801FFFC -o ..\output-crc.hex -intel
srec_cat.exe Objects\output.hex -intel :以hex方式讀取output.hex文件。
-crop 0x08000000 0x0801FFFC : 裁剪出0x08000000 到 0x0801FFFC 的空間(即128KB的末尾字節)。
-fill 0xFF : 未使用的空間填充0xFF。
0x08000000 0x0801FFFC -STM32_Little_Endian 0x0801FFFC : 計算0x08000000 到 0x0801FFFC的CRC值,以小端格式存儲到地址0x0801FFFC 。
..\output-crc.hex -intel : hex文件末尾帶crc值的output_crc.hex文件存在上一個目錄,對於我們工程即 \Project。
3、程序里面添加如下硬件CRC校驗:
配置好系統時鍾后,就可以調用此函數驗證當前程序的完整性。
/* ********************************************************************************************************* * 函 數 名: BootHexCrcVeriy * 功能說明: 程序完整性校驗 * 形 參: 無 * 返 回 值: 無 ********************************************************************************************************* */ #define BOOT_START 0x08000000 /* boot程序首地址 */ #define BOOT_LEN 0x0001FFFC /* 程序大小 */ #define BOOT_CRCADDR 0x0801FFFC /* bin文件的CRC計算值存儲的位置 */ __IO uint32_t uwCRCValue = 0; __IO uint32_t uwExpectedCRCValue; void BootHexCrcVeriy(void) { CRC_HandleTypeDef CrcHandle; /* 讀取bin文件的CRC */ uwExpectedCRCValue = *(__IO uint32_t *)BOOT_CRCADDR; /* 初始化硬件CRC */ __HAL_RCC_CRC_CLK_ENABLE(); CrcHandle.Instance = CRC; CrcHandle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; CrcHandle.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; CrcHandle.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; CrcHandle.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS; if (HAL_CRC_Init(&CrcHandle) != HAL_OK) { Error_Handler(__FILE__, __LINE__); } /* 計算是否與硬件CRC一致 */ uwCRCValue = HAL_CRC_Calculate(&CrcHandle, (uint32_t *)BOOT_START, BOOT_LEN/4); if (uwCRCValue != uwExpectedCRCValue) { Error_Handler(__FILE__, __LINE__); } }
4、添加MDK自動執行批處理文件:
5、下載程序,這步比較關鍵,我們要單獨下載生成的output_crc.hex文件,我這里直接使用jlink lite下載的,簡單易用:
6、完整的測試程序,可以在V7板子上面測試:
RTX5 BOOT CRC.rar (3.16MB)
最后大家可以盡情的發揮想象,怎么玩都行,可以有很多玩法。
核心就是軟件計算的CRC和STM32的硬件CRC數值一樣即可
【后續】
在原來程序的基礎上再添加一個生成的output_crc.hex文件轉換為bin文件。
1、在路徑 \Project\MDK-ARM(AC5) 里面添加了文件hex2bin.exe
2、在批處理文件CopyHex_Flash.bat里面添加 hex2bin ..\output-crc.hex
通過這兩部就可以完成,完整代碼如下:
RTX5 BOOT CRC BIN.rar (3.19MB)