首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >成功实现MDK自动生成hex文件的crc值并附加到hex文件末尾(bin也支持),然后跟STM32的硬件CRC计算值做比较

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

作者头像
Simon223
修改2025-07-02 13:37:40
修改2025-07-02 13:37:40
3.9K0
举报

通过这种方式,可以实时检查程序的完整性,防止盗取程序时对程序的修改。 也可以用来验证程序的完整性,特别是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板子上面测试:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档