FSMC驱动LCD

FSMC是STM32中一种独特的外设,允许与多种存储器类型通信,简化数据交换。文章详细解释了FSMC的架构、信号作用以及如何驱动LCD,包括地址设置和时序控制。
摘要由CSDN通过智能技术生成

FSMC( Flexible static memory controller)全称“灵活的静态存储器控制器”,是 STM32中一个很有特色的外设,通过 FSMC,STM32可以通过FSMC与SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。
FSMC的本质就是内核想要访问存储器,但是内核不能生成硬件时序,FSMC外设就帮忙做了这个硬件时序这个事情。有了这个外设我们操作外部SRAM就不需要自己在那里写读写时序了,FSMC就帮我们解决了。

一、FSMC框架与信号

如图所示为FSMC的框架结构
在这里插入图片描述
如图所示中FSMC各种信号的含义为:
在这里插入图片描述

FSMC_NBL

FSMC_NBL[1]、FSMC_NBL[0]分别对应于LBn、UBn,提供数据掩码信号。
一根行地址线对应16位的数据,我们可以把16位的数据分为高字节和低字节。
当要访问宽度为16位的数据时,使用行地址线指出地址,然后把UBn(n表示低电平有效)
和LBn线都设置为低电平(FSMC_NBL0和 FSMC_NBL为低电平),那么I/O0-I/O15线(FSMC_D0到 FSMC_D15)都有效。
当要访问宽度为8位的数据时,使用行地址线指出地址,然后把UBn(FSMC_NBL0)设置为低电平,I/O0-I/O15(FSMC_D8到 FSMC_D15)会对应输出该地址的高8位,l/O0-I/O7的信号无效(或者把LBn(FSMC_NBL1)设置为低电平,I/O0-/O7(FSMC_D0到SMCD7)会对应输出该地址的低8位,I/O8-/I/O15的信号无效。

要注意的是FSMC_NBL[1]、FSMC_NBL[0]分别对应于LBn、UBn,这两个引脚的电平不需要用户用程序控制的,这两个引脚应该是FSMC的内部硬件机制完成的。

FSMC_NE

在这里插入图片描述

从FSMC的角度看,可以把外部存储器划分为固定大小为256M字节的四个存储块,每个小块****有相应的控制引脚用于连接片选信号FSMC_NE1/2/3/4,见下图。
● 存储块1用于访问最多4个NOR闪存或PSRAM存储设备。这个存储区被划分为4个
NOR/PSRAM区并有4个专用的片选。
● 存储块2和3用于访问NAND闪存设备,每个存储块连接一个NAND闪存。
● 存储块4用于访问PC卡设备
每一个存储块上的存储器类型是由用户在配置寄存器中定义的。

FSMC_NE[4:1]信号线就分别对应图中的 FSMC bank 1NOR/PSRAM4到FSMC bank1NOR/PSRAM1。

FSMC_A[25:0]

(1) HADDR是需要转换到外部存储器的内部AHB地址线。
HADDR[25:0]包含外部存储器地址。HADDR是字节地址,而存储器访问不都是按字节访问,因 此接到存储器的地址线依存储器的数据宽度有所不同,如下表:

对于16位宽度的外部存储器,FSMC将在内部使用HADDR[25:1]产生外部存储器的地址FSMC_A[24:0]。不 论外部存储器的宽度是多少(16位或8位),FSMC_A[0]始终应该连到外部存储器的地址线A[0]。

二、FSMC驱动LCD

LCD驱动信号线

把TFTLCD当成一个SRAM来用。
根据下表可知,FSMC可以提供LCD需要的所有信号,且模式A和模式B的时序与LCD所需要的8080并口时序相同。
在这里插入图片描述

TFTLCD通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为两个地址信号。向地址0写数据时,就是LCD命令控制信号;向地址1写数据时,就是LCD数据控制信号。
比如我们把*RS接在A18上面,那么当FSMC控制器写地址0的时候,会使得A18变为0,对TFTLCD来说,就是写命令。而FSMC写地址1的时候,A18将会变为1,对TFTLCD来说,就是写数据了。

读写设置与地址偏移

在这里插入图片描述
根据表87(外部存储器地址)可知,对于16位宽度的外部存储器,要让A18变为1,需要设置HADDR[19]=1.

#define LCD_BASE0        	  ((u32)0x60000000)  //命令写地址 
#define LCD_BASE1        	  ((u32)0x60080000)  //数据写地址 要A18为1,根据表87,需要让HADDR[19]变1   1<<19=0x80000
//FSMC写命令函数
void FMSC_16_CmdWrite(u8 cmd)
{
    u16 temp=cmd;
	*(vu16*) (LCD_BASE0)= temp;
}
//FSMC写数据函数
void FMSC_16_DataWrite(u8 data)
{  
    u16 temp=data;
	*(vu16*) (LCD_BASE1)= temp; 
}
  • 20
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值