这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » FSMC使用之外扩RAM的妙用

共4条 1/1 1 跳转至

FSMC使用之外扩RAM的妙用

专家
2013-10-29 10:47:40     打赏

  在STM32上跑UCOS_II和UCGUI时,要想让屏幕稳定不闪,显示效果多样化,而且分配给每个任务的堆栈空间足够,STM32内部的RAM肯定是不足的。最好的方法就是配置FSMC使内部RAM作为堆栈使用,而外部RAM作为变量存储和UCOS_II的任务堆栈。现在介绍FSMC以及如何配置,并写出启动文件中需要修改的地方。

  本文引用地址:http://www.eepw.com.cn/article/182411.htm

  FSMC简介

  为什么可以利用FSMC来使用外部RAM呢,先了解一下STM32里的FSMC。大容量且引脚数在100脚以上的STM32F103芯片都带有FSMC接口。FSMC是灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡接口,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。FSMC框图:

FSMC使用之外扩RAM的妙用

  FSMC管理1 GB的映射地址空间。该空间划分为4个大小为256 MB的BANK,每个BANK又划分为4个64 MB的子BANK,FSMC的2个控制器管理的映射地址空间不同。NOR Flash控制器管理第1个BANK,NAND/PC Card控制器管理第2~4个BANK。如图是FSMC的存储空间地址映射:

FSMC使用之外扩RAM的妙用

  这次的重点是用上外部的RAM,所以只介绍Bank1。STM32的FSMC存储块1被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对连接的存储器进行配置。Bank1的256M字节空间由28根地址先寻址。当Bank1接的是16位宽的设备,HADDR[25:1]->FSMC[24:0]。当Bank1接的是8为宽度存储器的时候:HADDR[25:0]->FSMC[25:0]。

FSMC使用之外扩RAM的妙用

  对FSMC的基本信息介绍就是上面这几点,重点是关注每一个区的地址范围。因为在下面的内容会用到。

  FSMC配置

  根据此原理图进行配置:

FSMC使用之外扩RAM的妙用

  如图是以FSMC的BANK1区域3来控制IS63WV51216这个1M字节容量的SRAM芯片。开始配置FSMC,现在是利用FSMC来操作外部SRAM。所以在选择存储器类型时就选择SRAM。上图可以看出地址总线和数据总线是分开的,所以配置的时候选择不复用总线。也要注意的是芯片的数据宽度是16位。在配置完成后使能控制块就可以了。如下是配置代码

  LDR R0,= 0x00000114

  LDR R1,= 0x40021014

  STR R0,[R1] ;使能FSMC时钟

  LDR R0, =0X000001E0

  LDR R1, =0X40021018

  STR R0,[R1] ;GPIOD,GPIOE,GPIOF,GPIOG时钟使能

  LDR R0,= 0x44BB44BB

  LDR R1,= 0x40011400

  STR R0,[R1]

  LDR R0,= 0xBBBBBBBB

  LDR R1,= 0x40011404

  STR R0,[R1] ;配置GPIOD

  LDR R0,= 0xB44444BB

  LDR R1,= 0x40011800

  STR R0,[R1]

  LDR R0,= 0xBBBBBBBB

  LDR R1,= 0x40011804

  STR R0,[R1] ;配置GPIOE

  LDR R0,= 0x44BBBBBB

  LDR R1,= 0x40011C00

  STR R0,[R1]

  LDR R0,= 0xBBBB4444

  LDR R1,= 0x40011C04

  STR R0,[R1] ;配置GPIOF

  LDR R0,= 0x44BBBBBB

  LDR R1,= 0x40012000

  STR R0,[R1]

  LDR R0,= 0x44444B44

  LDR R1,= 0x40012004

  STR R0,[R1] ;配置GPIOG

  LDR R0,= 0x00001011 ;选择存储类型SRAM,地址数据不复用,总线宽度16位,写使能,并启动存储器块

  LDR R1,= 0xA0000010

  STR R0,[R1] ;对控制寄存器配置完成

  LDR R0,= 0x00000200 ;根据外部SRAM芯片的时序配置时序寄存器

  LDR R1,= 0xA0000014

  STR R0,[R1] ;时序寄存器配置结束

  有了对FSMC的配置代码,最后一步就是修改STM32的启动文件以及编译软件的设置,具体如何操作咱继续往后看。

  启动文件与编译软件配置

  最后一步就是对启动文件进行修改以及对编译软件进行配置。现在需要把片内的RAM全部作为栈来使用,所以在启动文件中要完成栈顶地址的设置以及长度的设置。并在启动文件中完成对FSMC的配置。

  DATA_IN_ExtSRAM EQU 1 ;方便以后修改所用

  Stack_Size EQU 0x00000400 ;定义栈的大小

  AREA STACK, NOINIT, READWRITE, ALIGN=3

  Stack_Mem SPACE Stack_Size

  IF DATA_IN_ExtSRAM == 1 ;重点从这里开始

  __initial_sp EQU 0X20000000 + Stack_Size ;设置栈顶地址,STM32是向下生长 ;的所以这么设置

  ELSE

  __initial_sp

  ENDIF

  第一处修改完成,主要完成了对栈顶的设置。下面开始第二处:

  Reset_Handler PROC

  EXPORT Reset_Handler [WEAK]

  IF DATA_IN_ExtSRAM == 1 ;方便以后修改

  ;此处添加上面对FSMC配置的代码

  ENDIF ;修改结束

  IMPORT __main

  IMPORT SystemInit

  LDR R0, =SystemInit

  BLX R0

  LDR R0, =__main

  BX R0

  ENDP

  第二处修改完成,主要是加入了对FSMC配置的代码。到此启动代码的修改部分就结束了,下面对编译软件进行设置。在设置之前我们回头看看第一部分对FSMC的介绍,可以看出现在RAM的首地址为0x68000000,因为我们是通过Bank1的第三区控制的所以首地址是0x68000000。了解了这个我们就开始设置编译软件:

FSMC使用之外扩RAM的妙用

  到此为止所有工作都完工了,可以给UCGUI的存储设备分配70K字节的空间都毫无压力。最后提醒一点,记得将Use MicroLIB 选上。




关键词: FSMC     RAM     STM32    

菜鸟
2013-11-16 15:38:03     打赏
2楼
学习了 图片一般都在外置sram中保存刷新比较好

高工
2013-11-16 22:54:52     打赏
3楼

学习了

每次都用micro-sd卡的


工程师
2013-11-29 23:07:52     打赏
4楼
果断收藏

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]