打印
[应用相关]

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

[复制链接]
803|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前几天看到论坛有人在问这个问题,我特意去做了这个实验,这样用外部SRAM就跟用内部SRAM一样,不用自己去申请内存,也不用考虑什么内存地址,一切让编译器自己去解决。        废话不多说,我直接拿原子哥的战舰开发板库函数版的外部SRAM实验来修改。在库函数的system_stm32f10x.c这个初始化文件当中其实就已经有外部SRAM的初始化,我们只要增加“#define DATA_IN_ExtSRAM 1”这句宏定义


<div><a>?</a></div><table border="0" cellSpacing="0" cellPadding="0"><tbody><tr><td><div>1</div><div>2</div><div>3</div><div>4</div></td><td><div><div><code>#if defined (<a  target="_blank">STM32F1</a>0X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)</code></div><div><code>/* #define DATA_IN_ExtSRAM */</code></div><div><code>#define DATA_IN_ExtSRAM 1</code></div><div><code>#endif</code></div></div></td></tr></tbody></table>

使用特权

评论回复
沙发
尽快回复过|  楼主 | 2022-3-27 16:32 | 只看该作者

1

2

3

4



#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

/* #define DATA_IN_ExtSRAM */

#define DATA_IN_ExtSRAM 1

#endif

使用特权

评论回复
板凳
尽快回复过|  楼主 | 2022-3-27 16:33 | 只看该作者
再编译的时候就会把外部SRAM的初始化编译进去,初始化的代码大家可以去看文件中的void SystemInit_ExtMemCtl(void) 这个函数。然后我们在工程设置那里把外部SRAM地址增加进去,如下图

使用特权

评论回复
地板
尽快回复过|  楼主 | 2022-3-27 16:34 | 只看该作者
修改启动文件中的中的第39行,把__initial_sp 修改成 __initial_sp  EQU 0x20000000 + Stack_Size

使用特权

评论回复
5
尽快回复过|  楼主 | 2022-3-27 16:35 | 只看该作者

使用特权

评论回复
6
尽快回复过|  楼主 | 2022-3-27 16:52 | 只看该作者
     然后我们把Main中的testsram中的地址去掉,让编译器自己去指定地址

使用特权

评论回复
7
尽快回复过|  楼主 | 2022-3-27 16:53 | 只看该作者

使用特权

评论回复
8
尽快回复过|  楼主 | 2022-3-27 16:53 | 只看该作者
再把原子哥的外部SRAM的初始化注释掉,因为前面已经在System_init已经初始化了。其实这里我们可以把原子的SRAM.c文件去掉不用它了,我这里没去掉,其实只是为了能正常调用fsmc_sram_test()来测试实验结果

使用特权

评论回复
9
尽快回复过|  楼主 | 2022-3-27 16:54 | 只看该作者

使用特权

评论回复
10
尽快回复过|  楼主 | 2022-3-27 16:55 | 只看该作者
  到这里我们可以编译了,下载到开发板,我们就可以看到实验结果

使用特权

评论回复
11
尽快回复过|  楼主 | 2022-3-27 16:56 | 只看该作者

使用特权

评论回复
12
尽快回复过|  楼主 | 2022-3-27 16:57 | 只看该作者
我们继续深入点,看看testsram[]这个大数组到处编译在到哪里去了,用IDA64来反汇编下编译出来的AXF文件

使用特权

评论回复
13
尽快回复过|  楼主 | 2022-3-27 16:57 | 只看该作者

使用特权

评论回复
14
尽快回复过|  楼主 | 2022-3-27 16:58 | 只看该作者
可以看到testsram这个大数组自动编译到外部sram的0x68000000这个地址上。我们再试试再定义几个大数组看看

使用特权

评论回复
15
尽快回复过|  楼主 | 2022-3-27 16:59 | 只看该作者

使用特权

评论回复
16
尽快回复过|  楼主 | 2022-3-27 16:59 | 只看该作者
再来看看编译后的结果


使用特权

评论回复
17
尽快回复过|  楼主 | 2022-3-27 17:00 | 只看该作者
可以看到每个大数组都由编译器自己分配了内存的地址,压根不用我们自己去定义。

使用特权

评论回复
18
尽快回复过|  楼主 | 2022-3-27 17:02 | 只看该作者
到这里相信大家会有一个疑问,那编译是怎么来决定把哪些变量定义在内部SRAM,那些定义在外部SRAM。这一点我也研究清楚,我只知道编译会优先把变量都定义外部SRAM,当外部SRAM不够用情况才会定义在内部SRAM上,至于怎么让编译优先使用内部SRAM,我也没有搞明白。目前我能做到的是把已经初始化的全局变量都放在SRAM,做法是修改散列文件,让RW只在内存SRAM上编译。

使用特权

评论回复
19
尽快回复过|  楼主 | 2022-3-27 17:02 | 只看该作者

使用特权

评论回复
20
尽快回复过|  楼主 | 2022-3-27 17:03 | 只看该作者
  去掉小红框的勾,然后点击Edit我们来修改SRAM.sct文件,也就是编译散列文件

使用特权

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

本版积分规则

33

主题

512

帖子

0

粉丝