硬汉嵌入式论坛

 找回密码
 立即注册
查看: 292|回复: 2
收起左侧

[STM32CubeIDE] STM32CubeIDE实现在不同的RAM区域定义有初始值的全局变量(RW-data)

[复制链接]

2

主题

12

回帖

18

积分

新手上路

积分
18
发表于 2024-2-29 19:41:31 | 显示全部楼层 |阅读模式
本帖最后由 Florence 于 2024-2-29 22:08 编辑

使用安富莱V7开发板,主RAM使用内核直连的DCTRAM。这里在RAM_D1里定义RW-data举例,


第一步:主RAM修改为DTCRAM。
cubemx生成的ld文件默认主RAM为RAM_D1,在xxxx_FLASH.ld文件中把RAM_D1修改为DTCRAM
下载1.png 下载2.png
第二步在xxxx_FLASH.ld文件中,添加RAM_D1的Section。

下载3.png
[C] 纯文本查看 复制代码
    /* used by the startup to initialize data */
  _siram_d1_data = LOADADDR(.ram_d1_data);

    /* Initialized data sections goes into RAM, load LMA copy after code */
  .ram_d1_data :
  {
    . = ALIGN(4);
    _sram_d1 = .;       /* create a global symbol at ram_d1 start */
    *(.ram_d1_data)
    *(.ram_d1_data*)        

    . = ALIGN(4);
    _eram_d1 = .;       /* create a global symbol at ram_d1 end */

  } >RAM_D1 AT> FLASH

第三步在startup_xxxx.s中添加拷贝RW-data的代码
下载4.png
[Asm] 纯文本查看 复制代码
  ldr r0, =_sram_d1
  ldr r1, =_eram_d1
  ldr r2, =_siram_d1_data
  movs r3, #0
  b LoopCopyRAMD1DataInit

CopyRAMD1DataInit:
  ldr r4, [r2, r3]
  str r4, [r0, r3]
  adds r3, r3, #4

LoopCopyRAMD1DataInit:
  adds r4, r0, r3
  cmp r4, r1
  bcc CopyRAMD1DataInit
第四步在main函数中定义在RAM_D1中的变量
使用__attribute__((section(".ram_d1_data")))定义变量并给定一个初始值
下载5.png 下载6.png


第五步编译仿真调试
可以看到赋值成功
下载7.png

总结
优点:无需担心变量初值不确定的情况,也不用在项目代码上增加初始化的部分
缺点:ZIdata也会占用FLASH空间,如有需要得额外增加ZIdata的section来管理

一顿折腾下来感觉还是MDK的编译工具链好用啊,直接自动识别变量是RW还是ZO,简短的SCT文件代码就能实现这个功能


评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-2-29 19:48:48 | 显示全部楼层
论坛图片好像加载不出来,我把文件贴上来吧

Armfly_V7.zip

6.35 KB, 下载次数: 3

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-3-1 09:01:54 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 07:43 , Processed in 0.174153 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表