如何在Keil和IAR环境编译生成的bin文件添加CRC校验值

之前写过一篇文章介绍过 CRC 的原理和应用。在程序升级的情况下,我们可以在烧录下载的 bin 文件添加 CRC 校验值,以校验我们获取的bin文件是否正确。

下面我打算使用 APM32F407 的工程代码,介绍下如何在 Keil 环境和 IAR 环境对编译生成的 bin 文件添加 CRC 校验值。

准备:

1、首先你得准备一个可以正常编译运行的 Keil 和 IAR 工程。

1. 基于IAR环境

IAR软件自带了 IAR ELF Tool 这个工具,它可以把编译生成的bin文件添加CRC校验码,所以使用起来也比较简单就能获得CRC的校验码。只要修改下选项配置还有配合修改下链接文件就可以了。

对于如何在bin文件添加CRC校验码,IAR官方网站也有相关介绍,如下:

https://www.iar.com/knowledge/support/technical-notes/general/calculate-crc32-as-in-stm32-hardware-v.5.50-and-later/

1.1 修改Options配置界面

1.1.1 Checksum选项配置

因为是是要把CRC校验码链接到我们编译生成的bin文件,所以肯定是要配置链接相关的参数的。

在这里插入图片描述

该页面有两部分配置。

第一部分是Flash的起始和结束地址,介绍地址要留出4字节的大小存放CRC校验值。然后剩余的Flash空间用0xFF填充。一般来说我们可以把CRC校验值存放在Flash空间的结束地址,这样在查找bin文件的CRC值时比较容易找到。

第二部分是生成CRC校验码的参数配置,我们要配置为和自己使用的CRC模型一致的配置,对于MCU自动的硬件CRC来说,大多数都是CRC32的模型。

该界面CRC参数的一些配置解释:

  • 1、Checksum size:CRC校验值的大小,4字节

  • 2、Alignment:指定校验值的对齐方式,4字节

  • 3、Algorithm:指定算法。CRC32 (0x4C11DB7)

  • 4、Complement:是否进行补码运算。as is 选择保留原样

  • 5、Bit order:位顺序。MSB优先

  • 6、Reverse byte order within word:反转字内的字节顺序

  • 7、Initial value:初始值。0xFFFFFFFF

  • 8、Checksum unit size:指定校验和进行迭代时的单元大小

1.1.2 Extra Options添加一条命令

在配置好 Checksum 选项是,我编译程序是发现并没有把CRC校验值添加值Bin文件指定的位置。网上找了好久,说需要添加 –keep __checksum 这条命令,然后可以防止IAR优化掉CRC变量值。

在这里插入图片描述

1.1.3 生成bin文件

如果还需要bin文件的画卷,选择下面的选项配置。

在这里插入图片描述

1.2 修改IAR链接文件

我们找到对应MCU的 .icf 文件(一般在对应的IAR安装目录下 .\arm\config\linker ),然后复制一份到自己的工程目录下进行修改。主要其实就是根据前面的 Checksum 配置,把CRC值存放的地址,在 .icf 文件要对应修改链接进代码里面。

place at address mem:0x0803FFFC { readonly section .checksum };

只要在 .icf 文件添加上面的语句就行。但是 0x0803FFFC 这个地址要与 Checksum 界面的配置要一致。

然后在配置界面,选择这个 icf 文件作为IAR链接文件,如下:

在这里插入图片描述

1.3 验证IAR生成的bin文件CRC值是否正确

我们可以写代码测试一下,使用IAR在bin文件生成的这个CRC值,是否正确。

首先我们可以使用芯片自带的CRC硬件计算(当然也可以使用软件CRC),从 0x08000000 起始地址开始读取,直到 0x0803FFFC 这个地址结束,读取这个区间Flash的内容,然后计算出来的结果,与IAR软件计算出来的结果进行比较是否相等。如果相等那么说明IAR生成的bin文件CRC值时正确的。

主要代码如下:

extern uint32_t __checksum;/* Calculate bin file CRC value */
uCRCValue = CRC_CalculateBlockCRC((uint32_t *)0x08000000, (0x40000 - 4) / 4);
LOG_Print("CalculateBlockCRC = 0x%08X, IAR_CRC_CheckVal = 0x%08X \r\n", uCRCValue, __checksum);   if (uCRCValue == __checksum)
{LOG_Print("IAR CRC32 successful\r\n");APM_MINI_LEDOn(LED2);
}
else
{LOG_Print("IAR CRC32 error\r\n");APM_MINI_LEDOn(LED3);
}

__checksum 这个变量,其实就是IAR软件生成CRC校验值的一个内部变量,使用这个值与我们读取Flash的数据计算出来的值进行比较,测试两者是否相等。

2. 基于Keil环境

Keil平台,是没有像IAR平台那样,自身带有一个工具可以为bin文件生成CRC校验值。所以,要在Keil环境中添加CRC校验码,就需要借助第三方的工具。

下面我 srecord 这个工具生成 CRC 校验码,然后再使用 hex2bin 工具把具有CRC校验码的 hex 文件转换为bin文件。

srecord 工具官网:

https://srecord.sourceforge.net/

hex2bin 工具下载:

https://sourceforge.net/projects/hex2bin/

2.1 工具配置

把之前下载好的 srecord 工具包,其中的一个 srec_cat.exe 工具,放到keil的工程t同级目录下面。

在这里插入图片描述

然后 hex2bin 工具也是,放到keil的工程同级目录下。

2.2 编写 .bat 命令脚本

我们编写一份 .bat 文件的命令脚本,以供 keil 调用 srecordhex2bin 工具去生成bin文件。

我自己编写名为 hex_crc.bat 文件,其内容如下:

srec_cat.exe .\out\CRC_Calculation_Bin_CRC.hex -intel -crop 0x08000000 0x0803FFFC -fill 0xFF 0x08000000 0x0803FFFC -STM32_Little_Endian 0x0803FFFC -o .\output_crc_mdk.hex -intelhex2bin .\output_crc_mdk.hex

第一条命令就是使用 srec_cat 这个工具,生成带有 CRC 校验码的hex文件。然后再把这个hex文件,使用 hex2bin 工具生成bin文件。

2.3 Keil配置

然后keil里面配置,编译完代码之后,执行刚刚的哪个 .bat 文件就可以生成带有CRC校验码的hex文件和bin文件了。

在这里插入图片描述

2.4 测试验证

Keil环境生成的CRC校验码的bin文件,验证方法和IAR环境生成的也是一样的。都是计算 0x08000000~0x0803FFFC 之间的CRC校验值,然后和Keil环境生成的bin文件的CRC值进行对比,验证是否相等。

代码思路也是一样的,如下:

uint32_t MDK_CRC_CheckVal = *((uint32_t *) 0x0803FFFC);/* Calculate bin file CRC value */
uCRCValue = CRC_CalculateBlockCRC((uint32_t *)0x08000000, (0x40000 - 4) / 4);
LOG_Print("\r\nCalculateBlockCRC = 0x%08X, MDK_CRC_CheckVal = 0x%08X \r\n", uCRCValue, MDK_CRC_CheckVal);   if (uCRCValue == MDK_CRC_CheckVal)
{LOG_Print("MDK CRC32 Check successful\r\n");APM_MINI_LEDOn(LED2);
}
else
{LOG_Print("MDK CRC32 Check error\r\n");APM_MINI_LEDOn(LED3);
}

然后可以通过J-Flash工具烧写bin文件,查看运行结果如下。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/147338.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetCode 45.跳跃游戏 II 贪心算法

45. 跳跃游戏 II - 力扣(LeetCode) 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 &…

【算法——双指针】LeetCode 18 四数之和

题目描述: 解题思路:双指针 四数之和与前面三数之和思路一样,排序后,枚举 nums[a]作为第一个数,枚举 nums[b]作为第二个数,那么问题变成找到另外两个数,使得这四个数的和等于 target&#xff0c…

面试题:熟悉设计模式吗?谈谈简单工厂模式和策略模式的区别

刚刚接触设计模式的时候,我相信单例模式和工厂模式应该是用的最多的,毕竟很多的底层代码几乎都用了这些模式。自从接触了一次阿里的公众号发的一次文章关于 DDD的使用 以后,就逐渐接触了策略模式。现在在项目中运用最多的也是这几种设计模式了…

【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客 1 . 队列(Queue) 队列的概念和结构&#xf…

【Linux】文件权限详解

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁 🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的…

国庆作业6

TCP服务器 #include "head.h" #define PORT 2580 //端口号 #define IP "192.168.31.219" //本机IP int main(int argc, const char *argv[]) {sqlite3* dbNULL;if(sqlite3_open("./my.db",&db)!SQLITE_OK){fprintf(stde…

Java 随机数的获得方法(5种)

1. Math.random() 静态方法 产生的随机数是 0 - 1 之间的一个 double&#xff0c;即 0 < random < 1 代码&#xff1a; 结果&#xff1a; 当调用 Math.random() 方法时&#xff0c;自动创建了一个伪随机数生成器&#xff0c;实际上用的是 new java.util.Random()。当接…

pwnable_hacknote

pwnable_hacknote Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8047000)32位&#xff0c;没开PIE main部分就不贴了&#xff0c;直接贴主要的函数 unsigned int ADD() {int v0; // ebxint i; // [e…

【Kafka专题】Kafka快速实战以及基本原理详解

目录 前言课程内容一、Kafka介绍1.1 MQ的作用1.2 为什么用Kafka 二、Kafka快速上手2.1 实验环境2.2 单机服务体验2.3 认识Kafka模型架构2.4 Kafka集群2.5 理解服务端的Topic、Partion和Broker2.6 章节总结&#xff1a;Kafka集群的整体结构 三、Kraft集群&#xff08;拓展&#…

【计算机网络】高级IO之select

文章目录 1. 什么是IO&#xff1f;什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误&#xff1f;对错误码的进一步判断检测数据没有就绪时&#xff0c;返回做一些其他事情完整代码myt…

Linux和本地Windows如何互传文件(sz和rz指令)

目录 关于 rzsz 注意事项 安装软件 rz的使用&#xff08;本地主机文件传到Windows中&#xff09; sz的使用(Linux中的文件传到本地Windows主机中) 关于 rzsz 这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过直接拖拽的方式将文件…

【源码】hamcrest 源码阅读及空对象模式、模板方法模式的应用

文章目录 前言1. 类图概览2. 源码阅读2.1 抽象类 BaseMatcher2.1 接口 Description提炼模式&#xff1a;空对象模式 2. 接口 Description 与 SelfDescribing 配合使用提炼模式 模板方法 后记 前言 hamcrest &#xff0c;一个被多个测试框架依赖的包。听说 hamcrest 的源码质量…

Linux性能优化--性能工具:系统内存

3.0.概述 本章概述了系统级的Linux内存性能工具。本章将讨论这些工具可以测量的内存统计信息&#xff0c;以及如何使用各种工具收集这些统计结果。阅读本章后&#xff0c;你将能够&#xff1a; 理解系统级性能的基本指标&#xff0c;包括内存的使用情况。明白哪些工具可以检索…

解决u盘在我的电脑中重复显示两个

删除注册表&#xff1a; [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\DelegateFolders\{F5FB2C77-0E2F-4A16-A381-3E560C68BC83}]

910数据结构(2019年真题)

算法设计题 问题1 有一种排序算法叫做计数排序。这种排序算法对一个待排序的表&#xff08;采用顺序存储&#xff09;进行排序&#xff0c;并将排序结果存放到另一个新的表中。必须注意的是&#xff0c;表中所有待排序的关键字互不相同&#xff0c;计数排序算法针对表中的每个…

视频增强修复工具Topaz Video AI mac中文版安装教程

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…

5-1.(OOP)初步分析MCV架构模式

组成&#xff1a;模型&#xff08;model&#xff09;、视图&#xff08;view&#xff09;、控制器&#xff08;controller&#xff09; view&#xff1a;界面、显示数据 model&#xff1a;数据管理、负责在数据库中存取数据以及数据合法性验证 controller&#xff1a;负责转…

Python大数据之PySpark(四)SparkBaseCore

文章目录 SparkBase&Core环境搭建-Spark on YARN扩展阅读-Spark关键概念[了解]PySpark角色分析[了解]PySpark架构后记 SparkBase&Core 学习目标掌握SparkOnYarn搭建掌握RDD的基础创建及相关算子操作了解PySpark的架构及角色 环境搭建-Spark on YARN Yarn 资源调度框…

Linux 下如何调试代码

debug 和 release 在Linux下的默认模式是什么&#xff1f; 是release模式 那你怎么证明他就是release版本? 我们知道如果一个程序可以被调试&#xff0c;那么它一定是debug版本&#xff0c;如果它是release版本&#xff0c;它是没法被调试的&#xff0c;所以说我们可以来调试一…

FPGA project : TFT_LCD

实验目标&#xff1a; 驱动TFT_LCD显示十色彩条。 重点掌握的知识&#xff1a; 1&#xff0c;液晶显示器&#xff0c;简称LCD(Liquid Crystal Display)&#xff0c;相对于上一代CRT显示器(阴极射线管显示器)&#xff0c;LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼…