实现STM32烧写程序-(3) Hex文件结构

简介

要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。

资料

Hex文件 简介

Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后,Hex文件格式成为了一种通用的标准,被广泛应用于嵌入式系统和微控制器编程中。
虽然Hex文件格式最初由Intel创建,但随着时间的推移,其他公司和组织也采用了这种格式,并对其进行了扩展和改进。因此,Hex文件格式已经成为一种行业标准,被广泛支持和使用。
需要注意的是,Hex文件格式的具体规范和细节可能会因不同的应用和实现而有所差异。因此,如果您在特定的应用或设备中使用Hex文件格式,建议查阅相关文档或规范,以确保正确解析和使用Hex文件。

Hex 文件资料

Hexadecimal (Intel-Format) File (.hex) Definition

Hex Format.pdf

这份是比较简单易了解的 : What is the format of Intel Hexadecimal files (.hex)?

抄录如下:
一个示例的HEX文件如下所示:
:10008000AF5F67F0602703E0322CFA92007780C361
:1000900089001C6B7EA7CA9200FE10D2AA00477D81
:0B00A00080FA92006F3600C3A00076CB
:00000001FF
+++++++++++++++++++++++++++++++++++++++++++
该文件的格式如下:
第一个字符(:)= 记录的开始
接下来两个字符 = 记录长度(在此示例中为10h, 实际数据长度)
接下来四个字符 = 载入地址/偏移(在此示例中为0080h)
接下来两个字符 = 记录类型/本段数据的类型(00/01/02/03/04/05)(见下文)
剩余字符 = 实际数据(数据量字节数由前面记录长度 * 2, 文件存储是字符, 两个字符组成Hex)
最后两个字符 = 校验和(即所有字节的和,校验和为00)
++++++++++++++++++++++++++++++++++++++++++
文件的最后一行是特殊的,始终以上述形式结束。HEX记录类型如下所示:
00 = 数据记录
01 = 文件结束记录
02 = 扩展段地址记录
03 = 起始段地址记录
04 = 扩展线性地址记录
05 = 起始线性地址记录

数据类型说明

00 数据记录

如下是两端 数据记录

:10000000A005002001010008E31400087B1400088B
:10001000E11400083D0700087D16000800000000FC

切分一下

记录行号记录标志记录长度偏移数据类型数据checksum
1:10000000A005002001010008E31400087B1400088B
2:10001000E11400083D0700087D16000800000000FC

01 文件结束记录

表示这个文件到此就是最后一段有效数据了, 例如:
在这里插入图片描述
上面展示的就是最后一行数据,:00000001FF, 切分一下

记录行号记录标志记录长度偏移数据类型数据checksum
1:00000001FF

02 扩展段地址记录

扩展段地址记录(Extended Segment Address Record):扩展段地址记录用于扩展加载地址的位数。它的记录类型为"02",地址字段表示扩展的段地址。扩展段地址记录通常与数据记录一起使用,以支持更大的地址空间。
扩展段地址记录的作用是扩展加载地址的位数,以支持更大的地址空间。在解析HEX文件时,当遇到扩展段地址记录时,可以将段地址的高16位设置为该记录中指定的扩展段地址。
请注意,扩展段地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

格式:
在这里插入图片描述

03 起始段地址记录

起始段地址记录(Start Segment Address Record):起始段地址记录用于指示程序的起始执行地址。它的记录类型为"03",地址字段表示起始执行地址。
起始段地址记录的作用是指示程序的入口点,即程序应该从哪个段地址和偏移量开始执行。在解析HEX文件时,当遇到起始段地址记录时,可以将程序的执行地址设置为该记录中指定的段地址和偏移量。
请注意,起始段地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

格式:
在这里插入图片描述

04 扩展线性地址记录

扩展线性地址记录(Extended Linear Address Record):扩展线性地址记录用于扩展线性地址的位数。它的记录类型为"04",地址字段表示扩展的线性地址。

格式 :
在这里插入图片描述在这里插入图片描述
切分:

记录行号记录标志记录长度偏移数据类型数据checksum
1:020000040800F2

扩展线性地址记录的作用是扩展线性地址的位数,以支持更大的地址空间。在解析HEX文件时,当遇到扩展线性地址记录时,可以将线性地址的高16位设置为该记录中指定的扩展线性地址。

请注意,扩展线性地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

例如 拼接 第二行 0000 地址就是 0x0800 0000 =》 0x8000000 程序的加载地址

05 起始线性地址记录

起始线性地址记录(Start Linear Address Record):起始线性地址记录用于指示程序的起始执行地址。它的记录类型为"05,地址字段表示起始执行地址。
起始线性地址记录的作用是指示程序的入口点,即程序应该从哪个线性地址开始执行。在解析HEX文件时,当遇到起始线性地址记录时,可以将程序的执行地址设置为该记录中指定的地址。
请注意,起始线性地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

格式 :
在这里插入图片描述
实例:
在这里插入图片描述
切分一下

记录行号记录标志记录长度偏移数据类型数据checksum
1:04000005080000EDFF

起始执行地址为080000ED,表示程序的起始执行地址是080000ED。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

XCTF:Hidden-Message[WriteUP]

使用Wireshark打开文件 分析能分析的流,这里直接选择UDP流 分别有两段流,内容都是关于物理的 和flag没啥关系,只能从别的方面下手 分析:整个数据包,全部由UDP协议组成 其中发送IP和接收IP固定不变,数据长…

Leetcode3002. 移除后集合的最多元素数

Every day a Leetcode 题目来源:3002. 移除后集合的最多元素数 解法1:贪心 可以将数组去重后分为三个部分:nums1 独有的,nums2 独有的,nums1 与 nums2 共有的。 求集合 S 时: 先选择两个数组独有的。…

【软件测试】学习笔记-性能测试的基本方法与应用领域

这篇文章探讨并发用户数、响应时间和系统吞吐量这三个指标之间的关系和约束,性能测试七种常用方法,以及四大应用领域。 由于性能测试是一个很宽泛的话题,所以不同的人对性能测试的看法也不完全一样,同样一种方法可能也会有不同的…

第十五届蓝桥杯单片机组备赛——独立键盘矩阵键盘

文章目录 一、按键原理二、独立键盘&矩阵键盘2.1 独立按键2.2 矩阵键盘 一、按键原理 原理很简单,当我们没有按下SW2时,由于上拉电阻得作用,使得输入引脚得信号为高电平,当按下按键后,引脚直接接地,输入…

MySQL面试题 | 08.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

List集合遍历过程中修改元素(有坑)

说来惭愧,学 java 2年了,对 “Java是值传递” 这句话还没有理解它的精髓,以至于编程的时候出现了一些错误,这里记录一下。 一.问题再现 1.1将List集合中的每个字符串更改为其他值 1.2将List集合中的对象更改为其他对象 二.问题分…

【DolphinScheduler】datax读取hive分区表时,空分区、分区无数据任务报错问题解决

问题背景: 最近在使用海豚调度DolphinScheduler的Datax组件时,遇到这么一个问题:之前给客户使用海豚做的离线数仓的分层搭建,一直都运行好好的,过了个元旦,这几天突然在数仓做任务时报错,具体报…

【Rust日报】2024-01-12 将 Rust 引入 Git 项目

将 Rust 引入 Git 项目 去年年底的假期里,Taylor Blau 花了一些时间思考如何将 Rust 引入 Git 项目。 将 Rust 引入 Linux 内核的重要工作正在进行中。在他们既定的目标中,他认为有一些可能与 Git 项目相关: 由于语言的安全保证,内…

Jenkins+nexus

jiekins安装完成 1、安装java环境 [rootnexus ~]# tar -xf jdk-8u211-linux-x64.tar.gz -C /usr/local [rootnexus ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/jdk1.8.0_211 PATH$PATH:$JAVA_HOME/bin [rootnexus ~]# source /etc/profile.d/java.sh 必须要选择与n…

UE5 伤害数字跳出

学习视频 大体思路: 1.创建一个控件蓝图。 播放动画,K透明度,文本位置。 2.创建一个控件组件。 类默认值中设置。 3.在位置处创建组件实例 自定义事件略。

汇编语言与接口技术——AD转换及PWM控制

一、 实验要求 实验目的: 掌握SPI总线的使用方式掌握xpt2046 AD转换芯片的工作原理掌握SPI总线方式实现基于xpt2046的AD转换掌握PWM控制功率的方式 实验内容: 学习xpt2046 AD转换芯片的工作原理,利用SPI总线实现基于该芯片的AD转换&#x…

idea使用谷歌翻译 有道翻译 百度翻译

中文版:文件——设置——工具——Translation,然后选择需要配置的翻译 英文版:File——settings——Tools——Translation,然后选择需要配置的翻译 谷歌翻译大家可以度娘直接搜索Google_translation_win 有道和百度翻译得去注册申…

什么是RoPE-旋转位置编码?

RoPE位置编码是大模型中最常见的位置编码之一。像是谷歌的PaLM和meta的LLaMA等开源大模型都是RoPE位置编码,那么RoPE有什么特点呢? 本文将介绍如下内容: RoPE旋转位置编码概要什么是位置编码?RoPE及其特点总结 一、RoPE旋转位置…

书生·浦语大模型实战营作业(四)

基础作业: 构建数据集,使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手,效果如下图所示,本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称! 数据集 回答结果 进阶作…

Rsync远程同步,删除大量文件

目录 什么是文本传输? 文件传输工具: Rsync工具介绍 rsync的作用 命令格式 实验配置rsync源服务器 先检查是否有rsync工具 建立/etc/rsyncd.conf 配置文件 为备份账户创建数据文件 给数据文件添加权限 保证所有用户对源目录/var/www/html 都有读…

Android-跨进程

startService和bindService的区别,生命周期以及使用场景 startService: onCreate -> onStartCommand -> onDestory ,在多次调用startService的时候,onCreate不重复执行,但是onStartCommand会执行。startService调…

Vulnhub靶机:driftingblues 4

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:driftingblues4(10.0.2.20) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entr…

sql | 学生参加各科考试次数

学生表: Students------------------------ | Column Name | Type | ------------------------ | student_id | int | | student_name | varchar | ------------------------ 在 SQL 中,主键为 student_id(学生ID)。 该表内的每…

Linux|centos7操作系统|VMware虚拟机安装水星免驱USB网卡8188gu记录

引言: 最近对于嵌入式系统比较感兴趣,因此,计划先使用VMware workstation虚拟机试一试Linux系统下的网卡驱动安装 这不试不知道,一试吓一跳,发现Linux下的驱动安装还是比较麻烦的,下面将就本次的Linux系统…

343. 整数拆分(动态规划)

题目: 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出…