[STM32F2] 如何定义特定地址位置来存储数据

[复制链接]
 楼主| 地瓜patch 发表于 2025-7-21 22:41 | 显示全部楼层 |阅读模式
定义, 08, ST, TE, DA, ID
用STMCubeIDE进行汇编项目开发,想将一些变量存储在Flash内存中的特定地址(比如数据表)。
我测试用了这样的指令但没有成功:
#pragma location=0x08001000
DataStart:
.word 0
.word 0x10
当我用IDAPro查看结果时,是这样的(并没有定位到我预设的地址):
.text: 0800038E DataStart
.text: 0800038E DCD 0
.text: 08000392 DCD 0x10
请问我如何强制编译器将数值存储在指定地址?

jiekou001 发表于 2025-7-22 09:16 | 显示全部楼层
方法1:使用 __attribute__((section)) + 修改链接脚本
1. 在代码中定义变量并指定段名
用 __attribute__((section)) 将变量分配到自定义的段(如 .my_flash_data):
  1. // 定义变量到自定义段(地址在链接脚本中指定)
  2. const uint32_t DataStart[] __attribute__((section(".my_flash_data"))) = {
  3.     0x00000000,
  4.     0x00000010
  5. };

2. 修改链接脚本(.ld文件)
在STM32CubeIDE中,链接脚本通常为 STM32xxxx_FLASH.ld。找到 MEMORY 和 SECTIONS 部分,添加自定义段:
  1. MEMORY {
  2.   FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
  3.   RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 640K
  4. }

  5. SECTIONS {
  6.   /* 其他默认段(如 .text, .isr_vector)... */

  7.   /* 自定义段:强制分配到 0x08001000 */
  8.   .my_flash_data 0x08001000 : {
  9.     KEEP(*(.my_flash_data))  /* 保留该段,防止被优化 */
  10.   } >FLASH

  11.   /* 后续段... */
  12. }

3. 编译后验证
查看生成的 .map 文件,确认 DataStart 的地址是否为 0x08001000。

用IDA Pro或STM32CubeProgrammer读取Flash内容,检查数据是否在正确位置。
 楼主| 地瓜patch 发表于 2025-7-27 22:23 | 显示全部楼层
jiekou001 发表于 2025-7-22 09:16
方法1:使用 __attribute__((section)) + 修改链接脚本
1. 在代码中定义变量并指定段名
用 __attribute__(( ...

非常谢谢,我测试以下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1813

主题

14865

帖子

29

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