你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样

[复制链接]
蓝凌风 发布时间:2015-3-13 09:40

        前几天看到开源电子论坛(openedv.com)有人在问这个问题,我特意去做了这个实验,这样用外部SRAM就跟用内部SRAM一样,不用自己去申请内存,也不用考虑什么内存地址,一切让编译器自己去解决。

        废话不多说,我直接拿原子哥的战舰开发板库函数版的外部SRAM实验来修改。在库函数的system_stm32f10x.c这个初始化文件当中其实就已经有外部SRAM的初始化,我们只要增加“#define DATA_IN_ExtSRAM 1”这句宏定义

  1. #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)4 T7 e& ^4 O: ~  c/ k/ l% n
  2.         /* #define DATA_IN_ExtSRAM */8 _8 t* E9 Q/ @/ b8 S. h! X
  3.         #define DATA_IN_ExtSRAM 1
    3 [7 ]; ~4 Z' z; H, d0 n
  4.         #endif
复制代码

        再编译的时候就会把外部SRAM的初始化编译进去,初始化的代码大家可以去看文件中的void SystemInit_ExtMemCtl(void) 这个函数。然后我们在工程设置那里把外部SRAM地址增加进去,如下图

11.png

       修改启动文件中的中的第39行,把__initial_sp 修改成 __initial_sp  EQU 0x20000000 + Stack_Size

12.png

        然后我们把Main中的testsram中的地址去掉,让编译器自己去指定地址

14.png

        再把原子哥的外部SRAM的初始化注释掉,因为前面已经在System_init已经初始化了。其实这里我们可以把原子的SRAM.c文件去掉不用它了,我这里没去掉,其实只是为了能正常调用fsmc_sram_test()来测试实验结果

13.png

        到这里我们可以编译了,下载到开发板,我们就可以看到实验结果

15.png

        我们继续深入点,看看testsram[]这个大数组到处编译在到哪里去了,用IDA64来反汇编下编译出来的AXF文件

16.png

        可以看到testsram这个大数组自动编译到外部sram的0x68000000这个地址上。我们再试试再定义几个大数组看看

17.png

        再来看看编译后的结果

18.png

       可以看到每个大数组都由编译器自己分配了内存的地址,压根不用我们自己去定义。

       到这里相信大家会有一个疑问,那编译是怎么来决定把哪些变量定义在内部SRAM,那些定义在外部SRAM。这一点我也研究清楚,我只知道编译会优先把变量都定义外部SRAM,当外部SRAM不够用情况才会定义在内部SRAM上,至于怎么让编译优先使用内部SRAM,我也没有搞明白。目前我能做到的是把已经初始化的全局变量都放在SRAM,做法是修改散列文件,让RW只在内存SRAM上编译。

19.png

       去掉小红框的勾,然后点击Edit我们来修改SRAM.sct文件,也就是编译散列文件

20.png

       把RW_RAM1中(也就是外部SRAM)的+RW去掉,这样已经初始化的全局变量就只会编译在内部SRAM中

21.png

       重新编译下工程,再来反汇编下看看编译结果

22.png

        可以看到usmart_nametab[]这个已经初始化的数组编译在内部SRAM上,adc2[]这个未初始化的数组,数组的大小比较而且能在内部Sram编译得下的,却还是编译在外部SRAM上。

        最后散列相关的知识,大家可以看看这里http://blog.csdn.net/lindabell/a ... 1a374a433f596ad1440

        前面没有修改启动文件,其它变量全部在内部SRAM的时候,程序运行是没有问题,减小数组的时候程序运行不起来,修改前面的红字部分后,程序就可以运行起来,但是LCD偶尔正常,偶尔不正常,调试下感觉是延时的问题,没有再继续调试了


4 W4 j: m' z! w. `* P" S( a
收藏 3 评论7 发布时间:2015-3-13 09:40

举报

7个回答
foxglove 回答时间:2015-3-13 10:54:50
STM32的外部SRAM操作 有深度的帖子
zhangdaijin 回答时间:2015-3-13 13:31:47
确实是个好方法啊,充分发挥了编译器的作用!
逍遥李 回答时间:2015-3-13 14:17:14
感谢大神分享!
chaplin1999-262 回答时间:2015-3-13 15:34:35
好帖子
kqh1120 回答时间:2015-3-13 16:42:20
谢谢分享啊 14.gif
wn1900 回答时间:2015-7-16 10:00:35
很有意义,学习了,谢谢分享
党国特派员 回答时间:2015-7-16 10:09:18
感谢大神分享! blank.png blank1.png blank2.png blank3.png blank4.png

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版