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

外部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)
  2.         /* #define DATA_IN_ExtSRAM */
  3.         #define DATA_IN_ExtSRAM 1
  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偶尔正常,偶尔不正常,调试下感觉是延时的问题,没有再继续调试了


收藏 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
好帖子
zfz0122 回答时间: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

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

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