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

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

【准备工作】

需要一个srec_cat.exe小软件,在下面的软件包里面。
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自动执行批处理文件:

【后续】

在原来程序的基础上再添加一个生成的output_crc.hex文件转换为bin文件。

1、在路径 \Project\MDK-ARM(AC5) 里面添加了文件hex2bin.exe
2、在批处理文件CopyHex_Flash.bat里面添加 hex2bin ..\output-crc.hex

通过这两部就可以完成,完整代码如下:

(3.19MB)

相关文章:

  • 2021-09-25
  • 2021-11-13
  • 2021-06-11
  • 2021-04-12
  • 2022-01-10
  • 2022-12-23
  • 2022-12-23
  • 2021-05-03
猜你喜欢
  • 2021-05-03
  • 2022-12-23
  • 2021-09-04
  • 2021-06-07
  • 2021-10-12
  • 2022-12-23
  • 2021-08-29
相关资源
相似解决方案