STM32 TFT学习笔记——刷屏

主机环境:Windows 7 SP1

开发环境:MDK5.14

目标板:ST NUCLEO-F303RE

TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色

驱动IC:ILI9325

ST库版本:STM32Cube_FW_F3_V1.1.0


之前已经正确读取了ILI9325的ID号,现在编辑以下刷屏代码,以固定颜色填充满整个LCD屏幕,最重要的一步是对ILI9325进行初始化配置,对着文档写入各个寄存器的值。尤其是电源控制寄存器。初始化列表如下

/**********************************************************************
函数:LCD_Init()
函数作用:LCD初始化
参数:无
返回值:无
上一版本:无
当前版本:1.0
作者:anobodykey
最后修改时间:2015-07-28
说明: LCD初始化即对ILI9325进行配置
**********************************************************************/
void LCD_Init(void)
{
	ILI9325_Init();//初始化ILI9325

	ILI9325_nCS_Set_Low();
	//Display Control
	ILI9325_Write_Reg(0x01,0x0100);//Driver Output Control
	ILI9325_Write_Reg(0x02,0x0700);//Driving Wave Control line inversion
	ILI9325_Write_Reg(0x03,0x1030);//Entry Mode swap rb color 65k colors
	ILI9325_Write_Reg(0x04,0x0000);//Resizing Control 
	ILI9325_Write_Reg(0x08,0x0202);//Set front and back porch periods
	ILI9325_Write_Reg(0x09,0x0000);//Display Control3
	ILI9325_Write_Reg(0x0A,0x0000);//Set the output interval of FMARK signal
	ILI9325_Write_Reg(0x0C,0x0000);//RGB Display Interface Control 1
	ILI9325_Write_Reg(0x0D,0x0000);//Frame Marker Position
	ILI9325_Write_Reg(0x0F,0x0000);//RGB Display Interface Control 2

	//Power Management Control
	ILI9325_Write_Reg(0x10,0x0000);//Power Control 1
	ILI9325_Write_Reg(0x11,0x0227);//Power Control 2 VCi ratio factor = 1.0
	HAL_Delay(50);
	ILI9325_Write_Reg(0x12,0x009D);//Power Control 3
	HAL_Delay(50);
	ILI9325_Write_Reg(0x13,0x1900);//Power Control 4
	HAL_Delay(50);

	ILI9325_Write_Reg(0x0010,0x1690);
	
	ILI9325_Write_Reg(0x29,0x0025);//Set the internal VcomH voltage
	ILI9325_Write_Reg(0x2B,0x000B);//Frame Rate and Color Control


	ILI9325_Write_Reg(0x20,0x0000);
	ILI9325_Write_Reg(0x21,0x0000);//GRAM Horizontal/Vertical Address set

	//Gamma Control
	ILI9325_Write_Reg(0x30,0x0007);	
	ILI9325_Write_Reg(0x31,0x0303);	
	ILI9325_Write_Reg(0x32,0x0003);	
	ILI9325_Write_Reg(0x35,0x0206);	
	ILI9325_Write_Reg(0x36,0x0008);	
	ILI9325_Write_Reg(0x37,0x0406);	
	ILI9325_Write_Reg(0x38,0x0304);
	ILI9325_Write_Reg(0x39,0x0007);	
	ILI9325_Write_Reg(0x3C,0x0601);	
	ILI9325_Write_Reg(0x3D,0x0008);	

	//GRAM Address position limit
	ILI9325_Write_Reg(0x50,0x0000);
	ILI9325_Write_Reg(0x51,0x00EF);
	ILI9325_Write_Reg(0x52,0x0000);
	ILI9325_Write_Reg(0x53,0x013F);

	//Gate Scan Control
	ILI9325_Write_Reg(0x60,0xA700);
	ILI9325_Write_Reg(0x61,0x0001);//Enable the grayscale inversion
	ILI9325_Write_Reg(0x6A,0x0000);

	//Partial Image 
	ILI9325_Write_Reg(0x80,0x0000);//partial image 1 display position
	ILI9325_Write_Reg(0x81,0x0000);//partial image 1 ram start address
	ILI9325_Write_Reg(0x82,0x0000);//partial image 1 ram end address
	ILI9325_Write_Reg(0x83,0x0000);//partial image 2 display position
	ILI9325_Write_Reg(0x84,0x0000);//partial image 2 ram start address
	ILI9325_Write_Reg(0x85,0x0000);//partial image 2 ram end address

	ILI9325_Write_Reg(0x90,0x0010);//Panel Interface Control 1
	ILI9325_Write_Reg(0x91,0x0600);//Panel Interface Control 2
	ILI9325_Write_Reg(0x93,0x0110);//Panel Interface Control 4

	//OPT
	ILI9325_Write_Reg(0xA1,0x0000);
	ILI9325_Write_Reg(0xA2,0x0000);

	ILI9325_Write_Reg(0x07,0x0133);//turn on display control,turn off partial images

	ILI9325_nCS_Set_High();
}
0x03寄存器中设置了交换RB数据,一直不知道为啥,文档中16bit接口如下

STM32 TFT学习笔记——刷屏_第1张图片

都是以RGB排列的,这里设置的是第一个选项,以RGB565格式传输颜色实现65K色显示。在主函数中我显示的是红色,如果不交换RB则屏幕上显示的是蓝色。。。因此在初始化时得交换RB顺序才能够显示出正确的颜色。

对于显示来说我们只关心GRAM区即可,

R20、R21是行列地址设置

STM32 TFT学习笔记——刷屏_第2张图片

R20管理水平地址为0x00~0xEF共240个地址空间,R21管理垂直地址为0x00~0x013F共320个地址空间,与屏幕尺寸相一致。文档中提到GRAM的地址是自动更新的,因此我们只需要写一次地址即可。当然如果不是连续地址的话仍需要重新设置地址。对于刷屏而言我们只需要设置一次地址即可。R22是GRAM数据寄存器,确定好地址之后,只需要写该寄存器即可。

还有一个需要注意的是R50~R53寄存器,其限制GRAM的行列地址

STM32 TFT学习笔记——刷屏_第3张图片

在区域更新时我们可以用到该寄存器,对于整屏而言设置其值为最大值即可。

由于在刷屏时我们只需要写R22寄存器即可,但之前的ILI9325_Write_Reg函数就损失效率了,这里我们只需要写一次0x22就可以了,因此重新编辑ILI9325驱动函数,分开地址和数据的写入

/**********************************************************************
函数:ILI9325_Write_Address()
函数作用:向ILI9325写入16bit地址
参数:
		uint16_t reg_addr--------------------------------------16bit地址
返回值:无
上一版本:无
当前版本:1.0
作者:anobodykey
最后修改时间:2015-07-28
说明: 
**********************************************************************/
void ILI9325_Write_Address(uint16_t reg_addr)
{
	ILI9325_RS_Set_Low();//拉低RS信号,选择index寄存器
	ILI9325_nWR_Set_Low();//拉低写使能,使其有效
	GPIOB->ODR = reg_addr;//写寄存器地址
	ILI9325_nWR_Set_High();
}

/**********************************************************************
函数:ILI9325_Write_Value()
函数作用:向ILI9325写入16bit数据
参数:
		uint16_t reg_value--------------------------------------16bit数据
返回值:无
上一版本:无
当前版本:1.0
作者:anobodykey
最后修改时间:2015-07-28
说明: 
**********************************************************************/
void ILI9325_Write_Value(uint16_t reg_value)
{
	ILI9325_RS_Set_High();//拉低RS信号,选择control寄存器
	ILI9325_nWR_Set_Low();//拉低写使能,使其有效
	GPIOB->ODR = reg_value;//写寄存器地址
	ILI9325_nWR_Set_High();
}

/**********************************************************************
函数:ILI9325_Write_Reg()
函数作用:向ILI9325寄存器写入16bit数据
参数:
		uint16_t reg_addr-----------------------------------寄存器地址
		uint16_t reg_value--------------------------------------16bit数据
返回值:无
上一版本:无
当前版本:1.0
作者:anobodykey
最后修改时间:2015-07-27
说明: ILI9325地址和数据都是使用PB口通信,因此PB口是
             复用的,需先写寄存器地址再写入数据
**********************************************************************/
void ILI9325_Write_Reg(uint16_t reg_addr, uint16_t reg_value)
{
	ILI9325_Write_Address(reg_addr);
	ILI9325_Write_Value(reg_value);
}
且把CS信号控制提出来由LCD中间层控制,编辑LCD清屏函数,如下

/**********************************************************************
函数:LCD_Clear()
函数作用:LCD清屏
参数:无
返回值:无
上一版本:无
当前版本:1.0
作者:anobodykey
最后修改时间:2015-07-28
说明: 以指定的颜色对LCD进行清屏操作
**********************************************************************/
void LCD_Clear(uint16_t color)
{
	uint16_t i = 0, j = 0;
	ILI9325_nCS_Set_Low();
	ILI9325_Write_Address(0x22);
	for(i = 0; i < LCD_Y_MAX; i++)
	{
		for(j = 0; j < LCD_X_MAX; j++)
		{
			ILI9325_Write_Value(color);
		}
	}
	ILI9325_nCS_Set_High();
}
在主函数中调用LCD_Clear(LCD_RED),

颜色定义如下

//RGB565格式颜色代码
#define LCD_WHITE	0xFFFF
#define LCD_BLACK	0x0000
#define LCD_RED		0xF800
#define LCD_GREEN	0x07E0
#define LCD_BLUE	0x001F
#define LCD_YELLOW	0xFFE0
#define LCD_CYAN	0x07FF
#define LCD_MAGENTA	0xF81F

#define LCD_X_MAX	239
#define LCD_Y_MAX	319
下载程序,运行,效果如下:

STM32 TFT学习笔记——刷屏_第4张图片

你可能感兴趣的:(STM32 TFT学习笔记——刷屏)