stm32-100脚FSMC

非100脚的FSMC:

第一个角度理解STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR(写)、RD(读)、DB0-DB15这些控制线和数据线,

都是FSMC自动控制的。打个比方,当你在程序中写到:

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

那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据0x0055的值也

会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=0x0055 )。地址0x60000000会被呈现在数据线上(即A0-A25=0,A0-A25正好对应0x60000000-0x64000000,对应64M,存储块1正好是4x64M即0x60000000-0x6fffffff)。

那么在硬件上面,我们需要做的,仅仅是MCU和LCD控制芯片的连接关系.

挂接多个存储器的时候,对相应地址写数据,NEX片选线会自动选择相应的芯片使能,NE1是第一个存储块,即NOR/SRAM存储块 ....

 

100脚的FSMC操作:

通常会利用100脚的FSMC操作LCD控制芯片,或者CPLD,这个时候由于地址线不齐全,而且不需要地址线,多余的地址线会用作相应的命令、数据寄存器选择线,这个时候还像非100脚的操作方法操作。

这里以SSD1963为例,通常接法如下图

QQ截图20120220151407

这里地址线A16连接的是SSD1963的命令、数据选择接口,当A16为0时写到该芯片的命令寄存器里,A16为1时写的是相应的数据,所以在stm32里面会定义0x60000000是命令寄存器的地址,0x60020000是数据寄存器的地址,因为当地址为0x60020000的时候A0-A25里面A16的值为1,所以就写进数据寄存器里。

看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以

我们要位移一下,Bit17的值,实际会被反应到A16这根IO来。详细:http://hi.baidu.com/billchian/blog/item/424a1e8055c177a16d81192b.html

#define Bank1_LCD_R ((uint32_t)0x60000000) //disp Reg ADDR

#define Bank1_LCD_D ((uint32_t)0x60020000) //disp Data ADDR

你可能感兴趣的:(stm32)