您的位置:首页 > 其它

FSMC

2015-12-09 15:02 141 查看
FSMC全称“灵活静态存储器控制器”。

FSMC 包括4个模块:





(1)AHB接口(包括FSMC配置寄存器)

(2)NOR闪存和PSRAM控制器(驱动LCD的时候LCD就好像一个PSRAM的里面只有2个16位的存储空间,一个是DATA RAM 一个是CMD RAM)

(3)NAND闪存和PC卡控制器

(4)外部设备接口

每个模块通过片选信号控制

--------------------------------------------------------------------------------------------------

硬件电路(这里给出的是非复用连接)





可以这样接

地址线A0 接 RS

NE接 CS

NEW –WR

NOE –RD

FSMC与外设连接好以后,就等于对于使用者屏蔽了对外设备的具体操作,只要对应类型的映射地址空间写入数据,这些数据+地址就会被自动翻译,并写入外围存储设备。

对于写LCD来说,STM官方库里有一些常用写法:

#define LCD_BASE ((u32)(0x60000000
| 0x0C000000))//我解释一下,地址是BANK1 的 第四块

#define LCD ((LCD_TypeDef
*) LCD_BASE)

void LCD_WriteReg(u8 LCD_Reg,u16 LCD_RegValue)

{

LCD->LCD_REG
= LCD_Reg;

LCD->LCD_RAM
= LCD_RegValue;

}

u16 LCD_ReadReg(u8 LCD_Reg)

{

LCD->LCD_REG
= LCD_Reg;

return
(LCD->LCD_RAM);

}

当然也可以自己操作,完全在于自己。

--------------------------------------------------------------------------------------------------

初始化问题:

1位宽:

主要是AHB到NOR/PSRAM位宽的,比如如果AHB设为32位,NOR为16位,他会分两次传输





2:设置地址

手册是这样写的:在NOR/PSRAM模式下HADDR[27:26](HADDR
are internal AHB address lines that are translated to external memory)用来片选NOR/PSRAM的四个分区。A[25:0]是地址线,因为HADDR是字节地址但是存取其按字编址,所以根据位宽的不同由以下情况。

(1)当存储数据设为8位时, 地址各位对应FSMC_A[25:0],数据位对应FSMC_D[7:0](存储大小64MB
* 8 = 512MB)

(2)当存储数据设为16位时, 地址各位对应FSMC_A[25:1]>>1(即FSMC_A[24:0]),数据位对应FSMC_D[15:0]

(存储大小 (64MB / 2) * 16 = 512MB)

注意:在16位外部存储宽度下,FSMC内部会用A[25:1]去生成A[24:0]。不论8位或16位的情况,FSMC_A[0]必需连接外部存储的A[0]。

--------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------

FSMC的好处就是你一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:

(volatile unsigned short int*)(0x60000000)=val;

那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过 DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。

连接好之后,读写时序都会被FSMC自动完成。但是还有一个很关键的问题,就是RS没有接,CS没有接。因为在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。比如我们选择了A16这根地址线来接,那么当我们要写寄存器的时候,我们需要RS,也就是A16置高。软件中怎么做呢?也就是将FSMC要写的地址改成0x60020000,如下:

(volatile unsigned short int*)(0x60020000)=val;

这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会导致A16为1。

当要读数据时,地址由0x60020000改为了0x60000000,这个时候A16就为0了。--------------------------------------------------------------------------------------------------

下来就是关于 FSCM时序问题,大家都有讨论:

一.当FSMC选择NOR和PSRAM模块时:

分为两种:1.异步事务2.同步突发事务

异步事务分为普通模式(mode 1,mode 2)和模式1与模式2的4种扩展模式(mode A,B,C,D);

二.General timing rules(通用时序规则):

1.All
controller output signals change on the rising edge of the internal clock (HCLK)

(所有输出控制信号在内部时钟(HCLK)的上升沿改变)

2.In synchronous read and write mode, the output data changes on the falling edge of the

memory clock (FSMC_CLK).

(在同步读和写模式下,输出信号在存储器CLK的下降沿改变)

三.采样规则

The FSMC always samples the data before de-asserting the chip select signal NE. This

guarantees that the memory data-hold timing constraint is met (chip enable high to

data transition, usually 0 ns min.)

(FSMC总是在撤销片选信号NE前采样数据,这保证了了储存器数据保持时间的约束能够满足。)

四:时序计算

设定值都是以Hclk为基本单位的

公式:















现在没有完全弄明白的是,因为是异步模式,数据通过延迟一个HCLK通知给了对端,地址线上的信号怎么通知对端有效呢?

--------------------------------------------------------------------------------------------------

下面是一些资料上的数据,可以估算时间是否大概满足应用的要求:









--------------------------------------------------------------------------------------------------

一些常见问题的FAQ:


1.STM32F103 FSMC是不是所有型号都有?

ANS:VC,VD,VE,ZC,ZD,ZE只有这几个型号有。

---------------------------------------------------------------------------------------------------------------------------------


2.复用和非复用?

STM32的FSMC支持数据与地址线复用或非复用两种模式

非复用模式:16位数据线及26位地址线分开始用。推荐在144脚及以上的STM32产品上使用该模式。

复用模式:低16位数据/地址线复用。在该模式下,推荐使用地址锁存器以区分数据与地址。

若不使用锁存器:当NADV为低时,ADx(x=0…15)上出现地址信号Ax,当NADV变高时,ADx上出现数据信号Dx。

若使用锁存器:可同时在ADx上得到Ax和Dx。

FSMC中未使用的数据线或地址线可配置为GPIO

对于16位宽度的外部存储器,FSMC将在内部使用HADDR[25:1]产生外部存储器的地址FSMC_A[24:0]。因此,实际的访问地址为右移一位之后的地址。

---------------------------------------------------------------------------------------------------------------------------------


3.时序图(扩展模式)

普通模式和扩展模式的不同主要用途我觉得,就是把读、写设置成不尽相同的时序。所谓的模式A、B、C、D,其实没多大区别。

引用手册原文:

The differences with mode1 are the toggling of NADV and the independent read and write timings when extended mode is set。

---------------------------------------------------------------------------------------------------------------------------------


4. FSMC_NWAIT和FSMC_NE1/FSMC_NCE2.不明白这两个怎么用?

ANS:NBL0,NBL1,在STM32F103的数据手册里面有规定IO的,不能随便换.(PSRAM时使用)

NWAIT应该是FLASH操作才用的.NE1,NCE2就是一些片选信号.STM32的FSMC支持同时挂多个器件,每个器件都必须有一个CS(也就是NEx,NCEx).

NADV(NL)在复用时时所存信号。在非复用模式控制PSRAM输出有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: