你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何为ram变量分配固定地址

[复制链接]
patch1582 提问时间:2026-4-21 14:53 / 未解决

将一款产品从停产的旧单片机迁移到STM32中,原项目使用外部 EEPROM 存储大量配置参数,能有几百 KB。这些参数以每页 1KB 的形式存储,且每页的格式都不相同。

移植到STM32时必须保持完全相同的存储格式来保存这些配置。

举个例子:页 0 偏移地址 0 存储一个 uint8_t 类型的产品类型;偏移地址 1 存储一个 uint16_t 类型的产品子类型;偏移地址 3 存储另一个 uint16_t 变量,以此类推。

我们必须为每个变量指定绝对固定的存储位置,因为系统会在开机时从 EEPROM 加载配置到 RAM,关机时再从 RAM 写回 EEPROM。同时还有一个上位机软件用于修改这些配置:软件会直接告知单片机,我要读取页 0 偏移地址 1 的 uint16_t 变量,或者向这个地址写入数值 2。

所以,要让整套系统正常工作,所有变量的地址都必须提前定义且绝对固定不变。

在旧单片机上,我们可以直接这样写:

uint8_t product @0;

uint16_t product_subtype @1;

uint16_t product_subtype_2 @3;

之后我们只需要一个简单的 for 循环,就能在 RAM 和 EEPROM 之间批量读写整个配置区,上位机也是同样的逻辑。

在stm32上如何实现这样的寻址,之前的编译器 / 链接器不需要修改任何 .ld 链接脚本就能实现这个功能。

收藏 评论3 发布时间:2026-4-21 14:53

举报

3个回答
xmshao 回答时间:3 天前

这是标准化的问题,但跟所用编译器又有点关系。

你可以就你的IDE环境跟AI交流交流,相信你可以找到答案。

butterflyspring 回答时间:3 天前
假定用的是STM32F407,那么配置参数存贮在它的FLASH。

1.从数据手册上看,FLASH的改写需要先擦除一个 sector (16k 或 64K)全部为FF后才能写入新的数据。且次数有限制。它不像外置EEPROM那样之间对指定地址写而不影响周边数据。
2.单纯定义成常量,像程序一样烧录进去是可以的,通过命名读取也是能行的通的(通过修改 ld 文件以及相关初值定义)。
所以目前看来,存有可能达到你的期望,写从物理结构上是不可行的。所以还是采用外部EEPROM 才方便一些,并且次数可以达到4百万次以上(以ST的EEPROM 手册参数参考)。
STM32F407 F;ASH ERASE.PNG

fafa1 回答时间:前天 08:56

看你的应该是 使用的IAR,使用MDK AC5就是:

// 将一个数组定位到RAM地址0x20001000 uint8_t buffer[1024] attribute((at(0x20001000)));

AC6是这样:

int myVariable attribute((section(".ARM.__at_0x20001000")));

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版