请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

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

[STM32CubeIDE] 自定义GCC链接LD文件,GCC设置外部SRAM通用方法(F103外挂SRAM,使用HAL库)

[复制链接]

19

主题

369

回帖

426

积分

高级会员

积分
426
发表于 2020-12-28 13:23:19 | 显示全部楼层 |阅读模式
板子:F103ZET6用FSMC外挂了1M的SRAM,开发环境STM32CubeIde v1.5.0
问题:在启动阶段(即SystemInit()阶段),不需要定义DATA_IN_ExtSRAM宏,不需要调用SystemInit_ExtMemCtl(),直接使用官方HAL库流程,如何让GCC自动处理储存在SRAM的变量(不需要手动分配外挂SRAM的绝对地址等等。。。)?
解决方案:
1)打开项目下的STM32F103ZETX_FLASH.ld文件
2)给GCC添加外挂内存(CubeMX设置为FSMC_BANK1_3),起名字为:EXTSRAM
修改前:
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
}

修改后:
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
  EXTSRAM (rw)     : ORIGIN = 0x68000000,  LENGTH = 1024K
}
3) 添加section段:ext_sram(NOLOAD),注意NOLOAD的意思是储存在ext_sram段的内存变量,在启动的时候(就是main()之前的阶段)不需要初始化。这里容易出问题,标准HAL库是在进入main()才开始初始化(外挂SRAM需要调用MX_FSMC_Init()初始化,才可以使用),不加NOLOAD的话,在启动阶段GCC默认加载内存变量(extern或者static变量),找不到外挂SRAM,导致HardFault
修改前:
  /* User_heap_stack section, used to check that there is enough "RAM" Ram  type memory left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM

  /* Remove information from the compiler libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }


修改后:
  /* User_heap_stack section, used to check that there is enough "RAM" Ram  type memory left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM

  /* external sram data, do not initialize at startup  */
  .ext_sram(NOLOAD) :
  {
    . = ALIGN(4);
    _sext_sram = .;        /* create a global symbol at ext_sram start */
    *(.ext_sram)
    *(.ext_sram*)
   
    . = ALIGN(4);
    _eext_sram = .;        /* define a global symbol at ext_sram end */
  } >EXTSRAM AT> FLASH

  
  /* Remove information from the compiler libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

4)完毕,按照HAL库的官方流程走
5)使用实例,给出emWin的例子,其他如文件系统之类的也适用

修改前(借用MDK的例子,网上找的):

#define GUI_NUMBYTES      (1024 * 512)

static U32 aMemory[GUI_NUMBYTES / 4] __attribute__((at(0X68000000)));

修改后(使用GCC):
#define GUI_NUMBYTES      (1024  * 512)

static U32 aMemory[GUI_NUMBYTES / 4] __attribute__ ((section (".ext_sram")));


欢迎探讨!!!


回复

使用道具 举报

19

主题

369

回帖

426

积分

高级会员

积分
426
 楼主| 发表于 2020-12-28 13:29:22 | 显示全部楼层
不方便的地方就是变量(extern或者static)初始化要手动加载
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
发表于 2020-12-29 09:33:23 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

207

主题

1033

回帖

1664

积分

至尊会员

More we do, more we can do.

积分
1664
发表于 2021-1-4 13:07:23 | 显示全部楼层
一般外部有SDRAM或SRAM时,在SystemInit里初始化硬件,保证C运行环境初始化能支持外部存储器。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2022-5-17 14:57:15 | 显示全部楼层
__attribute__ ((section (".ext_sram")));使用这样的方法定义一个大小为1K,初值为0的数组到外部sram,那编译的时候也FLASH中也会增加1K空间,这样有点浪费FLASH
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:08 , Processed in 0.154592 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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