本帖最后由 andeyqi 于 2023-11-28 11:04 编辑
简介:
收到日天邮寄的LPC860开发板已经有几天了,不过一直没有时间搞起来,下载资料后发现LPC860 SDK里有功能安全相关的软件包,看到其中有一条功能安全机制是运行中对image 进行CRC校验,从而保证程序运行过程中执行代码的正确无误,查看了官方的帮助文档该功能在IAR 环境是通过IAR IDE自身带的CRC校验生成工具完成的,在KEIL 和 MCUXpress 环境是通过NXP提供的工具在镜像的指定位置放置校验的CRC值和用户计算出的值进行比较验证镜像文件的正缺性,该方法理论上是个通用的方法,之前申请的LPC845 的卡发板卡本地使用的是 MCUXpress 开发环境,该环境也是被支持的,我们今天将LPC860 SDK 里面提到的功能应用到LPC845。
1.拷贝工具至工程目录
按照文档描述,需要在 MCUXpress 环境中调用,sdk 下的如下路径的工具,我们拷贝需要的文件至LPC845 工程目录下备用。
图1.1 图1.2
2.MCUXpress 开发环境加入 CRC 镜像配置
按照文档说明我们要完成以下三步的配置即可,我们按照此步骤来完成适配工作 - 1. Set the "Options → C/C++ Build → Settings → Build steps → Post-build steps"
- options correctly.
- 2. Set the debug sesion (or the GUI Flash tool) configuration correctly.
- 3. Put the "Information table" at the end of the invariable memory
复制代码- "Options → C/C++ Build →Settings → Build steps → Post-build steps" 路径下加入如下两条post build 命令
- 1.arm-none-eabi-objcopy -v -O ihex "${BuildArtifactFileName}"
- "${BuildArtifactFileBaseName}.hex"
- 2.${ProjDirPath}/crc_hex.bat -${ConfigName}/${BuildArtifactFileBaseName}.hex -
- ${ConfigName}/${BuildArtifactFileBaseName}_crc.hex -tools\\srecord\\srec_cat.exe
复制代码
图2.1 MCUXpress 配置
加入图2.1的命令后重新编译会有如下提示,说明上述命令已经正确执行只是结果是失败了。
图2.2 crc_hex.bat 脚本执行失败
修改代码及链接脚本在代码中加入配置表信息,按照文档说明定义 在link file 定义".flshcrc" 段,并在代码中引用。
图2.3 定义.flshcrc 段
图2.4 linkile 添加.flshcrc 段
重新编译代码,编译结果LOG可知镜像中已经添加CRC,对应测CRC值为CRC-32 value: 0xFE0961F0
图2.5 追加CRC编译结果
- Flash loader configuration
Open the "Debug Configurations" menu ("Run → Debug configuration")and select the "Startup" tab. In this tab, select "Load Image -> Use File ->
<YOUR_PROJECT_NAME_crc.hex". 按照上述说明配置flash loader,配置如下。
3.MCUXpress CRC 镜像检验功能验证
按照 上述三步的配置已经完成了CRC镜像校验的配置,我们追击测试命令来验证我们的功能,测试代码如下
- unsigned int crcimage(char argc,char ** argv)
- {
- uint32_t checksum32 = 0x00;
- CRC_Type *base = CRC;
- /* ***************
- * CRC-32 *
- *************** */
- InitCrc32_mpeg2(base, 0xffffFFFF);
- CRC_WriteData(base, (uint8_t *)&_image_start, &_image_size);
- checksum32 = CRC_Get32bitResult(base);
- if(checksum32 == c_sfsCRC.ui32CRC)
- PRINTF("image crc check ok %x = %x\r\n",checksum32,c_sfsCRC.ui32CRC);
- else
- PRINTF("image crc check failed %x != %x\r\n",checksum32,c_sfsCRC.ui32CRC);
- return 0;
- };
- LTSH_FUNCTION_EXPORT(crcimage,"test image crc");
复制代码 输入测试命令crcimage 执行校验结果如下:
图3.1 crc 镜像校验结果
至此已经将镜像CRC校验功能追加到LPC845开发板,理论上该方法是个通用的方法,可以用于其他处理器,NXP的工具的CRC32的校验方法使用的是Crc32_mpeg2 的校验算法,调试过程中在此也是浪费了些时间,后续有时间可以在其他处理器及KEIL上适配下理论上方法都是一致的,CRC镜像检验功能就先到这里。
=================资料分割线================ |