2022年6月17日STM32——LCD液晶显示

一.FSMC外设

显示器属于计算机的I/O设备,CRT显示器、LCD液晶显示器、LED点阵显示器及OLED显示器。

显示器参数:

1.像素:像素是组成图像的最基本单位要素,显示器的像素指它成像最小的点

2.分辨率:行像素值 x 列像素值

3.色彩深度:显示器的每个像素点能表示多少种颜色,用“位”(bit)来表示。

4.显示器尺寸:大小用英寸表示,如5英寸、21英寸,这个长度指屏幕对角线的长度。

5.点距:两个相邻像素点之间的距离,相同尺寸的屏幕,分辨率越高,点距越小,画质越细腻。

屏幕控制:

RGB接口(RGB Interface):

(1)RGB信号线:RGB信号线各有8根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量。显示屏支持RGB888格式,一共24位数据线,表示2^24种颜色。

(2)同步时钟信号CLK:液晶屏与外部使用同步通讯,以CLK作同步时钟,每个时钟传输一个像素点数据。

(3)水平同步信号HSYNC:表示液晶屏一行像素数据的传输结束,每传输完成液晶屏的一行像素数据时,HSYNC会发生电平跳变。

(4)垂直同步信号VSYNC:表示液晶屏一帧像素数据的传输结束,每传输完成液晶屏的一帧像素数据时,VSYNC会发生电平跳变。帧是图像的单位,一副图片称为一帧。“帧/秒”来表示液晶屏的刷新特性,即每秒可以显示多少帧图像。

(5)数据使能信号DE:表示数据的有效性,当DE信号线为高电平时,RGB信号线表示的数据有效。

液晶数据传输时序:

显存:用于存储显示数据的存储器,显示一般至少要能存储液晶屏的一帧显示数据,如分辨率为800x480的液晶屏,使用RGB888格式显示,它的一帧显示数据大小为:3(字节) x 800 x 480 = 1152000字节;若使用RGB565格式显示,一帧显示数据大小为:2(字节) x 800 x 480 = 768000字节。

野火3.2寸液晶屏:内部包含ILI9341的液晶控制器芯片,使用8080接口与单片机通讯。外部包含电阻触摸的控制器XPT2046。

ILI9341液晶控制器:

野火显示屏信号线:

写命令时序图:

 

  写命令时序由片选信号CSX拉低开始,对数据/命令选择信号线D/CX置低电平表示写入的是命令地址,写信号WRX为低,读信号RDX为高表示数据传输方向为写入,数据线D[17:0]输出命令地址。第二次传输是命令的参数,D/CX置高电平,表示写入的命令数据。

FSMC灵活的静态存储控制器FSMC(Flexible Static Memory Controller)用来管理扩展的存储器

FSMC外设结构图:

①:特殊的是FSMC_NE1/2/3/4对应STM32内部不同的地址区域,当访问到相应的区域,FSMC_NEx就会自动设置为低电平。

②:NOR/PSRAM/SRAM设备使用相同的控制器,NAND/PC卡设备使用相同的控制器

NOR FLSH 有 FSMC_BCR1/2/3/4控制寄存器、FSMC_BTR1/2/3/4片选时序寄存器、FSMC_BWTR1/2/3/4写时序寄存器。

FSMC_BCR配置要控制的存储器类型、数据线宽度以及信号有效极性能参数。

FSMC_BTR配置SRAM访问时的各种时间延迟

FSMC_BWTR用于控制写时序的时间参数

③:FSMC外设挂载在AHB总线上,时钟信号来自HCLK(72MHz),控制器的同步时钟输出就是由它分频得到。

 FSMC地址映射:

FSMC外设支持输出多种不痛的时序以便控制不同的存储器,有ABCD四种模式。

下面对控制异步NOR FLASH使用的模式B进行讲解

 读时序:

写时序:

用FSMC模拟8080时序

 信号线对比:

D/CX线,当它为高电平时为数值,低电平时为命令。

要用FSMC的A地址线来产生D/CX信号:用FSMC的A0地址线与ILI9341芯片8080接口的D/CX信号线连接,当A0为高电平为数值,当A0为低电平为命令。

 NOR FLASH时序结构体:配置FSMC_BRT和FSMC_BWTR寄存器

 FSMC结构体:配置FSMC_BCR寄存器

硬件结构:

红色划线处配置要看清楚,特别是FSMC_A16得配置。

FSMC_NE1是0x6000 0000 - 0x63FF FFFF地址,FSMC_A16位为命令位0x6000 0000,数据位是0x6002 0000,由temp = temp | (1<<(16+1))和temp = temp &= ~(1<<(16+1))得

软件设计:

1.初始化通讯使用的目标引脚及端口时钟

2.使能FSMC外设的时钟

3.配置FSMC为异步NOR FLASH模式以仿真8080时序

4.建立机制使用FSMC向液晶屏发送命令及数据

5.发送控制命令初始化液晶屏

6.编写液晶屏的绘制像素点函数

7.利用描点函数制作各种不同的液晶显示应用

ili9341_lcd.c文件:

GPIO初始化注意背光BK引脚和复位RST引脚配置为推挽输出,其他引脚配置成复用推挽输出!

 

FSMC结构体配置:

FSMC_DataSetupTime和FSMC_AddressSetupTime要注意,因为我们用异步NOR FLASH的方式模拟8080时序。

这里不太知道怎么看:从上面时序图得知ILI9341写周期最小为66ns,读周期最小为45+20=65ns。

 

 当把ADDSET =1 及DATST = 4和时间单位1/72微妙带入以下公式:

读周期:Trc = ((ADDSET+1)+(DATST+1)+2)*(1/72) = 125ns

写周期:Twc = ((ADDSET + 1 )+(DATST + 1))*(1/72) = 97ns

 

 

 

 读写函数:

_inline内敛函数在调用它的地方原样替换函数内容。

最主要是ILI9341_CMD_ADDR 和 ILI9341_DATA_ADDR的地址确定

FSMC_Ax引脚输出高电平表示传输数据,输出低电平表示传输命令

我们用的是FSMC_NE1作为8080_CS片选信号,访问地址是0x6000 0000 ~ 0x63FF FFFF,然后用的是FSMC_A16地址线作为命令/数据选择线RS信号,即在FSMC_A16输出高电平的地址表示数据,输出低电平表示命令。

FSMC_A16地址线为高电平需要第16位为1即可,即0x6000 0000 |=(1<<16) = 0x6001 0000

FSMC_A16地址线为低电平需要第16位为0即可,即0x6000 0000 &=~(1<<16) = 0x6000 0000

由于:

我们使用的是16位的数据访问方式,所以HADDR与FSMC_A的地址线连接关系会左移一位,即HADDR1与FSMC_A0对应

那么FSMC_A16地址线需要改变:

FSMC_A16地址线为高电平:0x6000 0000 |=(1<<(16+1))= 0x6002 0000  (数据线)

 FSMC_A16地址线为高电平:0x6000 0000 &= ~(1<<(16+1))= 0x6000 0000 (命令线)

 

背光控制:

软件复位:

初始化ILI9341寄存器:

具体的命令号要去ILI9341技术手册搜

 

 

 

 ILI9341初始化:

 

 

 在ILI9341显示器开窗:

//定义ILI9341常用命令
#define CMD_SetCoordinateX        0x2A  //设置X坐标
#define CMD_SetCoordinateY        0x2B  //设置Y坐标

2AH命令后,后面有4个参数,第一第二个是起始点,第三第四个是结束点。

 

 在ILI9341显示器中填充形状中的颜色:

先开窗再填充像素命令(0x2C),RGB888_2_RGB565(R,G,B)是格式转换

#define RGB888_2_RGB565(R,G,B)  (uint16_t)(((R&0x1F) << 11) | ((G&0x3F) << 5) | (B&0x1F) )

原理是:

 上图来源于:

(5条消息) RGB888转换为RGB565格式_Healer19的博客-CSDN博客_rgb888转rgb565

for循环里面就是填充颜色

 

设置ILI9341的光标坐标:

 

再ILI9341显示器的某一点以某种颜色进行填充:

 

液晶屏扫描模式:

ILI9341_MORE_PIXEL这里是320

ILI9341_LESS_PIXEL这里是240

0-7模式设置如下:

 

 

还有很其他函数,可在野火参考程序里面找到,自己学习。

遇到一个问题但我没能解释说明

原因是勾选了C99Mode,取消C99 Mode就不会报这个错,但是具体什么原因解释不了。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值