本文中使用的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引脚从高电位拉低,再拉高,同时应当适当加入延时。
发送指令
| 12
 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);
 }
 
 | 
发送数据
| 12
 3
 
 | void spiWrite(uint8_t data){HAL_SPI_Transmit(&hspi1,&data,1,2);
 }
 
 | 
重启
| 12
 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屏幕供应者提供相应的参数(或者随便输一点)。
初始化
| 12
 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.