STM32 TFT液晶屏与FSMC

目前网上的STM32的程序基本上都是从正点或者野火开发板为基础搞的,由于开发板的例程是基于正点的,但是板子的接线却不一致,这使得烧程序后液晶屏无法显示的问题。开发板的原理图如图

FSMC

FSMC,即灵活的静态存储控制器,STM32F4 的FSMC 接口支持包括SRAM、NAND FLASH、NOR FLASH 和PSRAM 等存储器,我们这里使用的2.8寸液晶屏可以被看做是SRAM:

  • 读写控制通过RD/WR设置
  • RS的高低控制是写数据还是写地址

我们希望使用SRAM的方式访问LCD,因此选择BANK1,原理图中RS接的是A12,即通过第12位决定是向LCD写命令还是写数据,片选信号接的NE4,可以知道

Bank1所选区 片选信号 地址范围
第1区 FSMC_NE1 0X6000,0000~63FF,FFFF
第2区 FSMC_NE2 0X6400,0000~67FF,FFFF
第3区 FSMC_NE3 0X6800,0000~6BFF,FFFF
第4区 FSMC_NE4 0X6C00,0000~6FFF,FFFF

基地址的范围是从0x6c000000开始的,由于FSMC的地址线FSMC_A的A[0]一定要和外设的A[0]接在一起,即已经被占用,不过对于LCD的液晶屏控制来说并不影响,选择其他FSMC_A的引脚依然可以满足RS控制,FSMC的地址范围为0-25,开发板将A12接RS做命令和数据的控制,即对FSMC来说就是操作两个地址来实现。

由上面可知基地址是0x6c000000,我们定义结构体:

typedef struct
{
	u16 LCD_REG;
	u16 LCD_RAM;
}LCD_TypeDef;
#define LCD_BASE		((u32)(0x6C000000 | 0X00001FFE))//A12为区分线
#define TFTLCD			((LCD_TypeDef *) LCD_BASE)

LCD_BASE表示的地址的低2字节按二进制表示为:0001 1111 1111 1110,根据上文描述,A12被使用区分指令和数据,在上面的结构体定义下,LCD_REG的地址和LCD_RAM的地址因为结构体定义的原因刚好使A12在REG为1,在RAM时为0,这样可以有:

TFTLCD->LCD_REG=CMD;//写命令
TFTLCD->LCD_RAM=DATA;//写数据

其他FSMC的接线定义以及液晶屏的初始化参考原子板即可,这样就实现了使用FSMC控制TFT液晶屏的功能

posted @ 2019-10-13 20:27  回归的世界线  阅读(2174)  评论(0编辑  收藏  举报