打印

今天发现已经初始化的变量(.data域)不能放在片外RAM里

[复制链接]
2688|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
inurl|  楼主 | 2012-12-21 08:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 inurl 于 2012-12-21 09:05 编辑

        用STM32 的FSMC接口接的 片外SRAM ,由于这个SRAM要初始化FSMC之后才能使用, 所以不能将.data变量使用scatter file (或者 IDE)配置到片外 RAM里。
       看来FSMC接口有优势也有劣势啊。不知道大家之前有木有卡在这里过?
沙发
inurl|  楼主 | 2013-1-21 11:02 | 只看该作者
12121212

使用特权

评论回复
板凳
caizhenghu| | 2013-1-26 12:04 | 只看该作者
要是按楼主的意思,外部RAM就没法使用了。初始化这些变量之前肯定要先配置好FSMC的,要不硬件都通不过,肯定是没法初始化的。

使用特权

评论回复
地板
zchong| | 2013-1-26 17:56 | 只看该作者
跳转到__main之前初始化sram不就OK了嘛

使用特权

评论回复
5
cong4212| | 2013-1-26 18:55 | 只看该作者
在启动代码里进行FSMC的初始化,这个不一定非用汇编实现,可以用C语言定义初始化函数,在启动代码中调用,正如LS所说,在跳转到__main()之前调用。

使用特权

评论回复
6
inurl|  楼主 | 2013-3-4 09:00 | 只看该作者
zchong 发表于 2013-1-26 17:56
跳转到__main之前初始化sram不就OK了嘛

不光是FSMC初始化的问题,.data变量从ROM copy to RAM 的过程,我还没找到在哪里?要在这个之前

使用特权

评论回复
7
inurl|  楼主 | 2013-3-4 09:00 | 只看该作者
cong4212 发表于 2013-1-26 18:55
在启动代码里进行FSMC的初始化,这个不一定非用汇编实现,可以用C语言定义初始化函数,在启动代码中调用, ...

不光是FSMC初始化的问题,.data变量从ROM copy to RAM 的过程,我还没找到在哪里?要在这个之前

使用特权

评论回复
8
inurl|  楼主 | 2013-3-4 09:01 | 只看该作者
caizhenghu 发表于 2013-1-26 12:04
要是按楼主的意思,外部RAM就没法使用了。初始化这些变量之前肯定要先配置好FSMC的,要不硬件都通不过,肯 ...

.bss段不受影响,而.data段要拷贝数据,所以不能用

使用特权

评论回复
9
rider1| | 2013-3-4 09:31 | 只看该作者
inurl 发表于 2013-3-4 09:00
不光是FSMC初始化的问题,.data变量从ROM copy to RAM 的过程,我还没找到在哪里?要在这个之前 ...

.data变量从ROM copy to RAM 的过程 就是在 __main()里实现的,因此只要在其之前初始化FSMC即可。

使用特权

评论回复
10
caizhenghu| | 2013-3-4 20:59 | 只看该作者
本帖最后由 caizhenghu 于 2013-3-4 21:01 编辑
inurl 发表于 2013-3-4 09:01
.bss段不受影响,而.data段要拷贝数据,所以不能用


实际编写的main()函数在编译后并不是一启动就跑到main了,在main之前还要执行启动代码,启动代码执行完毕才开始初始化相关变量,再跳到main,所以在启动代码中初始化FSMC就可以了。楼主如果使用IAR的时候,会添加一个启动代码文件,其中systeminit这个函数就是在启动代码中执行的,所以楼主可以修改一下,增加一个初始化FSMC的过程就可以了。祝楼猪心情愉快!

使用特权

评论回复
11
inurl|  楼主 | 2014-1-16 19:40 | 只看该作者
__main
若程序使用的是C或C++语言编写的代码,那么C/C++程序的入口是在C Library中的
__main。库代码在此处执行以下操作。
(1)  1将非根(RO和RW)执行区从其加载地址复制到执行地址(这里的根区指的就是
__main和__rt_entry)。另外,如果压缩了任何数据节,则会将它们从加载地址解压
缩到执行地址(此数据压缩及解压缩过程并不是对所有代码都会执行);
(2)  将ZI区清零;
(3)  跳转到__rt_entry。

使用特权

评论回复
12
bruce_helen| | 2014-1-17 08:25 | 只看该作者
inurl 发表于 2014-1-16 19:40
__main
若程序使用的是C或C++语言编写的代码,那么C/C++程序的入口是在C Library中的
__main。库代码在此 ...

是的,说的很对。
只要在SystemInit中使用寄存器操作的方式将FSMC初始化就可以了。ST已经提供了相关代码,打开DATA_IN_ExtSRAM,在SystemInit_ExtMemCtl函数中将FSMC进行初始化。之后一切都好了。我就是这么干的。

使用特权

评论回复
13
inurl|  楼主 | 2014-1-17 15:59 | 只看该作者
bruce_helen 发表于 2014-1-17 08:25
是的,说的很对。
只要在SystemInit中使用寄存器操作的方式将FSMC初始化就可以了。ST已经提供了相关代码 ...

呵呵,老版的KEIL3.5的startup不带SystemInit_ExtMemCtl ,新版的FWLIB3.5的startup才带SystemInit_ExtMemCtl

使用特权

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

本版积分规则

37

主题

293

帖子

1

粉丝