OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4525|回复: 13

STM32系列“外部SRAM”使用总结与分析

[复制链接]

15

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2014-10-29
在线时间
37 小时
发表于 2018-6-22 14:48:57 | 显示全部楼层 |阅读模式
最近在学习一些gui方面的操作,并且是要跑os的;突然就发现自己的硬件平台的内部SRAM资源不够用了(硬件平台:战舰V2stm32f103ze、外扩SRAM1M);怎么破,那只能把外部的SRAM给用起来,不用就是浪费啊,要知道SRAM可是不便宜啊;
         然后就开始借鉴了配套例程:外部SRAM的使用;通过fsmc来控制实现,外部sram可以正常使用了,但是我想尝试下其他的方法来使用外部的SRAM
1、  不使用attribute关键字来实现变量等在外部的分配,让编译器自己来完全支配,这样我们就不用计算我们指定的地址是否会重合等问题;
2、  让内部的64K SRAM、外部的1M SRAM都能用,而且让编译器自己处理使用;
3、  完全不使用内部的SRAM,只使用外部的SRAM
上网上查阅一些资料后,发现这个需要在2010年就有了,而且当时网友遇到的问题,我在实验中也遇到了,关键是前面的帖子,也没有很明确或是清晰的给出解释,有的帖子给的方法是可以实现要求的,但是没有说为什么这样可以,所以我自己一边实验一边验证,下面把自己遇到的问题和现象做一个记录:
1、  按照https://blog.csdn.net/ybhuangfugui/article/details/51477977网友的方法来配置,让编译器自动处理SRAM的使用
(1)      实验前提,例程采用配套例程的:37外部SRAM实验;外部SRAM的初始化使用system_stm32f10x.c官方提供的fsmc初始化;
我的文档是用office整理的,里面每一步都有解释和配图,但是这里上传比较麻烦,我就不传了,这里写个开头算了,详细内容见附件吧!
   

12 STM32的外部SRAM使用的总结.zip

1.7 MB, 下载次数: 299

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-6-25 13:30:40 来自手机 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6614
金钱
6614
注册时间
2018-6-27
在线时间
555 小时
发表于 2018-7-13 09:53:30 | 显示全部楼层
谢谢分享,学习学习。
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-8 09:05:03 | 显示全部楼层
能用到实际项目中吗?稳定程度有多少
回复 支持 反对

使用道具 举报

20

主题

227

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2018-8-8 09:13:18 | 显示全部楼层
好帖,顶起
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-8 09:45:10 | 显示全部楼层

外挂SRAM就是可以当成RAM用的。。。
不过我一般用绝对地址定位,来使用外部SRAM,而不用MDK自动分配这种方式。
因为如果速度要求高的计算,使用外部SRAM,那么速度就大打折扣了
这几句话怎么看?
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-8 09:48:59 | 显示全部楼层

外挂SRAM就是可以当成RAM用的。。。
不过我一般用绝对地址定位,来使用外部SRAM,而不用MDK自动分配这种方式。
因为如果速度要求高的计算,使用外部SRAM,那么速度就大打折扣了
这几句话怎么看?
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-8 10:43:30 | 显示全部楼层
ssssssssssss 发表于 2018-8-8 09:48
外挂SRAM就是可以当成RAM用的。。。
不过我一般用绝对地址定位,来使用外部SRAM,而不用MDK自动分配这 ...

我没有研究过,也没有在帖子中看到这几句话。
但这几句话也觉得没有什么问题啊。
1、当然能当成RAM使用,要不然用来吃啊?
2、用绝对地址,就是想有更大的操控权,把自己想放到外部RAM的变量放到外部RAM中去。
3、因为如果速度要求高的计算,使用外部SRAM,那么速度就大打折扣了,这一句也是对第2点做法的考虑,很显然,外部RAM使用端口作为总线来访问,访问速度当然是比不上内部RAM了,所以用绝对地址,自己根据自己的项目实际有权规划把哪些变量放到外部,而不是让编译器自行处理。比方说:我有一个大的采集数据数组,就可以用绝对地址放到外部,否则MDK可能把它放在内部,占用了宝贵的内部资源,等到内部RAM不够了,就把你程序中的其它变量放在外部,而这些变量使用的频繁程度或对速度要求高的程度大于那个采集数组,你觉得合算吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-8 10:48:19 | 显示全部楼层
本帖最后由 ssssssssssss 于 2018-8-8 10:57 编辑
warship 发表于 2018-8-8 10:43
我没有研究过,也没有在帖子中看到这几句话。
但这几句话也觉得没有什么问题啊。
1、当然能当成RAM使用 ...

,那我觉得我可以把特定的数组地址固化到外部sram啊,
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-8 10:49:04 | 显示全部楼层
warship 发表于 2018-8-8 10:43
我没有研究过,也没有在帖子中看到这几句话。
但这几句话也觉得没有什么问题啊。
1、当然能当成RAM使用 ...

http://www.openedv.com/forum.php ... ht=%CD%E2%B2%BFsram
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-8 10:57:38 | 显示全部楼层
ssssssssssss 发表于 2018-8-8 10:49
http://www.openedv.com/forum.php?mod=viewthread&tid=20930&highlight=%CD%E2%B2%BFsram

哦,看到了,原来是原子说的。
一般情况下,使用外部是因为内部不够用。
就可以把一些大的数组用绝对地址的方式指定分配到外部RAM中,
这样就可以避免编译器把一些重要的东西放到外部RAM。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-8 11:02:02 | 显示全部楼层
本帖最后由 ssssssssssss 于 2018-8-8 11:08 编辑
warship 发表于 2018-8-8 10:57
哦,看到了,原来是原子说的。
一般情况下,使用外部是因为内部不够用。
就可以把一些大的数组用绝对地 ...

我现在想知道,原子说这么操作不稳定,不可控,不可靠的依据是什么?如果怕编译器把一些重要的东西放外部sram,那应该自己可以调整吧,比如我让编译器编译的只有内部sram,然后我外部sram已经初始化好了,然后把一些大的数组规定地址放外部sram,只不过此时已经不用去申请内存了,不知道这么可行吗
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-8 11:12:26 | 显示全部楼层
ssssssssssss 发表于 2018-8-8 11:02
我现在想知道,原子说这么操作不稳定,不可控,不可靠的依据是什么?如果怕编译器把一些重要的东西放外部 ...

可以,用attribute关键字为大数组分配固定地址,不占用内部RAM,
这样编译器就自然为其它变量优先使用内部RAM了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-8 11:15:09 | 显示全部楼层
warship 发表于 2018-8-8 11:12
可以,用attribute关键字为大数组分配固定地址,不占用内部RAM,
这样编译器就自然为其它变量优先使用内 ...
如果这么做的话可以省掉两个读写函数,那也是方便了很多
[mw_shl_code=c,true]                                                                                                                           
//ÔúÖ¸¶¨μØÖ·¿aê¼,á¬DøD′èën¸ö×Ö½ú.
//pBuffer:×Ö½úÖ¸Õë
//WriteAddr:òaD′èëμÄμØÖ·
//n:òaD′èëμÄ×Ö½úêy
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
        for(;n!=0;n--)  
        {                                                                                    
                *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;         
                WriteAddr++;
                pBuffer++;
        }   
}                                                                                                                                                            
//ÔúÖ¸¶¨μØÖ·¿aê¼,á¬Dø¶á3ön¸ö×Ö½ú.
//pBuffer:×Ö½úÖ¸Õë
//ReadAddr:òa¶á3öμÄÆeê¼μØÖ·
//n:òaD′èëμÄ×Ö½úêy
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
{
        for(;n!=0;n--)  
        {                                                                                            
                *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);   
                ReadAddr++;
        }  
} [/mw_shl_code]



如果这么做的话可以省掉两个读写函数,那也是方便了很多
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表