目前网上的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液晶屏的功能