HAL库+stm32cubeIDE+4.3寸LCD显示器
开发板:野火霸天虎V2
IDE:stm32CUBEIDE
烧录工具:openOCD
显示器基本参数
所使用液晶控制器
带了液晶控制器芯片
所以刷新率会慢一点(没有DMA)
液晶面板控制信号
信号名称 | 说明 |
---|
R[7:0] | 红色数据 | G[7:0] | 绿色数据 | B[7:0] | 蓝色数据 | CLK | 像素同步时钟信号 | HSYNC | 水平同步信号 | VSYNC | 垂直同步信号 | DE | 数据使能信号 |
液晶时序控制
HBP:表示从水平同步信号开始到一行的有效数据开始之间的 CLK 的个数
HFP:表示一行的有效数据结束到下一个水平同步信号开始之间的 CLK 的个数
VBP :表示在一帧图像开始时,垂直同步信号以后的无效的行数
VFP:表示在一帧图像结束后,垂直同步信号以前的无效的行数
VSW :表示垂直同步信号的宽度,单位为行
HSW:表示水平同步信号的宽度,单位为同步时钟CLK的个数
在这些时间参数控制的区域,数据使能信号线“DE”都为低电平,RGB 数据线的信号无效,当“DE”为高电平时,表示的数据有效,传输的数据会直接影响液晶屏的显示区域。
触摸屏
触摸面板引出的信号线引入到GT917S 芯片,该芯片会对触摸信号进行采集并简化信号输出给外部控制器。
触摸面板的下方就是液晶面板,该液晶控制器使用的是8080接口
液晶屏的信号线及 8080 时序
NT35510 控制器根据自身的 IM[3:0] 信号线电平决定它与MCU 的通讯方式,它本身支持 SPI 及 8080 通讯方式
由图可知,写命令时序由片选信号 CSX 拉低开始,对数据/命令选择信号线 D/CX 也置低电平表示写入的是命令地址 (可理解为命令编码,如软件复位命令:0x01),以写信号WRX为低,读信号 RDX 为高表示数据传输方向为写入,同时,在数据线 D[23:0](或 D[15:0]) 输出命令地址,在 第二个传输阶段传送的是命令的参数,所以 D/CX 要置高电平,表示写入的是命令数据,命令数 据是某些指令带有的参数,如复位指令编码为 0x01,它后面可以带一个参数,该参数表示多少 秒后复位 (实际的复位命令不含参数,此处只是为了讲解指令编码与参数的区别)。 当需要把像素数据写入GRAM时,过程很类似,把片选信号CSX拉低后,再把数据/命令选择信 号线 D/CX 置为高电平,这时由 D[23:0] 传输的数据则会被 NT35510 保存至它的GRAM中。
stm32-FSMC解读
注意看下FSMC的框图,发下NOR和SRAM放一起,说明程序里这俩变量其实是结构是一样的(为啥单独拎出来讲一下,因为野火给的HAL库代码有点坑,首先是变量的定义和生成的有出入-都能用,就是无法理解,其次是忘了开写使能)
地址映射
野火所使用的LCD的MCU借口是NOR Falsh,所以要选用存储区域1,我们按照教程选了第3区域
第一个存储区域的地址
解释:存储器要是8位的话,最大支持的外设地址为0~2^26-1个地址,也就是64MB的地址,所以容量就是512Mb
如果是16位的话,最高位不用,也还是支持512Mb(至于原因,存储器是按照字节,也就是8位来寻址的,16位是要读两次)
信号建立时间
信号时序
只针对8080时序
仅仅是FSMC的地址信号线 A[25:0] 与 8080 的数据/命令选择线 D/CX 有区别。而对于 D/CX 线,它为高电平的时候表示数值,为低电 平的时候表示命令,如果能使用 FSMC 的 A 地址线根据不同的情况产生对应的电平,那么就完 全可以使用 FSMC来产生 8080 接口需要的时序了
由于 FSMC会自动产生地址信号,当使用 FSMC向 0x6xxx xxx1、0x6xxx xxx3、0x6xxx xxx5?这 些奇数地址写入数据时,地址最低位的值均为1,所以它会控制地址线A0(D/CX)输出高电平,那 么这时通过数据线传输的信号会被理解为数值;若向 0x6xxx xxx0 、0x6xxx xxx2、0x6xxx xxx4? 这些偶数地址写入数据时,地址最低位的值均为 0,所以它会控制地址线 A0(D/CX) 输出低电平, 因此这时通过数据线传输的信号会被理解为命令,见表 27?6。
对应代码的话,就是要有一个写指令命令和读指令命令。当然,前提是我们要设置A[25:0]只有一位生效,原因,这样,才会符合D/CX的高低电平
代码移植
使用野火配套的代码就把它的GPIO口(会使用到软件复位)和FSMC口配置一下
解释:NE3-bank3,类型NOR Flas,地址只要1位,数据位16位,我们是异步传输,不需要用到时钟或者总线
开启写方向使能,不需要进行扩展模式使用(就是写入和读取用同一个)
接下来生成代码
在液晶显示的驱动包里,把GPIO_Config和FSMC_Config注释掉,就可以用了
接下来生成代码
在液晶显示的驱动包里,把GPIO_Config和FSMC_Config注释掉,就可以用了里面定义的俩全局变量也注释掉
|