通过这种方式,可以实时检查程序的完整性,防止盗取程序时对程序的修改。
也可以用来验证程序的完整性,特别是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文件,放在路径ProjectMDK-ARM(AC5)
3、在原有的批处理文件CopyHex_Flash.bat,加上一行处理:
srec_cat.exe Objectsoutput.hex -intel -crop 0x08000000 0x0801FFFC -fill
0xFF 0x08000000 0x0801FFFC -STM32_Little_Endian 0x0801FFFC -o
..output-crc.hex -intel
srec_cat.exe Objectsoutput.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、在路径 ProjectMDK-ARM(AC5) 里面添加了文件hex2bin.exe
2、在批处理文件CopyHex_Flash.bat里面添加 hex2bin ..output-crc.hex
通过这两部就可以完成,完整代码如下:
RTX5 BOOT CRC BIN.rar (3.19MB)