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

news2025/1/12 16:17:49

之前写过一篇文章介绍过 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 -intel

hex2bin .\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.coloradmin.cn/o/1058295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程概念,实现方式以及多线程模型

1.线程引入 有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。 为此,引入了“线程”,来增加并发度。 可以把线程理解为“轻量级进程”。线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线…

GEE15:获取不同遥感指数的时间序列及不同指数间的关系

GEE 1. 不同遥感指数间的时间序列分析2. 不同指数之间的关系 1. 不同遥感指数间的时间序列分析 GPP数据在一定程度上和植被指数(如NDVI和EVI)有着显著的相关性,那么其相关性如何?如何从时间序列的角度来思考呢?下面我将…

【Spring Cloud】深入探索统一网关 Gateway 的搭建,断言工厂,过滤器工厂,全局过滤器以及跨域问题

文章目录 前言为什么需要网关以及网关的作用网关的技术实现 一、Gateway 网关的搭建1.1 创建 Gateway 模块1.2 引入依赖1.3 配置网关1.4 验证网关是否搭建成功1.5 微服务结构分析 二、Gateway 断言工厂2.1 Spring 提供的断言工厂2.2 示例:设置断言工厂 三、Gateway …

【算法训练-字符串 三】字符串相加

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串相加】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

visual studio禁用qt-vsaddin插件更新

visual studio里qt-vsaddin插件默认是自动更新的,由于qt-vsaddin插件新版本的操作方式与老版本相差较大,且新版本不稳定,容易出Bug,所以需要禁用其自动更新,步骤如下:     点击VS2019菜单栏上的【扩展】–…

制作pcb流畅

首先选择一款好用的软件。嘉立创,对新手友好,上手快,每个月还有免费的pcb打样卷。有官方的一对一客服服务。 作为一个新手我在绘制pcb时常进行如下几步。 1、绘制原理图 根据实际情况找到芯片对应的原理图,并添加自己需要的外设。…

Linux系统编程系列之互斥锁和读写锁

一、什么是互斥锁和读写锁 互斥锁是一种并发机制,用于控制多个线程对共享资源的访问。 读写锁是一种并发机制,用于控制多个线程对共享资源的访问。 二、特性 1、互斥锁 当一个线程获得了互斥锁并进入临界区(对共享资源进行访问)时…

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

本文介绍两种方法 1、经纬度矫正法 2、棋盘格矫正法 一、经纬度矫正法 1、算法说明 经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。 经过P点的入射光线…

操作系统-《王道 操作系统》

概念、功能和目标 概念 什么是操作系统 功能和目标 作为系统的管理者向上提供方便简易的服务作为最接近底层硬件的层次 特征 并发 共享 并发与共享的关系—互为存在条件 虚拟 异步 发展与分类 单道批处理系统多道批处理系统 优点:多道程序并发执行&#xff0c…

Java笔记六(面向对象:类与对象)

面向对象编程的本质:以类的方式组织代码,以对象的组织(封装)数据 抽象 三大特征:封装 继承 多态 从认识角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽…

【JVM】 类加载机制、类加载器、双亲委派模型详解

文章目录 前言一、类加载机制二、类加载器三、双亲委派模型总结 前言 📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 &#x1f4d…

Foxit PDF

Foxit PDF 福昕PDF 软件,可以很好的编辑PDF文档。 调整PDF页面大小 PDF文档中,一个页面大,一个页面小 面对这种情况,打开Foxit PDF 右键单击需要调整的页面,然后选择"调整页面大小". 可以选择…

【网络安全-sql注入(5)】sqlmap以及几款自动化sql注入工具的详细使用过程

一,sqlmap 工具的详细使用 kali系统自带这个工具,无需安装直接sqlmap 后面接参数使用 Windows上参照以下方法安装即可 1-1 工具下载 1-1-1 sqlmap下载 sqlmap 工具下载地址: GitHub - sqlmapproject/sqlmap: Automatic SQL injection a…

【C语言】【动态内存管理】malloc,free,calloc,realloc

1.malloc函数 void* malloc(size_t size)功能&#xff1a;向内存申请字节为 size大小的空间 使用时要包含头文件&#xff1a;<stdlib.h> 开辟成功&#xff1a;返回开辟好的空间初始地址的指针 开辟失败&#xff1a;返回空指针 NULL 使用举例&#xff1a; (malloc和free…

Win10系统中GPU深度学习环境配置记录

运行环境 系统&#xff1a;Win10 处理器 Intel(R) Core(TM) i7-9700K CPU 3.60GHz 3.60 GHz 机带 RAM 16.0 GB 设备 ID A18D4ED3-8CA1-4DC6-A6EF-04A33043A5EF 产品 ID 00342-35285-64508-AAOEM 系统类型 64 位操作系统, 基于 x64 的处理器 显卡&#xff1a;NVIDIA GeF…

快速上手Apache POI

哈喽~大家好&#xff0c;这篇我们来看看快速上手Apache POI。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; Red…

你写过的最蠢的代码是?——一起探讨编程的奇葩时刻

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

常见web信息泄露

一、源码(备份文件)泄露 1、git泄露 Git是一个开源的分布式版本控制系统&#xff0c;在执行git init初始化目录的时候&#xff0c;会在当前目录下自动创建一个.git目录&#xff0c;用来记录代码的变更记录等。发布代码的时候&#xff0c;如果没有把.git这个目录删除&#xff…

CCF CSP认证 历年题目自练 Day20

题目一 试题编号&#xff1a; 201903-1 试题名称&#xff1a; 小中大 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目分析&#xff08;个人理解&#xff09; 常规题目&#xff0c;先看输入&#xff0c;第一行输入n表示有多少数字&am…

Rabbitmq安装-docker版

1.简介 2.安装消息队列 下载地址https://www.rabbitmq.com/download.html 使用docker方式安装 需要先下载docker&#xff0c;参考文章https://blog.csdn.net/weixin_43917045/article/details/104747341?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22arti…