[应用相关] 实战经验 | 如何使用STM32CubeIDE链接一个文件到工程中

[复制链接]
800|1
 楼主| STM新闻官 发表于 2025-7-24 15:43 | 显示全部楼层 |阅读模式
本帖最后由 STM新闻官 于 2025-7-24 15:45 编辑

前言

在一些情况下,需要将一些数据文件直接加载到项目工程中去使用,比如一些参数配置文件,秘钥文件等。如果我们直接把文件的二进制内容复制到工程中作一个const常量去操作,那每次这个文件修改时,都需要重新编写一次代码。


如果编译器在编译的时候可以直接将这个二进制文件块链接到工程中,就省去了每次修改代码的过程,直接替换文件并重新编译就能更简单的实现这个功能了。基于此,我们介绍下如何使用STM32CubeIDE链接二进制文件块。
实现方法比如我们要一个readme.txt到工程中,首先创建一个文件,并增加文件内容,如下图。
892406881e3dc0ff82.png
首先在分散加载文件XXX_FLASH.ld中添加binary_data段,并使用KEEP()来修饰,来保证即使这段即使不被调用,也不会连接器的垃圾回收机制删除。

.binary_data :
{
_binary_data_start = .;
KEEP(*(.binary_data));
_binary_data_end = .;
} > FLASH

然后在C文件中使用incbin指令把readme.txt文件包含到C中,incbin是汇编语言中的一个伪指令,用于将二进制文件的内容直接包含到生成的目标文件中。类似于C语言的[color=rgb(87, 107, 149) !important][url=]#include[/url]。"a":表示该段是一个可分配的段(allocatable)。这意味着在链接时,该段会被分配内存地址,并且会出现在最终的可执行文件中。

asm(".section .binary_data,\"a\";"
".incbin \"../readme.txt\";"
);


完成上述包含之后就可以在C代码中调用了。


extern int _binary_data_start;
int main(void)
{
int *bin_area = &_binary_data_start;


03测试验证
根据bin_area的地址,通过Debug查看其内存,可以看到ASCII码和readme.txt文件中的内容相同。
443606881e3cb769cd.png

或使用STM32CubeProgrammer读取其地址内容。
983816881e3b765aee.png

04总结
本文介绍如何使用STM32CubeIDE将一个文件链接到工程中方法,在实际应用中有许多常见的场景及用途,如嵌入图像、音频、字体、数据库等文件到工程中,固件更新,嵌入秘钥或证书等场景。

点击按钮下载《如何使用STM32CubeIDE链接一个文件到工程中》原文档。

点击下载
相关阅读




 楼主| STM新闻官 发表于 2025-7-24 15:46 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1385

主题

1669

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部