硬件连接
使用STM32的FSMC可以轻松地访问片外存储器。通过FSMC可以很轻易地驱动ILI9320的LCD控制器。ILI9320与STM32硬件连接如下:
/*********************************
** 硬件连接说明 **
** STM32 ili9320 **
** FSMC_D0~D15 <----> DB0~15 **
** FSMC_NOE <----> nRD **
** FSMC_A0 <----> RS **
** FSMC_NWE <----> nWR **
** FSMC_NE4 <----> nCS **
** NRST <----> nReset **
** PA1 <----> BK_LED **
**********************************/
100脚封装的STM32没有GPIOF和GPIOG端口,所以FSMC_A0~A15是与所以FSMC_B0~B15复用,需要外加锁存器才可以外接存储器,电路可参加51单片机的外接存储器电路。如果是用于与ILI9320连接的话,可以将RS接到FSMC的其它地址脚,只需要在软件上做手脚就可以了,详细后面会说到。
ILI9320引脚说明
DB0~15 --- 双向数据总线
RD --- 读使能信号,低电平有效
WR --- 写使能信号,低电平有效
CS --- 片选信号,低电平有效
WR --- 写使能信号,低电平有效
RS --- 寄存器选择信号,低电平为index(如何翻译?)或状态寄存器,高电平为控制 寄存器
FSMC初始化(具体看程序代码)
1、开启AFIO、GPIOx(不开启GPIO时钟也可以的?)和FSMC的时钟
2、将相应的GPIO端口配置成复用功能推挽输出,输出速度为50MHZ
3、设置FSMC寄存器:置位FSMC_BCR4的第4位和第12位,其它为0, 置位FSMC_BTR4的第9位,其它为0。(具体意思看手册)
4、设置FSMC_BCR4的第0位,使能存储块
控制原理
实际上是把ILI9320当作一块SRAM来控制,不过这个SRAM只有两个地址,由RS引脚决定。所以只要把FSMC的任一条地址线与RS相连即可,不同的地址线,软件编写也有所不同。红牛开发板用的是FSMC_A0与RS相连,刚开始我觉得奇怪,既然是以16位的宽度访问,地址的0位应该始终为0才对,后来查看数据手册才知道对于16位宽度的外部存储器,FSMC将在内部使用HADDR[25:1]产生外部存储器的地址FSMC_A[24:0],论外部存储器的宽度是多少(16位或8位),FSMC_A[0]始终应该连到外部存储器的地址线A[0]。 看来是我之前理解错了以半字对齐访问的存储器的硬件结构。
弄清楚了上面这些之后,如果我们要访问ILI9320的index或状态寄存器时,只需要住内存6C00 0000处内存读写即可(BANK1的基址为6000 0000,因为选用FSMC_NE4,所以外设基址为C00 0000),这时FSMC_A0输出的是0。当要访问控制寄存器时,只需要住内存6C00 0002处内存读写即可,这时FSMC_A0输出的是1。