目录
使用STM32的FSMC模拟8080接口时序
FSMC简介
FSMC NOR/PSRAM中的模式B时序图
用FSMC模拟8080时序
重点:HADDR内部地址与FSMC地址信号线的转换(实现地址对齐)
使用STM32的FSMC模拟8080接口时序
ILI9341的8080通讯接口时序可以由STM32使用普通I/O接口进行模拟,但这样效率太低,STM32提供了一种特别的控制方法——使用FSMC接口实现8080时序。(如果芯片硬件少于100脚,是无法使用FSMC来控制液晶屏,只能使用SPI的方式来控制)
在前面的《FSMC—扩展外部SRAM》章节中了解到STM32的FSMC外设可以用于控制扩展的外部存储器,而MCU对液晶屏的操作实际上就是把显示数据写入到显存中,与控制存储器非常类似,且8080接口的通讯时序完全可以使用FSMC外设产生,因而非常适合使用FSMC控制液晶屏。
FSMC简介
控制LCD时,适合使用FSMC的NOR\PSRAM模式,它与前面使用FSMC控制SRAM的稍有不同,控制SRAM时使用的是模式A,而控制LCD时使用的是与NOR FLASH一样的模式B,所以我们重点分析框图中NOR FLASH控制信号线部分。
在控制LCD时,使用的是类似异步、地址与数据线独立的NOR FLASH控制方式,所以实际上CLK、NWAIT、NADV引脚并没有使用到。
其中NEx、NOE、NWE都是低电平有效。
STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域。 例如,当STM32访问0x68000000-0x6BFFFFFF地址空间时,FSMC_NE3引脚会自动设置为低电平,由于它连接到SRAM的CE#引脚,所以SRAM的片选被使能,而访问0x60000000-0x63FFFFFF地址时,FSMC_NE1会输出低电平。当使用不同的FSMC_NE引脚连接外部存储器时,STM32访问外部存储器的地址不一样,从而达到控制多个外部存储设备的目的。
SRAM同样使用异步通讯,SRAM信号线的信号线如下,与控制LCD的引脚线对照来看
这里复习一下FSMC的地址映射
图中左侧的是Cortex-M3内核的存储空间分配,右侧是STM32 FSMC外设的地址映射。可以看到FSMC的NOR/PSRAM/SRAM/NAND FLASH以及PC卡的地址都在External RAM地址空间内。
正是因为存在这样的地址映射,使得访问FSMC控制的存储器时,就跟访问STM32的片上外设寄存器一样(片上外设的地址映射即图中左侧的“Peripheral”区域)。
FSMC把整个External RAM存储区域分成了4个Bank区域,并分配了地址范围及适用的存储器类型,如NOR及SRAM存储器只能使用Bank1的地址。
在NOR及SRAM区域,每个Bank的内部又分成了4个小块,每个小块有相应的控制引脚用于连接片选信号,如FSMC_NE[4:1]信号线可用于选择BANK1内部的4小块地址区域,当STM32访问0x68000000-0x6BFFFFFF地址空间时,会访问到Bank1的第3小块区域,相应的FSMC_NE3信号线会输出控制信号。
因此当我们板子上如果SRAM已经使用了一个片选引脚NEx,那么NOR FLASH的片选引脚就不能是同一个,不然会导致地址冲突。
FSMC NOR/PSRAM中的模式B时序图
FSMC NOR/PSRAM中的模式B的写时序如下图:
根据STM32对寻址空间的地址映射,地址0x6000 0000 ~0x9FFF FFFF是映射到外部存储器的,而其中的0x6000 0000 ~0x6FFF FFFF则是分配给NOR FLASH、PSRAM这类可直接寻址的器件。
FSMC NOR/PSRAM中的模式B的读时序如下图:
NADV不需要看,只有地址线和数据线复用的时候才会用到,这里我们不用。
当FSMC外设被配置成正常工作,并且外部接了NOR FLASH时,若向0x60000000地址写入数据如0xABCD,FSMC会自动在各信号线上产生相应的电平信号,写入数据。FSMC会控制片选信号NE1选择相应的NOR 芯片,然后使用地址线A[25:0]输出0x60000000,在NWE写使能信号线上发出低电平的写使能信号,而要写入的数据信号0xABCD则从数据线D[15:0]输出,然后数据就被保存到NOR FLASH中了。
用FSMC模拟8080时序
由于图片的问题,注意图中右边得到红圈圈起来的那一半等于左边的一整幅图。
对比FSMC NOR/PSRAM中的模式B时序与ILI9341液晶控制器芯片使用的8080时序可发现,这两个时序是十分相似的(除了FSMC的地址线A和8080的D/CX线,可以说是完全一样) 。
如何使用FSMC的地址线来模拟D/CX?
D/CX为低电平时候表示传输的是命令,高电平表示传输数据。而A[25:0]一共有26根线,我们可以选择出来一根线,并且控制这根线让它在某个时刻,我们想发送命令的时候就表达成低电平,当我们想发送数据的时候就控制这根地址线为高电平。
对于FSMC和8080接口,前四种信号线都是完全一样的,仅仅是FSMC的地址信号线A[25:0]与8080的数据/命令选择线D/CX有区别。而对于D/CX线,它为高电平的时候表示数值,为低电平的时候表示命令,如果能使用FSMC的A地址线根据不同的情况产生对应的电平,那么就完全可以使用FSMC来产生8080接口需要的时序了。
为了模拟出8080时序,我们可以把FSMC的A0地址线(也可以使用其它A1/A2等地址线)与ILI9341芯片8080接口的D/CX信号线连接,那么当A0为高电平时(即D/CX为高电平),数据线D[15:0]的信号会被ILI9341理解为数值,若A0为低电平时(即D/CX为低电平),传输的信号则会被理解为命令。
由于FSMC会自动产生地址信号,当使用FSMC向0x6xxx xxx1、0x6xxx xxx3、0x6xxx xxx5…这些奇数地址写入数据时,地址最低位的值均为1,所以它会控制地址线A0(D/CX)输出高电平,那么这时通过数据线传输的信号会被理解为数值;若向0x6xxx xxx0 、0x6xxx xxx2、0x6xxx xxx4…这些偶数地址写入数据时,地址最低位的值均为0,所以它会控制地址线A0(D/CX)输出低电平,因此这时通过数据线传输的信号会被理解为命令,如下表:
有了这个基础,只要配置好FSMC外设,然后在代码中利用指针变量,向不同的地址单元写入数据,就能够由FSMC模拟出的8080接口向ILI9341写入控制命令或GRAM的数据了。
注意:在实际控制时,以上地址计算方式还不完整,还需要注意HADDR内部地址与FSMC地址信号线的转换。
重点:HADDR内部地址与FSMC地址信号线的转换(实现地址对齐)
我们前面控制SRAM的时候,我们控制某些地址直接访问就可以了,不需要关心地址转换。这是因为SRAM本身具有掩码(通过LB和UB来控制),所以虽然SRAM的数据宽度是16bit,但是却可以以8位的方式访问,也可以以16位的方式访问。
但是NOR FLASH没有SRAM的这种机制,所以如果NOR FLASH是16bit,那就只能以16bit的方式来访问。比如我们的液晶屏有16根数据线,它就相对于一个16位的NOR FLASH,只能使用16位的方式访问。
而我们要注意在STM32内部实际上有一个地址线HADDR是内部AHB地址线。HADDR是字节地址,而液晶屏的NOR FLASH是16位,是两个字节地址。所以访问的时候会有地址对齐的问题。
比如:对于HADDR,访问第0个地址只想访问第0个字节,访问第一个地址只想访问第1个字节;但对于NOR FLASH,我们访问了一个地址就同时访问了两个字节,如访问第1个地址,同时会访问第2、3字节。
所以我们需要对HADDR进行移位(由STM32内部控制,我们不需要管如何移位),会将HADDR的第1根地址线和NOR FLASH的第0根地址线连接,这样就达到了一个移位的目的,左移1位。
这样的话,假如HADDR想要访问1(二进制)地址,外面就会产生一个10(二进制)地址,就相对于访问第2、3字节了。访问2地址,就会访问第4、5字节,也就是每个地址能访问到的字节数乘2,这样就达到了与NOR FLASH地址对齐的目的。
详细可参考数据手册下图