SocialButterfly 发表于 2025-10-1 09:11

STM32H753IIT6 HEX文件错误地包含了RAM段

该芯片包含多个RAM段...即ITCMRAM(0x00000000)、DTCMRAM(0x20000000)、RAM_D1(0x24000000)、RAM_D2(0x30000000)、RAM_D3(0x38000000)。

出现的问题是:当将变量 specifically 加载到RAM_D2和RAM_D3(0x30000000)时,生成的Hex文件将该段作为可加载段包含在内,这进而导致STM32CubeProgrammer加载该段时出现问题。当在链接脚本中应用(NOLOAD)选项时,确实解决了这个问题,但不想用这个选项,因为这样我们就必须特殊处理代码中的变量初始值...

biechedan 发表于 2025-10-6 21:32

STM32H753IIT6的RAM_D2和RAM_D3属于非紧密耦合内存,通常用于存储运行时数据而非初始化代码。

1988020566 发表于 2025-10-6 22:48

在SECTIONS中强制指定变量存储位置,同时避免生成加载段

eefas 发表于 2025-10-7 21:44

这些变量在 RAM_D2/RAM_D3 上,而 HEX 不应该包含这些 RAM 区域的初始值​

sdlls 发表于 2025-10-8 08:56

在代码中使用编译器扩展属性强制变量进入指定段,同时保持初始化能力

mmbs 发表于 2025-10-8 09:26

生成.map文件:确认变量已正确分配到指定段
二进制对比:使用binwalk等工具分析Hex文件结构
内存验证:在调试器中查看RAM_D2/D3的实际内容
边界检查:确保不超出各RAM段的物理边界

vivilyly 发表于 2025-10-8 12:27


将某些全局变量放到特定的 RAM 区域

pmp 发表于 2025-10-8 13:10

通过编译器属性+链接脚本实现细粒度控制

cashrwood 发表于 2025-10-8 13:57

在代码中显式地将变量放置到指定的RAM段中,使用__attribute__((section(".ram_d2")))和__attribute__((section(".ram_d3")))。

chenci2013 发表于 2025-10-8 15:15

在启动文件中添加自定义初始化函数,确保非加载段变量正确初始化

belindagraham 发表于 2025-10-8 16:59

为什么NOLOAD会导致问题?            

robertesth 发表于 2025-10-8 19:56

配置内存保护单元(MPU)限制访问权限,防止意外加载

643757107 发表于 2025-10-8 21:32

配置没问题,生成的HEX就不会有问题。

loutin 发表于 2025-10-10 11:38

RAM_D3位于备份域            

mickit 发表于 2025-10-10 12:46

保留变量初始值在Hex文件中            

ccook11 发表于 2025-10-10 15:40

为RAM_D2/D3添加NOLOAD属性仅影响加载行为

uytyu 发表于 2025-10-10 16:45

初始化数据可能未在启动代码中正确处理,导致加载时地址冲突或数据无效

albertaabbot 发表于 2025-10-11 12:28

ST官方提供的H7系列工程中,RAM_D2/D3通常通过__attribute__或链接脚本管理,可查阅其分散加载文件配置

sanfuzi 发表于 2025-10-11 15:17

可以考虑使用NOLOAD选项来避免生成的Hex文件包含RAM段。

robincotton 发表于 2025-10-11 16:07

频繁访问RAM_D2/D3可能因总线仲裁导致延迟
页: [1] 2
查看完整版本: STM32H753IIT6 HEX文件错误地包含了RAM段