来源:转载自21ic论坛极海半导体专区
01 前言
一般我们开发MCU自带的SRAM,对一般应用来说,已经够用了,但是对于内存需求较高的场合,比如跑GUI或者算法等,自带的内存会就不够用,这个时候就要外扩SRAM或SDRAM。
不过还好找到了APM32E103VET6S,这款芯片合封了2MB的SDRAM,就是集成在芯片内部的意思,据我阅读数据手册了解,合封的SDRAM只是跟MCU封装在一起,初始化程序写法跟外扩SDRAM是一样的。在程序中使用SDRAM的时候我们都需要填入起始地址,很不方便,这时候就需要内存管理来帮助我们自动分配内存,大大减少开发时间和出现bug的可能。

图1-1产品命名规范
根据图1-1可以看出APM32后缀带S就是合封了2MB的SDRAM,不带后缀S是没有的,那么再来对比下这2者的区别,如图1-2所示,合封了SDRAM的会把SDRAM所使用到的引脚隐藏起来了,但是官方没有把PB11隐藏起来,与SDRAM存在冲突,如有使用建议更换其他IO口。

图1-2 合封与非合封的区别
接下来看官方芯片数据手册如图1-3,Flash:512KB,SRAM:128KB,SDRAM:2MB

图1-3存储器

图1-4地址映射图
从地址映射可以看到SDRAM的地址从60000000H开始,记住这个地址,待会程序里用到。
02 准备材料
接下来用到2个程序,正点原子战舰内存管理例子和APM32E1的SDK的DMC_SDRAM例子,我们在DMC_SDRAM程序的基础上移植正点原子战舰内存管理例子:
1、【正点原子】战舰STM32F103开发板资料 资料盘(A盘)4,程序源码实验37 内存管理实验
2、APM32E10x_SDK_V1.2ExamplesEMMCDMC_SDRAM
03 移植说明
1、首先复制正点原子战舰内存管理例子里的malloc.c和malloc.h到DMC_SDRAM工程下,修改malloc.c中的外部内存地址为0x60000000

2、修改malloc.h,我这里SDRAM用1920K,留了点没用完

3、移植完成,下面测试下

运行串口打印如下:

Err Count : 0证明SDRAM测试读写正常。然后再看打印的p地址不是0x20000000H,而是在60000000H到60200000H之间,就证明申请的内存用在SDRAM内。
好了,以后程序里就可以用mymalloc(SRAMEX,xxx)函数申请SDRAM自动分配的内存或者mymalloc(SRAMIN,xxx)申请内部SRAM自动分配的内存啦。
注:文章作者在原帖中提供了例程文件,有需要请至原文21ic论坛下载
原文地址:https://bbs.21ic.com/icview-3327108-1-1.html
全部0条评论
快来发表一下你的评论吧 !