You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过IDE在编译时将文件内容存入STM32的FLASH

在STM32中实现version.txt内容编译到指定FLASH段的方案

方法一:通过GCC预处理器直接嵌入文件内容

这种方式无需额外工具,直接在代码中读取文件内容并指定到目标段:

  1. 确保version.txt内容为纯版本字符串(比如v0.000),若需要自动包裹引号,可修改文件内容为"v0.000"。
  2. 在main.c中添加代码:
// 将version.txt内容作为字符串存入指定的.version段
static const char firmware_version[] __attribute__((section(".version"))) =
#include "version.txt";

若version.txt未加引号,编译会报错,可改用预处理器宏包裹:

#define STRINGIFY_CONTENT(x) #x
#define INCLUDE_VERSION STRINGIFY_CONTENT(VERSION_CONTENT)
static const char firmware_version[] __attribute__((section(".version"))) = INCLUDE_VERSION;
#define VERSION_CONTENT 
#include "version.txt"
  1. 保留你已配置的.version段链接脚本,编译后字符串会自动存入FLASH对应位置。

方法二:通过链接脚本+objcopy嵌入文件

这种方式更灵活,无需修改代码结构:

  1. 在已有的链接脚本.version段配置中,添加嵌入文件的相关符号和段:
SECTIONS
{
  /* 原有段配置保持不变 */
  .version :
  {
    KEEP(*(.version)) /* 保留代码中定义的version段内容 */
    __version_start = .; /* 定义起始符号,方便代码访问 */
    *(.version_embed) /* 用于存放外部嵌入的version.txt内容 */
    __version_end = .; /* 定义结束符号 */
  } > FLASH /* 指定该段存入FLASH */
}
  1. 使用arm-none-eabi-objcopy工具将version.txt转换为可链接的目标文件:
arm-none-eabi-objcopy -I binary -O elf32-littlearm -B arm version.txt version_embed.o

参数说明:

  • -I binary:指定输入为二进制格式(文本文件本质也是二进制)
  • -O elf32-littlearm:输出为ARM小端ELF格式
  • -B arm:指定目标架构为ARM
  1. 将生成的version_embed.o添加到项目编译文件列表(比如在Makefile或CMakeLists.txt中追加该文件)。
  2. 在代码中通过外部符号访问嵌入的内容:
extern const char __version_start[];
extern const char __version_end[];

// 示例:打印版本内容
void print_version(void) {
  for (const char* p = __version_start; p < __version_end; p++) {
    putchar(*p);
  }
  putchar('\n');
}

验证方法

编译完成后,用arm-none-eabi-objdump工具检查.version段内容:

arm-none-eabi-objdump -s -j .version your_project.elf

输出会显示该段的十六进制内容及对应ASCII字符,确认是否与version.txt一致。

内容的提问来源于stack exchange,提问作者Coffeeye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:02:40