lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.top-me.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    F***C使用之外扩RAM的妙用

    分享
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 25

    F***C使用之外扩RAM的妙用

    帖子 由 Admin 于 2013-09-16, 1:35 pm

    Smile 转自:  F***C使用之外扩RAM的妙用 | 中国嵌入式系统网



    在STM32上跑UCOS_II和UCGUI时,要想让屏幕稳定不闪,显示效果多样化,而且分配给每个任务的堆栈空间足够,STM32内部的RAM 肯定是不足的。最好的方法就是配置F***C使内部RAM作为堆栈使用,而外部RAM作为变量存储和UCOS_II的任务堆栈。现在介绍F***C以及如何配 置,并写出启动文件中需要修改的地方。
    F***C简介
    为什么可以利用F***C来使用外部RAM呢,先了解一下STM32里的F***C。大容量且引脚数在100脚以上的STM32F103芯片都带有 F***C接口。F***C是灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡接口,STM32的F***C接口支持包括SRAM、 NAND FLASH、NOR FLASH和PSRAM等存储器。F***C框图:

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

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

    对F***C的基本信息介绍就是上面这几点,重点是关注每一个区的地址范围。因为在下面的内容会用到。
    F***C配置
    根据此原理图进行配置:

    如图是以F***C的BANK1区域3来控制IS63WV51216这个1M字节容量的SRAM芯片。开始配置F***C,现在是利用F***C来操作外 部SRAM。所以在选择存储器类型时就选择SRAM。上图可以看出地址总线和数据总线是分开的,所以配置的时候选择不复用总线。也要注意的是芯片的数据宽 度是16位。在配置完成后使能控制块就可以了。如下是配置代码
    LDR R0,= 0x00000114
    LDR R1,= 0x40021014
    STR R0,[R1]         ;使能F***C时钟
    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]       ;时序寄存器配置结束  
    有了对F***C的配置代码,最后一步就是修改STM32的启动文件以及编译软件的设置,具体如何操作咱继续往后看。
    启动文件与编译软件配置
    最后一步就是对启动文件进行修改以及对编译软件进行配置。现在需要把片内的RAM全部作为栈来使用,所以在启动文件中要完成栈顶地址的设置以及长度的设置。并在启动文件中完成对F***C的配置。
    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     ;方便以后修改
    ;此处添加上面对F***C配置的代码
    ENDIF                             ;修改结束
    IMPORT  __main
    IMPORT  SystemInit
    LDR     R0, =SystemInit
    BLX     R0
    LDR     R0, =__main
    BX      R0
    ENDP
    第二处修改完成,主要是加入了对F***C配置的代码。到此启动代码的修改部分就结束了,下面对编译软件进行设置。在设置之前我们回头看看第一部分对 F***C的介绍,可以看出现在RAM的首地址为0x68000000,因为我们是通过Bank1的第三区控制的所以首地址是0x68000000。了解了 这个我们就开始设置编译软件:

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

      目前的日期/时间是2018-05-28, 9:20 am