OpenEdv-开源电子网

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

FSMC外扩SRAM

[复制链接]

21

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-4-12
在线时间
0 小时
发表于 2012-5-24 16:20:04 | 显示全部楼层 |阅读模式

需要外扩FSMC。有库函数的版本,想改改变成寄存器操作的。
今天郁闷的是没法追踪文件。害我找点参数看了半天。。。

想问军哥的是,需要修改哪些东西,然后选用哪种模式?

自信人生一百年
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-24 18:08:51 | 显示全部楼层
这个<<STM32参考手册>>FSMC章节都说了吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-4-12
在线时间
0 小时
 楼主| 发表于 2012-5-26 13:21:56 | 显示全部楼层
俺回去参考军哥那个FSMC控制TFT的程序,然后对照着手册和库函数,写了一下。。有点懒,没有写多字节缓冲的读写的两个程序,下面先对编译器进行设置,这个设置是想让他和操作内部自带的SRAM那样方便的。不知是否可以实现。上图如下:


我外扩的SRAM是512KB的,所以在OFF-CHIP里SIZE大小事0x80000,然后我的起始地址,是因为我是将SRAM挂在FSMC的BANK1,NE3,所以起始地址是0x68000000,记得default要打钩。

程序如下:
//--------------------FSMC_SRAM.H----------------------------------------------------//

#ifndef __FSMC_SRAM_H
#define __FSMC_SRAM_H

#include "stm32f10x_lib.h"

//定义SRAM读写的结构体
typedef struct
{
    u16 SRAM_ADDR;
    u16 SRAM_DATA;
}Sram_TypeDef;

//采用NOR/PSRAM存储块中的bank3,即HADDR[27:26]=10
#define Sram_EXTBase    ((u32)0x68000000)

#define SRAM    ((Sram_TypeDef*)Sram_EXTBase)

void Sram_Write(u32 Sram_Addr,u16 Sram_Data);
u16 Sram_Read(u16 Sram_Addr);
   
#endif

//----------------------------------------------------------------------------------------------
//---------------------------FSMC_SRAM.C-----------------------------------------------
#include "fsmc_sram.h"
#include "delay.h"
//---------------------------------------------------
//首先在options里off-chip的RAM1选中,然后输入起始地址为0X68000000,
//size为0x80000,这样就设置好了。
//-----------------------------------------------------

//
void Sram_Init()
{
//时钟配置
    RCC->APB2ENR|=0xF<<5;     //GPIOD,E,F,G时钟使能
    RCC->AHBENR|=1<<8;        //FSMC时钟使能
    RCC->APB2ENR|=1<<0;        //AFIO时钟使能
       
//GPIO配置
    GPIOD->CRL&=0XFF00FF00;//设置GPIOD0、1、4、5推免复用输出
    GPIOD->CRL|=0X00BB00BB;

    GPIOD->CRH&=0X000F00000;//GPIOD8、9、10、11、12、14、15推免输出
    GPIOD->CRH|=0XBBB0BBBBB;

    GPIOE->CRL&=0X0FFFFFFF;//设置GPIOE0、1、7推免复用输出
    GPIOE->CRL|=0XB00000BB;

    GPIOE->CRH&=0X00000000;//GPIOE8、9、10、11、12、13、14、15推免输出
    GPIOE->CRH|=0XBBBBBBBB;

   
    GPIOF->CRL&=0XFF000000;//设置GPIOF0、1、2、3、4、5推免复用输出
    GPIOF->CRL|=0X00BBBBBB;

    GPIOF->CRH&=0X0000FFFF;//设置GPIOF12、13、14、15推免复用输出
    GPIOF->CRH|=0XBBBB0000;

    GPIOG->CRL&=0XFF000000;//设置GPIOG0、1、2、3、4、5推免复用输出
    GPIOG->CRL|=0X00BBBBBB;

    GPIOG->CRH&=0XFFFFF0FF;//设置GPIOG10推免复用输出
    GPIOG->CRH|=0X00000B00;

//FSMC配置
//寄存器清零
//使用的是bank1中的第三个NE3,对应BTCR[4],[5],是BCR+TCR
    FSMC_Bank1->BTCR[4]=0X00000000;
    FSMC_Bank1->BTCR[5]=0X00000000;
//BWTR
    FSMC_Bank1E->BWTR[4]=0X00000000;    //这个是随便选择的一个数组
//操作BCR寄存器 使用异步方式
    FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能
    FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit        
//操作BTR寄存器                                   
//3个HCLK(HCLK=72M)72M/3=24M=42ns      
    FSMC_Bank1->BTCR[5]|=1<<9; //数据保存时间为3个HCLK          
//闪存写时序寄存器 
    FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值
//使能BANK1
    FSMC_Bank1->BTCR[4]|=1<<0;
           
    FSMC_Bank1->BTCR[5]|=0XF<<8; //数据保存时间为16个HCLK          

    FSMC_Bank1->BTCR[5]&=~(0XF<<8); //数据保存时间为0

    FSMC_Bank1->BTCR[5]|=1<<9;      //数据保存时间为3个HCLK      
}


//写SRAM
void Sram_Write(u32 Sram_Addr,u16 Sram_Data)
{
    SRAM->SRAM_ADDR=Sram_Addr;    //写入数据存放的地址
    SRAM->SRAM_DATA=Sram_Data;    //写入存放的数据
}

//读SRAM
u16 Sram_Read(u16 Sram_Addr)
{
    SRAM->SRAM_ADDR=Sram_Addr;    //写入要读取数值的地址
    delay_us(5);
    return(SRAM->SRAM_DATA);    //返回读取的数值
}
//---------------------------------------------------------------------------------------------------------------
这个程序还没有验证是否正确。因为现在只在写底层驱动阶段。









自信人生一百年
回复 支持 反对

使用道具 举报

21

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-4-12
在线时间
0 小时
 楼主| 发表于 2012-5-26 13:24:32 | 显示全部楼层
再传下程序文件

fsmc_sram.c

2.21 KB, 下载次数: 914

fsmc_sram.h

406 Bytes, 下载次数: 886

自信人生一百年
回复 支持 反对

使用道具 举报

21

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2011-4-12
在线时间
0 小时
 楼主| 发表于 2012-5-26 16:53:24 | 显示全部楼层
军哥,指导指导~~~哈哈,这样可以实现和操作内部SRAM那样吗?通过编译器的配置
自信人生一百年
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-27 00:17:23 | 显示全部楼层
可不可以你自己试试就知道了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2012-6-1
在线时间
3 小时
发表于 2012-6-4 17:58:52 | 显示全部楼层
u16 Sram_Read(u16 Sram_Addr)
{
    SRAM->SRAM_ADDR=Sram_Addr;    //写入要读取数值的地址
    delay_us(5);
    return(SRAM->SRAM_DATA);    //返回读取的数值
}

請問 FSMC 位址與資料都可以設定delay 時間,是否可以不用加入 delay(5)?
回复 支持 反对

使用道具 举报

42

主题

568

帖子

0

精华

高级会员

Rank: 4

积分
784
金钱
784
注册时间
2010-12-19
在线时间
5 小时
发表于 2012-11-16 08:41:58 | 显示全部楼层
lz怎么没下文了?
一个上蹿下跳的猴子~~~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 22:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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