STM32 -Bin/Hex文件格式解析

文章目录

  • 1. 概述
  • 2. Hex文件
    • 2.1 格式解析
    • 2.2 数据类型
    • 2.3 举例解析
    • 2.4 合并两个Hex文件方法
  • 3. Bin文件
    • 3.1 生成方式
    • 3.2 合并多个Bin文件方法
    • 3.3 打开Bin文件方式
    • 3.4 和Hex文件比较
  • 4 总结


1. 概述

  • Hex文件:它是单片机和嵌入式工程编译输出的一种常见的目标文件格式(比如keil就能编译输出hex文件),通过烧写工具把它下载到单片机中,程序就能在芯片中运行。
  • Bin文件:keil就能编译输出Bin文件,当我们需要实现IAP远程升级芯片固件的时候,会通过Bootloader程序将Bin文件写到芯片的内部Flash里。
  • 相关文档链接:
    《用文本编辑器(记事本)合并两个Hex文件 - 详细操作步骤》
    《Keil如何生成bin文件 - 附详细操作图文》
    《J-Flash合并多个bin文件》
    《Keil编译后生成bin文件占用内部Flash的大小,RAM,ROM,Code,RO-data,RW-data,ZI-data》

2. Hex文件

请添加图片描述

2.1 格式解析

  • 每行以冒号(:)起始,后面每两个字母是一个8bit的16进制数;
  • 每行的格式:BBAAAATTD……DCC:
    • BB 表示本行数据的长度:
    • AAAA 表示本行数据存储的地址;
    • TT 表示数据类型;
    • DD 是实际的数据,它的长度不定(每行以16字节对齐);
    • CC 是校验和(计算方法:本行所有字节累加和(累加和只用低8位)取反再加1);

2.2 数据类型

  • 数据类型一共有6种形式:

    • '00’数据记录(Hex文件的大部分记录都是数据记录);

    • '01’文件结束记录(标识Hex文件的结尾,放在文件的最后);

    • '02’扩展段地址记录;

    • '03’开始段地址记录;

    • '04’扩展线性地址记录(声明数据存储的高位地址);

    • '05’开始线性地址记录(线性起始地址指定__main(主程序前)函数的地址,通常可忽略);

2.3 举例解析

  • 第一行 :020000040800F2
    • 02 :表示本行数据的长度为2:
    • 0000 :表示本行数据存储的地址;
    • 04 :表示数据类型为扩展线性地址记录;
    • 0800 :因为本行的数据类型为04,即0800声明了数据存储的高位地址为0x0800;
    • F2 :校验和(计算方法:本行所有字节累加和(累加和只用低8位)取反再加1,即0xF2=0x01 + ∼(0x02+0x04+0x08))
  • 第二行 :10300000E8740020493100085131000853310008AC
    • 10 :表示本行数据的长度为16(可见数据存储以每行16字节对齐);
    • 3000 :表示本行数据存储的地址低位为0x3000,即实际数据的存储地址为0x0800 3000;
    • 00 :表示数据类型为数据记录;
    • E…8 :因为本行的数据类型为00数据记录,DD区即为实际的数据;
  • 第五行 :10FFF00004F086FA974890F82D000090954890F804
    • 10 :表示本行数据的长度为16
    • FFF0 :表示本行数据存储的地址低位为0x3010,即实际数据的存储地址为0x0800 FFF0;
  • 第六行 :020000040801F1
    • 02 :表示本行数据的长度为2:
    • 0000 :表示本行数据存储的地址;
    • 04 :表示数据类型为扩展线性地址记录;
    • 0801 :声明了数据存储的高位地址为0x0801(当地址长度超过16bit 即0xFFFF时,就需要扩展线性地址记录再次声明新的高位地址);
  • 倒数第三行 :0450900004012400F3
    • 04 :表示本行数据的长度为4:
    • 5090 :表示本行数据存储的地址低位为0x5090,即实际数据的存储地址为0x0801 5090;
    • 00 :表示数据类型为数据记录;
    • (此行长度不足0x10,只有0x04,这代表已经到了Hex文件数据的末尾了)
  • 倒数第二行 :04000005080031318D
    • 04 :表示本行数据的长度为4:
    • 0000 :表示本行数据存储的地址;
    • 05 :表示数据类型为开始线性地址记录;
    • 此行内容通常可忽略,官方解释为:
      • 线性起始地址指定__main(主程序前)函数的地址,但不指定启动代码的地址,启动代码通常在调用 SystemInit() 后调用__main。奇数线性起始地址表示 __main 是为 Thumb 指令集编译的。
      • 线性起始地址记录可以出现在十六进制文件的任何地方。在大多数情况下,可以忽略该记录,因为它不包含闪存编程所需的信息。
  • 倒数第一行 :00000001FF
    • 00 :表示本行数据的长度为0:
    • 0000 :表示本行数据存储的地址;
    • 01 :表示文件结束记录(标识Hex文件的结尾,放在文件的最后);

2.4 合并两个Hex文件方法

  • 当开发项目包含IAP升级芯片固件的功能时,需要把Bootloader和App两段代码的Hex文件合并以后再烧写,具体操作方法可参考以下内容:
  • 《用文本编辑器(记事本)合并两个Hex文件 - 详细操作步骤》

3. Bin文件

3.1 生成方式

  • 《Keil如何生成bin文件 - 附详细操作图文》

3.2 合并多个Bin文件方法

  • 《J-Flash合并多个bin文件》

3.3 打开Bin文件方式

  • 使用十六进制文件编辑器(我用的是:Uedit32.exe打开如下图所示:)
    请添加图片描述

3.4 和Hex文件比较

  • 对比上面打开的Hex文件里的内容,可发现Bin文件内容正好是Hex文件中数据段里的实际数据内容,没有数据长度、存储地址、校验等附加内容,Bin文件内容直接就是闪存内的代码文件,是没有任何附加格式的二进制原始文件

4 总结


授人以鱼,不如授人以渔

这里只提供钓鱼方法而不是一条完整的鱼

有问题欢迎留言交流 / 指正o( *  ̄▽ ̄ * )ブ

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

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

相关文章

https想访问本地部署的http://localhost接口

情况说明: 网址是https的,想访问java本地启的一个程序接口http://localhost:8089 解决办法 java程序加上

智能高效的转运机器人,为物流行业注入新动力

在当今社会,随着科技的不断发展,机器人已经逐渐融入到我们的生活中。其中,转运机器人作为物流行业的新秀,正以其高效、智能的特点,引起了广泛的关注。 转运机器人,是指能够自主进行物品搬运和运输的机器人…

如何利用CHATGPT写主题文章

问CHAT:新课标下畅言智慧课堂助力小学生量感培养,拟解决的关键问题 CHAT回复: 1. 确定智慧课堂在新课标下的正确应用方法:新课标对教育方法、内容等提出了新的要求,需要探讨如何将智慧课堂与新课标相结合,…

python-opencv 培训课程笔记(2)

python-opencv 培训课程笔记(2) 1.图像格式转换 先看一下cvtColor函数的例子 #默认加载彩图 pathrD:\learn\photo\cv\cat.jpg# imread(path,way) #way0 灰度图。way1 彩图 #默认彩图 imgcv2.imread(path) img_dogcv2.imread(path_dog) #图片格式的转化…

django restful framework序列化与反序列化

在前后端分离开发中,对于RESTfulAPI设置,一般需要将查询/更新数据以JSON方式进行返回。 序列化 Model.py from django.db import models class User(models.Model):username models.CharField(verbose_name用户名,max_length10)age models.IntegerF…

Cmake 生成器表达式

CMake生成器表达式 - 招财猫的博客 【精选】CMake I 生成器表达式_cmake生成器表达式-CSDN博客 例子 下面这行 就能把Lib的PDB FILEs安装提取出来安装到DESTINATION

VCP-DCV VMware vSphere,即将开课~想了解点击查看

VCP-DCV VMware vSphere 本周开课~ 想报名的必须提前预约啦 👇👇👇 课程介绍 本课程重点讲授如何安装、配置和管理VMware vSphere 8.0(包括VMware ESXi™ 8.0和VMware vCenter Server™ 8.0) 本课程将帮助您做好…

火电安全事故vr模拟仿真培训强交互更真实

VR消防,利用VR虚拟现实技术,将VR和消防教育融合在一起达到寓教于乐的效果, VR消防教育是对于家中、校园内、大型商场、公司办公室等情景产品研发的消防安全培训类VR系统软件,根据互动体验、互动、视角实际操作、视听觉系统多度自然…

ubuntu18.04安装并运行ORB-SLAM2

查看版本号 lsb_release -a 换源 Ubuntu系统自带的源都是国外的网址,国内用户在使用的时候下载比较慢甚至无法获取,需要替换成国内的镜像源 备份源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.old 打开文件 sudo gedit /etc/apt/so…

与数字伙伴共赏书海风光,拓世法宝AI智能数字人一体机打造现代图书馆新景象

纪录片《但是还有书籍》中这样形容图书馆“图书馆一个城市最安静的角落,却涌动着最活跃的思想。它保存着文明的火种,也滋养着未来的新知。它是一些人休憩心灵的桃花源,另一些人逃离世界的窗口。它是迷宫,是港口,也是乐…

2022最新版-李宏毅机器学习深度学习课程-P51 BERT的各种变体

之前讲的是如何进行fine-tune,现在讲解如何进行pre-train,如何得到一个pre train好的模型。 CoVe 其实最早的跟预训练有关的模型,应该是CoVe,是一个基于翻译任务的一个模型,其用encoder的模块做预训练。 但是CoVe需要…

OceanBase:集群常见操作

目录 1.查看 OBD 管理的集群列表 2.查看某个集群状态 3.启动 OceanBase 集群 4.连接 OceanBase 集群 5.停止运行中的集群 6.销毁已部署的集群 7.查看集群配置项 8.修改集群配置项 1.查看 OBD 管理的集群列表 obd cluster list 2.查看某个集群状态 obd cluster displa…

CMakeLists.txt基础指令与cmake-gui生成VS项目的步骤

简介 本博客主要介绍cmake的基本指令,同时,很多使用Visual Studio小白从Gitbub下载项目源码后,看到CMakeLists.txt,不知道如何使用Visual Studio编译源码;针对以上问题,做一下简单操作与解释,方…

解决 Python整数值的 header 问题

在使用Python的requests库进行HTTP请求时,自requests 2.11版本以后,出现了无法处理包含整数值的header的问题。这导致了所有使用requests库的请求都出现错误。 问题的发起者遇到了一个麻烦,就是在使用Python的requests库进行HTTP请求时&#…

2023 年最新 MySQL 数据库 Windows 本地安装、Centos 服务器安装详细教程

MySQL 基本概述 MySQL是一个流行的关系型数据库管理系统(RDBMS),广泛应用于各种业务场景。它是由瑞典MySQL AB公司开发,后来被Sun Microsystems收购,最终被甲骨文公司(Oracle Corporation)收购…

解析SOLIDWORKS教育版与企业版:选择合适版本,助力创新设计

SOLIDWORKS作为领先的三维CAD软件,旨在为工程设计、产品开发和创新提供全面支持。在SOLIDWORKS产品线中,教育版和企业版是两种常见的版本。让我们来了解一下它们之间的区别和特点。 SOLIDWORKS教育版:学习、探索、启发创新 面向教育和学术&…

nvm 离线安装,并离线安装指定版本 node

1. 离线安装 nvm 通常通过网络安装nvm的时候会被墙,所以nvm安装就只能进行离线安装了。 我们可以在github上下载nvm的安装包,然后在本地安装,下载地址:点击直达 点进去的详情长这样: 将下载下来的文件放到服务器&…

java VR全景商城免费搭建 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Django学习日志07

多表查询(跨表查询) 子查询:分步查询 链表查询:把多个有关系的表拼接成一个大表(虚拟表) inner join left join 展示左表所有数据数据,右表展示符合查询条件的数据,查询不到的用null填充 …

基于go标准分层架构项目设计实现

基于go标准分层架构项目设计实现 缘起 个人博客网址 最近主要看了两方面知识,一方面是技术相关的,如何设计一个比较好的后端架构项目代码;一方面是非技术相关的,如何写一篇好的技术文章,能够让他人读懂并有收获。因…