STM32驱动LCD屏幕

本文中使用的LCD驱动芯片为ili9341,下文中简称为驱动芯片。
官方的PDF就不摆上来了,自己去这找找就行了Google

配置

  • MCU为STM32F103ZE,主频72Mhz,使用Spi与驱动芯片通讯,Spi时钟频率为18Mhz。
  • 鉴于驱动芯片可以设定显示窗口(即改写选定部分的显存数据,如将窗口设定为x=20;y=30;宽=50;高=70),可以使用DMA来提高数据传输效率,尤其是在显示文字的过程中,可以直接将文字对于的点阵转换为一个n*n的图片,再一次性的发送给驱动芯片。
  • 但是使用时需要注意检测前一次的DMA发送是否已经完成,否则会出现数据传输不完整的错误。
  • 使用PB1,2引脚作为驱动芯片的DC引脚和RST引脚。

底层IO函数

  • 驱动芯片在写入寄存器时不再明显的区分指令寄存器和显存寄存器,写入指令不在是“索引+对于寄存器的数据”,而改为“指令+[参数/数据]”的格式,简而言之,无论是修改设置还是发送图像数据,其实都是一条指令以及相应的数据。
  • 在发送指令时,先应将DC脚拉低,在通过Spi发送两个字节的数据,随后将RS脚拉高即可。
  • 发送数据较为简单,在指定寄存器索引后直接在Spi上传出数据即可。
  • 同时应注意到,有些指令是没有数据的,如“开始显示画面”,有些指令的数据量则十分巨大,如“写入显存”,这也是“索引+数据”和“指令+[参数/数据]”模式最大的区别,即后者发送的指令本身的功能就不仅仅只是指定寄存器,亦可以修改某些数据。
  • 如果需要硬重启需要将RST引脚从高电位拉低,再拉高,同时应当适当加入延时。

发送指令

1
2
3
4
5
void writeCommand(uint8_t cmd){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,&cmd,1,2);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
}

发送数据

1
2
3
void spiWrite(uint8_t data){
HAL_SPI_Transmit(&hspi1,&data,1,2);
}

重启

1
2
3
4
5
6
7
8
void lcdRestart(void){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(200);
}

初始化

初始化过程参见PDF,主要包括电源控制,内存访问控制和屏幕刷新相关设置的初始化(暂时先鸽了),其中伽马矫正部分需LCD屏幕供应者提供相应的参数(或者随便输一点)。


初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
writeCommand(0xEF);
spiWrite(0x03);
spiWrite(0x80);
spiWrite(0x02);

writeCommand(0xCF);
spiWrite(0x00);
spiWrite(0XC1);
spiWrite(0X30);

writeCommand(0xED);
spiWrite(0x64);
spiWrite(0x03);
spiWrite(0X12);
spiWrite(0X81);

writeCommand(0xE8);
spiWrite(0x85);
spiWrite(0x00);
spiWrite(0x78);

writeCommand(0xCB);
spiWrite(0x39);
spiWrite(0x2C);
spiWrite(0x00);
spiWrite(0x34);
spiWrite(0x02);

writeCommand(0xF7);
spiWrite(0x20);

writeCommand(0xEA);
spiWrite(0x00);
spiWrite(0x00);

writeCommand(ILI9341_PWCTR1); //Power control
spiWrite(0x23); //VRH[5:0]

writeCommand(ILI9341_PWCTR2); //Power control
spiWrite(0x10); //SAP[2:0];BT[3:0]

writeCommand(ILI9341_VMCTR1); //VCM control
spiWrite(0x3e);
spiWrite(0x28);

writeCommand(ILI9341_VMCTR2); //VCM control2
spiWrite(0x86);

writeCommand(ILI9341_MADCTL); //Memory Access Control
spiWrite(0x48);

writeCommand(ILI9341_VSCRSADD); //Vertical scroll
spiWrite(0x00);
spiWrite(0x00); //Zero

writeCommand(ILI9341_PIXFMT);
spiWrite(0x55);

writeCommand(ILI9341_FRMCTR1);
spiWrite(0x00);
spiWrite(0x18);

writeCommand(ILI9341_DFUNCTR); //Display Function Control
spiWrite(0x08);
spiWrite(0x82);
spiWrite(0x27);

writeCommand(0xF2); //3Gamma Function Disable
spiWrite(0x00);

writeCommand(ILI9341_GAMMASET); //Gamma curve selected
spiWrite(0x01);

writeCommand(ILI9341_GMCTRP1); //Set Gamma
spiWrite(0x0F);
spiWrite(0x31);
spiWrite(0x2B);
spiWrite(0x0C);
spiWrite(0x0E);
spiWrite(0x08);
spiWrite(0x4E);
spiWrite(0xF1);
spiWrite(0x37);
spiWrite(0x07);
spiWrite(0x10);
spiWrite(0x03);
spiWrite(0x0E);
spiWrite(0x09);
spiWrite(0x00);

writeCommand(ILI9341_GMCTRN1); //Set Gamma
spiWrite(0x00);
spiWrite(0x0E);
spiWrite(0x14);
spiWrite(0x03);
spiWrite(0x11);
spiWrite(0x07);
spiWrite(0x31);
spiWrite(0xC1);
spiWrite(0x48);
spiWrite(0x08);
spiWrite(0x0F);
spiWrite(0x0C);
spiWrite(0x31);
spiWrite(0x36);
spiWrite(0x0F);

writeCommand(ILI9341_SLPOUT); //Exit Sleep
HAL_Delay(120);
writeCommand(ILI9341_DISPON); //Display on
HAL_Delay(120);

To be continued.

Comments