通過這種方式,可以實時檢查程式的完整性,防止盜取程式時對程式的修改。
也可以用來驗證程式的完整性,特别是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)
微信公衆号:armfly_com
安富萊論壇:www.armbbs.cn
安富萊淘寶:https://armfly.taobao.com