硬汉嵌入式论坛

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

[例程下载] 全局变量,堆和栈空间全部定义到外部SRAM的方法和一个配套例子

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2015-7-18 17:47:42 | 显示全部楼层 |阅读模式
说明:首先要明白一点,开发板硬件上电复位前,我们是无法完成STM32对外部SRAM的配置,只能上电后进行配置了
才可以使用。也就是说,只有正常的硬件复位序列完成后,我们可以在Reset_Handler(复位中断服务程序)中完成对
SRAM的配置,但是在这之前,局部变量和函数调用用到的Stack栈空间,我们都得使用STM32内部SRAM,明白了这
点,开始说下配置(堆栈的初始化是由函数_ _main完成的,这个函数被MDK封装起来了,最终跳转到用户main函数)。
======================================================================
第一步:修改启动代码,固定的分配0x400字节做为栈使用。特别注意,修改栈顶指针固定在0x2000_0400位置。
不要让编译器去自动配置。
1.png




第二步:在函数SystemInit_ExtMemCtl中初始化外部SRAM
1.png


第三步:配置外部SRAM的起始地址和大小:
3.png



第四步:添加全局的宏定义
4.png

===============================================================
配置完毕后就可以使用了,基于STM32-V5开发板的一个例子(仅修改了MDK,IAR没有做修改):
V5-101_按键检测和LED控制例程.rar (4.59 MB, 下载次数: 883)




回复

使用道具 举报

8

主题

33

回帖

7

积分

新手上路

积分
7
发表于 2015-7-18 21:50:01 | 显示全部楼层
赞,第一次见到这种配置
回复

使用道具 举报

116

主题

799

回帖

1147

积分

至尊会员

积分
1147
QQ
发表于 2015-7-20 08:16:37 | 显示全部楼层
是不是支持外挂SDRAM的话还可以跑在外部内存?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-7-20 08:59:33 | 显示全部楼层

回 jcx0324 的帖子

jcx0324:是不是支持外挂SDRAM的话还可以跑在外部内存? (2015-07-20 08:16) 
可以的。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2015-7-20 09:28:32 | 显示全部楼层
外部RAM需要通过FSMC访问,不知道存取速度会不会受到影响?

比如,使用DMA进行ADC数据快速存取?
比如,emwin的刷新速度会变低吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-7-20 09:48:39 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:外部RAM需要通过FSMC访问,不知道存取速度会不会受到影响?

比如,使用DMA进行ADC数据快速存取?
比如,emwin的刷新速度会变低吗
 (2015-07-20 09:28) 
实际在我们的V5板子上面测试,F407+外部高速SRAM(速度100MHz)

速度是40MB/S左右。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2015-7-20 10:56:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:实际在我们的V5板子上面测试,F407+外部高速SRAM(速度100MHz)

速度是40MB/S左右。 (2015-07-20 09:48) 
内部的RAM应该是全速的100多M吧?

还是内部大RAM比较好啊。。。。ST系列的RAM都比较小气,没有NXP的多。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-7-20 10:59:21 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:内部的RAM应该是全速的100多M吧?

还是内部大RAM比较好啊。。。。ST系列的RAM都比较小气,没有NXP的多。 (2015-07-20 10:56) 
是的,发这个帖子是因为好几个群友问到了这个问题,所以就专门发一下。
回复

使用道具 举报

100

主题

275

回帖

575

积分

金牌会员

积分
575
发表于 2016-3-3 13:42:23 | 显示全部楼层
这样配置后,内部RAM还能用吗?
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2016-4-1 20:42:24 | 显示全部楼层
专门注册感谢楼主!!我用stm32 跑lua脚本,内部内存不太够用,尝试heap放到外部内存总是硬件错误,试了好多方法,自己写realloc内存分配函数倒是可以,但是速度又太慢。今天看了本帖受到启发,heap放到外部内存终于可以被c自带的realloc函数正常调用了,感谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2016-4-1 21:33:13 | 显示全部楼层

回 chubbyk 的帖子

chubbyk:专门注册感谢楼主!!我用stm32 跑lua脚本,内部内存不太够用,尝试heap放到外部内存总是硬件错误,试了好多方法,自己写realloc内存分配函数倒是可以,但是速度又太慢。今天看了本帖受到启发,heap放到外部内存终于可以被c自带的realloc函数正常调用了,感谢! (2016-04-01 20:42) 
[s:142][s:142]
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
发表于 2016-4-7 14:25:00 | 显示全部楼层
这种方法适用于SDRAM吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2016-4-8 01:23:40 | 显示全部楼层

回 cingcing 的帖子

cingcing:这种方法适用于SDRAM吗? (2016-04-07 14:25) 
没问题的。
回复

使用道具 举报

6

主题

14

回帖

6

积分

新手上路

积分
6
发表于 2016-4-27 22:16:58 | 显示全部楼层
请问该方法是否适用于V4的开发板?
回复

使用道具 举报

6

主题

14

回帖

6

积分

新手上路

积分
6
发表于 2016-4-27 22:17:47 | 显示全部楼层
请问该方法是否适用于V4的开发板?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2016-4-28 01:30:23 | 显示全部楼层

回 zhangxiao 的帖子

zhangxiao:请问该方法是否适用于V4的开发板? (2016-04-27 22:17) 
可以的,没问题。
回复

使用道具 举报

6

主题

14

回帖

6

积分

新手上路

积分
6
发表于 2016-4-29 14:35:00 | 显示全部楼层
在V4上修改后,size设为“0x100000”,其余一样,结果直接从串口输出“Enter HardFault_Handler, System Halt.”
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2016-4-30 01:07:58 | 显示全部楼层

回 zhangxiao 的帖子

zhangxiao:在V4上修改后,size设为“0x100000”,其余一样,结果直接从串口输出“Enter HardFault_Handler, System Halt.” (2016-04-29 14:35) 
你的发另一个帖子里面已经回复了:
http://www.armbbs.cn/forum.php?m ... 47&page=e#a
回复

使用道具 举报

3

主题

11

回帖

3

积分

新手上路

积分
3
发表于 2016-10-28 20:06:24 | 显示全部楼层
感谢eric哥,遇到这个问题,搜索就找到了帖子。

能这么详尽的做技术分享,真是难得,太感谢了。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2017-9-20 13:19:51 | 显示全部楼层
在Creep的推荐下,发现还有这样一个好论坛和好文章。留名。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2018-1-4 11:40:06 | 显示全部楼层
V6开发板F429可以用这种方法把堆、栈空间定义到外部SDRAM吗?
我在V6开发板上照着这个配置,程序跑不起来
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2018-1-4 11:42:54 | 显示全部楼层
_uuuu 发表于 2018-1-4 11:40
V6开发板F429可以用这种方法把堆、栈空间定义到外部SDRAM吗?
我在V6开发板上照着这个配置,程序跑不起来

V6的emWin例子矢量字库显示章节配套例子就行,去看看吧,记得先看教程说明。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2018-1-4 14:54:17 | 显示全部楼层
eric2013 发表于 2018-1-4 11:42
V6的emWin例子矢量字库显示章节配套例子就行,去看看吧,记得先看教程说明。

谢谢Eric,可以用了现在
回复

使用道具 举报

0

主题

38

回帖

38

积分

新手上路

one is enough

积分
38
发表于 2018-3-16 13:28:02 | 显示全部楼层
mark!好方法,请教一下,这个是初始化外部ram前强制head在内部ram,等外部ram初始化造成后在把head移到外部ram吗?
one is enough
回复

使用道具 举报

2

主题

11

回帖

48

积分

新手上路

积分
48
发表于 2018-5-3 10:31:01 | 显示全部楼层
_uuuu 发表于 2018-1-4 14:54
谢谢Eric,可以用了现在

你好,可以说一下V6板子上还需要做什么修改吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2018-5-3 10:52:38 | 显示全部楼层
图图 发表于 2018-5-3 10:31
你好,可以说一下V6板子上还需要做什么修改吗?

看V6的emWin例子矢量字库显示章节配套例子就行,记得先看教程说明。
回复

使用道具 举报

2

主题

11

回帖

48

积分

新手上路

积分
48
发表于 2018-5-3 11:07:21 | 显示全部楼层
eric2013 发表于 2018-5-3 10:52
看V6的emWin例子矢量字库显示章节配套例子就行,记得先看教程说明。

大神您好,我是在V6开发板外扩了SRAM,跑freeRTOS系统的,现在内存不够用,想配置外存能够像内存一样由编译器自己完成分配,除了上面你说的四个步骤,还有什么改动吗?
回复

使用道具 举报

2

主题

11

回帖

48

积分

新手上路

积分
48
发表于 2018-5-3 14:42:28 | 显示全部楼层
eric2013 发表于 2018-5-3 10:52
看V6的emWin例子矢量字库显示章节配套例子就行,记得先看教程说明。

你说的例子里面就多了将heap空间指定到外存地址去,没啥效果啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2018-5-4 02:46:09 | 显示全部楼层
图图 发表于 2018-5-3 11:07
大神您好,我是在V6开发板外扩了SRAM,跑freeRTOS系统的,现在内存不够用,想配置外存能够像内存一样由编 ...

自由编译分配要采用这个方法,比较方便,仅需在变量前面加个前缀就行。
http://www.armbbs.cn/forum.php?m ... &extra=page%3D2
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-12-7 22:42:27 | 显示全部楼层
请问一下硬汉哥,我按照你这个方法无法实现,报如下错误。
,..\OBJ\SRAM.axf: Error: L6971E: system_stm32f4xx.o(.data) type RW incompatible with main.o(.ARM.__AT_0x68000000) type ZI in er RW_RAM1.
MCU是STM32F407ZGT6
TIM截图20181207224033.png
TIM截图20181207224112.png
TIM截图20181207224131.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2018-12-8 01:31:55 | 显示全部楼层
王海靖 发表于 2018-12-7 22:42
请问一下硬汉哥,我按照你这个方法无法实现,报如下错误。
,..\OBJ\SRAM.axf: Error: L6971E: system_stm ...

把你的工程生成的xxx.sct分散加载文件内容贴出来看下。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-12-8 08:58:08 | 显示全部楼层
eric2013 发表于 2018-12-8 01:31
把你的工程生成的xxx.sct分散加载文件内容贴出来看下。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM1 0x68000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM1 0x200000C0 UNINIT 0x00020000  {
   .ANY (+RW +ZI)
  }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2018-12-8 09:30:39 | 显示全部楼层
王海靖 发表于 2018-12-8 08:58
; *************************************************************
; *** Scatter-Loading Description ...

你是不是手动设置分散加载了,删掉,使用MDK自动生成的。

自动生成不会有下面这个的
RW_IRAM1 0x200000C0 UNINIT 0x00020000  {
   .ANY (+RW +ZI)
  }

QQ截图20181208093112.jpg
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-12-8 11:05:29 | 显示全部楼层
eric2013 发表于 2018-12-8 09:30
你是不是手动设置分散加载了,删掉,使用MDK自动生成的。

自动生成不会有下面这个的

谢谢硬汉哥的回答,已经可以用了。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2018-12-11 09:47:15 | 显示全部楼层
Eric, 关于IAP我有个疑问,之前问道,loader的内存资源,在跑APP的时候会重新初始化内存,其他外设的情况是怎样的?。

1.我测试发现:loader 初始化了 串口。发现APP把串口初始化蔽掉了也可以使用了。这是外色IO口都会这样吗?
2.64KB的片内内存,给了45KB emWin,感觉内存 没有被loader私吞。

关于1的现象,我在loader 还初始化了eeprom, flash,屏幕,如果APP不初始化会不会有潜在的风险?
关于2的描述,有没有进一步部的测试验证方法?内存细活我玩的很少。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2019-7-4 16:25:22 | 显示全部楼层
今天把这个翻出来试了试,结果SRAM检查都是正确的。但是死机在GUI_Init();了。 emwin的aMemory         0x680004dc   Data       30720  guiconf.o(.bss) ,也是正常的。。。
不知何故?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2019-7-4 16:40:37 | 显示全部楼层
caicaptain2 发表于 2019-7-4 16:25
今天把这个翻出来试了试,结果SRAM检查都是正确的。但是死机在GUI_Init();了。 emwin的aMemory         0x6 ...

这个例子仅供调试学习,不能用于实战,稍复杂的例子就卡死不动了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 09:00 , Processed in 0.319789 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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