首页  /  世界杯2012  /  成功实现MDK自动生成hex文件的crc值并附加到hex文件末尾(bin也支持),然后跟STM32的硬件CRC计算值做比较

成功实现MDK自动生成hex文件的crc值并附加到hex文件末尾(bin也支持),然后跟STM32的硬件CRC计算值做比较

世界杯2012 9889

通过这种方式,可以实时检查程序的完整性,防止盗取程序时对程序的修改。

也可以用来验证程序的完整性,特别是IAP升级等场合。

【准备工作】

需要一个srec_cat.exe小软件,在下面的软件包里面。

srecord-1.64-win32.zip (1.88MB)

【理论基础】

http://www.keil.com/support/docs/3806.htm

3、程序里面添加如下硬件CRC校验:

配置好系统时钟后,就可以调用此函数验证当前程序的完整性。

代码语言:javascript复制/*

*********************************************************************************************************

* 函 数 名: 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板子上面测试: