初级会员
- 积分
- 70
- 金钱
- 70
- 注册时间
- 2019-5-15
- 在线时间
- 21 小时
|
板子: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")));
6)缺点:外挂SRAM变量(带属性 __attribute__ ((section (".ext_sram"))))需要手动初始化,稍微不方便,比较适合用于大容量缓冲等应用场景(GUI,文件系统等)
欢迎探讨!!!
|
|