STM32F103系列是没有内置LCD控制器接口的,如果要驱动LCD,需要一颗LCD图形驱动IC。STM32和LCD驱动IC的接口在STM32端是FSMC,FSMC接口提供各种存储器驱动信号也提供了驱动LCD驱动IC的各种信号。
一、FSMC简介
(资料图片仅供参考)
FSMC概览
如下图可以看到FSMC支持的存储器类型及提供的各种读写控制信号。
图1
2.FSMC 框图
图2
3.FSMC 内存地址空间分配
图3
二、LCD 接口
1.8080和6800接口
这两种接口类型是典型的LCD并行接口。接口信号分为:数据信号和控制信号。
数据信号支持8,9,16,18,24位等。
控制信号用来区分读、写及区分是向LCD寻址命令寄存器还是写LCD RAM数据。
控制信号定义如下:
图4
8080接口:
6800接口:
2.FSMC的LCD接口信号
图5
通过图5,可以看到FSMC提供了LCD驱动所需的全部信号。
片选有专门的硬件信号,也可以使用地址信号Ax,即空闲的地址信号任选一根使用。而LCD的RS信号也可以连接到一根地址线。
3.FSMC 和LCD 连接框图
8080类型接口
6800类型接口
4.驱动程序
以STM32F103VCT6为例,关于103VCT6的信息如下:
只能使用BANK1且Ax推荐使用16-23,STM32原理图接口连线如下:
如上图,RS接A16,CS接A17。
如图3,BANK1的基地址是0x60000000,
关于LCD驱动IC的访问模式有4种:
所有对LCD图形界面的操作都是基于这四个函数,所以实现4个函数很重要。
#define LCD_COMM_ADD ((vu16)0X60020000)
#define LCD_DATA_ADD *((vu16 *)0X60000000)
#define WriteCommand(cmd){LCD_COMM_ADD = cmd;}
#define WriteData(data){LCD_DATA_ADD = data;}
inline u8 ReadData(void)
{
return LCD_DATA_ADD;
}
inline u8 ReadCOMM(void)
{
return LCD_COMM_ADD;
}
以上代码中RS和标准接口定义是反的,是因为LCD驱动IC对RS的定义和标准就是反的。LCD驱动IC的SPEC:
另一个问题,硬件使用A16连接RS,为什么代码里体现是的0X60020000(A17)?为什么左移一位,原因在STM32中文手册有说明: