打印

STM32中将变量定义到外部SRAM中的问题

[复制链接]
14139|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wanghaibo1026|  楼主 | 2012-2-9 21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近有个项目使用了STM32F103ZE的片子,由于片内RAM的空间有限,所以使用FSMC的非复用总线方式,外接了61LV51216芯片,在keil4的OPTION选项中选择外部RAM的范围为0X68000000,SIZE为0XFFFFF; 该地址属于外部BANK1中第3区间,然后在system_stm32f10x.c中,打开“#define DATA_IN_ExtSRAM”,使得程序在启动后,进入MAIN()函数前,配置好外部SRAM,外部SRAM配置文件已经和STM32官方例程序进行对比过,没有错误,但调试后,程序在完成了启动文件后,在进入MAIN函数前,就跳进了“void HardFault_Handler(void)”函数,进入了死循环。
    在看完了程序编译的MAP文件后发现,一但选择外部SRAM后,变量和STACK(堆栈)就全部自动转入了外部SRAM中,进行了单步调试后发现,程序在进行了压栈操作后,出栈时的返回就发生了错误,使得程序直接跳进了“void HardFault_Handler(void)”函数,如果能将堆栈地址能定义在内部SRAM中,程序应该可以顺利,但不知道怎样操作,不知道有没有人研究这个问题,怎样才能将全局变量定义到外部SRAM中,请坛中高手指点一下,谢谢!!
沙发
wanghaibo1026|  楼主 | 2012-2-9 22:45 | 只看该作者
请楼主和高手看看,指点一下!

使用特权

评论回复
板凳
wanghaibo1026|  楼主 | 2012-2-9 22:47 | 只看该作者
写错了,是请版主和高手们看看,指点一下!!

使用特权

评论回复
地板
wanghaibo1026|  楼主 | 2012-2-10 08:46 | 只看该作者
自己顶一下

使用特权

评论回复
5
airwill| | 2012-2-10 11:23 | 只看该作者
这个很简单
在工程的选项中,  设定 RAM 的地方, 将你添加的 0X68000000 这个地址的 选型, 前面的 default 选择去掉, 仅留下面的 IRAM 选 default 就可以了

使用特权

评论回复
6
wanghaibo1026|  楼主 | 2012-2-10 11:38 | 只看该作者
楼上,你的方法没有用,你的这样操作根本就没有把变量和堆栈分配到外部SRAM,还是在内部的RAM中,你可以看一下MAP中的分配请况

使用特权

评论回复
7
airwill| | 2012-2-10 12:06 | 只看该作者
哦, 我弄错了.
把变量和堆栈分配到外部SRAM, 那就把 0X68000000  设置成 default 咯.
还有, 0X68000000 要放在上面的 RAM1 里

使用特权

评论回复
8
wanghaibo1026|  楼主 | 2012-2-10 13:00 | 只看该作者
楼上,你说的这些设置方法,你有没有写程序试过,我都试过了,一但选择了外部SRAM,程序运行就会出问题的,不是你说的这么简单,还在启动文件中,加载FSMC-SRAM的设置,我现在就不知道,我在哪里的设置有问题。

使用特权

评论回复
9
airwill| | 2012-2-10 13:52 | 只看该作者
你不是说要设置到 外部 RAM 嘛, 我只是告诉你怎么设置可以使用 外部 SRAM.
至于 void HardFault_Handler(void) 问题, 你单步跟踪试试, 直接跟踪 CPU 窗口, 逐条指令地跟, 看看是那条指令导致的 FAULT, 然后再根据 FAULT 的寄存器值, 分析引发异常的原因.
详细问题, 推荐你看看 CortexM3技术参考手册, 和 Cortex-M3 权威指南

使用特权

评论回复
10
wanghaibo1026|  楼主 | 2012-2-10 14:59 | 只看该作者
问题已经解决了,还是KEIL4的设置问题,在OPTION里设置好了外部RAM后,[img][/img],还要在main。c文件的OPTION选项中,选择 Memory Assignment 的范围和 之前设置的一致,就可以了,谢谢楼上的回复。

使用特权

评论回复
11
z_no1| | 2012-2-10 17:14 | 只看该作者
在初始化FSMC前,你的堆栈放外存肯定不行的,外存那个时刻还不能访问呢。外存只适合放全局变量。
外存访问也慢啊,实在要把堆栈放外存,我想了个办法(没试过),用分段编程,上电后先进一个程序,以片内RAM为堆栈,先把FSMC初始化好,然后跳到另一个程序,这个程序以外存为堆栈,这样应该可以了。

使用特权

评论回复
12
ilovezeno| | 2012-2-13 15:30 | 只看该作者
11# z_no1
st不是有现成的么,在system init里就已经初始化了fsmc了,你进main的时候外部sram已经初始化完成,所以不会有你说的这个问题的。

使用特权

评论回复
13
kaka120505| | 2012-3-26 20:21 | 只看该作者
小弟最近也在搞这个,跪求指导啊,求版主QQ号,我的QQ是346897739

使用特权

评论回复
14
HEYsir| | 2012-11-1 21:59 | 只看该作者
12# ilovezeno
大哥,求教啊,我就要用到FSMC,因为全局变量太大(用来存图像的),只能用外部SRAM,但不知道怎么设置。
我现在的理解:
1、要先在主程序一开始初始化FSMC(我用官方的例程设置)
2、在keil4里要进行配置,先工程option---然后主函数option选择zero initdata为外部。
(但这样我一些重要的状态标志的全局变量也出去了)
不知道是不是这样就可以了啊。

还有,小弟不知道你说的system init在哪?

使用特权

评论回复
15
kumosheng| | 2012-12-17 13:12 | 只看该作者
楼主你的SRAM问题怎么解决的啊,Memory Assignment 范围怎么设置啊?小弟也遇到跟你一样的问题?

使用特权

评论回复
16
chenferrari| | 2014-8-12 12:00 | 只看该作者
我也顶一个,,,同求啊!另外,程序能否在外部SRAM中运行,就是不需要内部RAM了?

使用特权

评论回复
17
自由鸟358| | 2019-11-27 10:05 | 只看该作者
9012年遇到了同样的问题,然后在HAL库中找到了HAL_SRAM_WriteOperation_Enable(&hsram1);这个函数,使用写入外部内存前打开这个就不会再hardfault

使用特权

评论回复
18
rose嘉| | 2019-11-27 11:09 | 只看该作者
SRAM需求多少?

使用特权

评论回复
19
kingkits| | 2019-11-27 11:57 | 只看该作者
外部RAM也可以在main()里初始化,然后弄个malloc函数(或者使用伪指令#define 你的变量地址)去动态分配空间可能比较好。这样就避免了常规内存和编译的冲突
也可以把外部内存单独定义一个段 (你的keil工程里有个.sct 文件,研究一下怎么设置和使用)

使用特权

评论回复
20
kingkits| | 2019-11-27 12:01 | 只看该作者
chenferrari 发表于 2014-8-12 12:00
我也顶一个,,,同求啊!另外,程序能否在外部SRAM中运行,就是不需要内部RAM了? ...

在外部RAM运行程序,需要一些编译技巧。内部RAM不用,你是准备卖钱还是当传家宝呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

68

帖子

1

粉丝