Korbin
Korbin
发布于 2025-11-26 / 6 阅读
0
0

keil生成bin和hex文件

keil默认编译后生成的使axf文件,生成bin文件和hex文件需要增加额外配置。

打开项目后,依次点击:

Project ->Option for Target... ->User

After Build/Rebuild 中进行配置:

fromelf --bin !L --output output.bin
fromelf --i32 !L --output output.hex

如下图所示:

三种文件的区别:

特性

AXF 文件

HEX 文件

BIN 文件

全称

ARM Executable File

Intel HEX

Binary

本质

包含调试信息的可执行文件

带地址的十六进制文本格式

纯二进制数据流

包含内容

机器码 + 地址信息 + 调试信息 + 符号表等

机器码 + 地址信息 + 校验和

只有机器码(原始字节)

地址信息

包含(在调试信息和文件头中)

包含(每条记录都有起始地址)

不包含

文件格式

二进制(复杂的结构)

文本格式(ASCII)

二进制

可读性

不可直接阅读,需用调试器解析

可用文本编辑器打开阅读

不可直接阅读,需用十六进制编辑器

文件大小

最大

较大(因是文本格式)

最小

主要用途

调试(Debug)

烧录/编程

烧录/编程、OTA升级

生成工具

编译器/链接器(如 arm-none-eabi-gcc

从 AXF 转换而来(使用 fromelfobjcopy

从 AXF 转换而来(使用 objcopy

1. AXF 文件:是编译器(如 ARM GCC, Keil, IAR)生成的调试文件。它包含最终的可执行机器码、调试信息(变量名、函数名、行号等)和丰富的元数据(如段地址)。主要用于调试。
  它是编译和链接的最终输出。 当你点击"Build"或"Compile"时,编译器生成的目标文件(.o)被链接器合并,最终生成的就是 AXF 文件(在GCC环境下通常是 .elf 文件,与 .axf 本质相同)。
  它是“最富有”的文件,包含了调试所需的一切。当你在 Keil 或 IAR 中进行单步调试、查看变量、设置断点时,IDE 正是在读取 AXF 文件中的调试信息来匹配机器码和你的源代码。
  在产品发布时,通常不会发布 AXF 文件,因为它体积庞大且可能泄露源代码结构。
2. HEX 文件:是一种带有地址信息的标准烧录文件。它包含可执行机器码,并且每条记录都标明了其应该被烧录到的内存地址。格式是文本形式的,可读。
  它是一种标准化的交换格式。 因为它包含地址信息,所以烧录器(编程器)知道该把哪一段数据放到存储器的哪个地址。例如,它明确区分哪部分是代码(应该烧录到 0x08000000 的 Flash),哪部分是数据(应该烧录到 0x20000000 的 RAM)。
  它的结构是文本行,每行以冒号(:)开始,后面跟着字节数、地址、记录类型、数据字节和校验和。
  示例::10010000214601360121470136007EFE09D2190140
  由于有地址信息,它可以表示不连续的二进制数据块,这对于有中断向量表等特定地址要求的微控制器程序非常有用。
3. BIN 文件:是一种纯二进制镜像文件。它只包含最原始的机器码数据,没有任何地址信息。它是体积最小的输出格式。
  它是“最纯粹”的机器码映像。 它仅仅是将 AXF 文件中需要烧录到存储器的部分(通常是 .text, .data 段)提取出来,按顺序拼接成一个连续的数据流。
  它本身不包含任何地址信息。 这意味着你在烧录 BIN 文件时,必须手动指定烧录的起始地址。例如,告诉烧录工具将这个 BIN 文件烧录到 STM32 Flash 的起始地址 0x08000000。
  因为它没有冗余的地址、记录类型、校验和等文本信息,所以它的体积最小,在通过网络进行 OTA 固件升级时,可以节省带宽。


评论