打印
[开发工具]

发现MDK下用STM32的外扩RAM必死无疑

[复制链接]
10926|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tsx1983|  楼主 | 2008-10-10 09:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,在MDK的Target选项下在RAM1那行如果填上0x68000000和任一大于0x10000的数,编译下载之后连main函数都进不去,直接进硬FAULT了。如果填的SIZE小于等于0x1000就可正常运行。
经跟踪发现,只要填的size大于0x10000(64K),初始堆栈就被分配到了0x68000000以后的地址,当执行启动代码到

            IMPORT  __main
                 LDR     R0, =__main
                 BX      R0   ;执行到这立刻硬FAULT
                 ENDP

哪位高手能给个解决方法?用的是ST官方提供的DEMO。芯片是STM32F103ZET6.
沙发
香水城| | 2008-10-10 10:31 | 只看该作者

怀疑你的硬件有问题

写一段小程序检测一下是否能够正确地操作外部RAM。

使用特权

评论回复
板凳
tsx1983|  楼主 | 2008-10-10 11:05 | 只看该作者

应该没问题

只要我不在RAM1前面打上勾,然后用函数来操作外部RAM,都是正常的。只要打上勾就进不去主函数了。我在 BX      R0   前面人为的把堆栈设到内部RAM还是不行,只要一执行BX      R0   就硬FAULT。

把外部RAM的SIZE设到0X10000就可以。大于他就不行

使用特权

评论回复
地板
tsx1983|  楼主 | 2008-10-10 11:07 | 只看该作者

香主有用果外部RAM么?

如题!      周末去拿块原装板来试试就知道了

使用特权

评论回复
5
香水城| | 2008-10-10 11:14 | 只看该作者

如果外扩RAM没有问题,是否是__main以后有问题

可能问题不在BX R0这个指令上,试试在__main的第一或第二条指令处设置个断点并连续执行。

使用特权

评论回复
6
tsx1983|  楼主 | 2008-10-10 11:34 | 只看该作者

呵呵,问题已解决,谢谢

还是堆栈分配的问题。忽略了这句注释

; If you need to use external SRAM mounted on STM3210E-EVAL board as data memory
; and internal SRAM for Stack, uncomment the following line and comment the line above
;__initial_sp    EQU 0x20000000 + Stack_Size ; "Use MicroLIB" must be checked in
                                             ; the Project->Options->Target window

使用特权

评论回复
7
tsx1983|  楼主 | 2008-10-10 11:54 | 只看该作者

用的MDK是3.23版

用的MDK是3.23版

使用特权

评论回复
8
Swd21ic| | 2008-10-10 23:13 | 只看该作者

re

16bit的minibus外扩SRAM

对于32bit操作不会很慢吗? 还有FSMC速度也只能到36MHz~

如果外扩SRAM.内、外地址不连续的话在IAR中应该是修改xcl文件吧..

难道将某些段放到内部..某些段放到外部..那不是有点慢有点快..

使用特权

评论回复
9
tsx1983|  楼主 | 2008-10-11 11:43 | 只看该作者

晕,还是有问题

__initial_sp    EQU 0x20000000 + Stack_Size 
把这句加上之后,可以进Main了,但还是动不动就进硬Fault了,

使用特权

评论回复
10
tsx1983|  楼主 | 2008-10-14 09:27 | 只看该作者

ST的外扩RAM空间到底能不能用来做堆栈

如题,ST的外扩空间能不能用来做堆栈。请香主解答一下

使用特权

评论回复
11
香水城| | 2008-10-14 10:15 | 只看该作者

外扩RAM空间当然可以用作堆栈

但是因为堆栈是经常要用到的,而外扩RAM速度比内部SRAM慢,所以强烈建议堆栈放在内部SRAM。

使用特权

评论回复
12
tsx1983|  楼主 | 2008-10-14 12:10 | 只看该作者

问题跑着跑着他就到外部RAM了

无论我怎么设置,只要一用外部RAM,跑着跑着堆栈就到外面了,立刻就FAULT了。这个要如何解决呢

使用特权

评论回复
13
香水城| | 2008-10-14 12:26 | 只看该作者

内部RAM与外部RAM不是相邻的,既编址不是连续的

因此如果你把堆栈设在了内部RAM后,在程序运行中堆栈却跑到外部RAM,这一定是你的程序出问题了,解决办法就是好好地检查程序。

使用特权

评论回复
14
tsx1983|  楼主 | 2008-10-14 13:05 | 只看该作者

我没用自己的程序呀!

我运行的是ST的STM32F10E-EVAL的DEMO。没有添加任何自己的代码。

使用特权

评论回复
15
tsx1983|  楼主 | 2008-10-14 13:09 | 只看该作者

ST的DEMO外廓空间也只填了64K

我看了一下,ST的DEMO在RAM1那个选项,填的起始地址是0X68000000,SIZE=0X10000。就是64K。
我要把这个64K变成任何一个大于64K的数值的话立刻FAULT。

难道它就只能用到64K?要这样的话扩个512K还有什么意义呢

使用特权

评论回复
16
香水城| | 2008-10-14 13:47 | 只看该作者

没有看过这个Demo,不知道是否程序中用到了外部RAM容量这个

如果程序中使用外部RAM容量作为某种参数,那么你更改了这个参数,相应的程序也应该有所变化。

使用特权

评论回复
17
fanhanbai| | 2013-6-21 16:20 | 只看该作者
遇到和楼主同样的问题,不知楼主解决了没,求帮助

使用特权

评论回复
18
王紫豪| | 2013-6-21 18:39 | 只看该作者
怎么可能有问题哦, 我的 icore2 轻松扩展 1M RAM, 还是通过 fpga桥接的...

https://bbs.21ic.com/forum.php?mo ... p;page=3#pid3234348

使用特权

评论回复
19
hugh_zeng| | 2015-2-5 11:06 | 只看该作者
问题解决了么?好像不难啊

使用特权

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

本版积分规则

25

主题

160

帖子

0

粉丝