用cubemx配置阿波罗(stm32f429IGTb)的RGB屏幕

阿波罗的教程在RGB屏幕的实验时并没有给出cubemx的配置,但我的目的就是学会如何使用cubemx,所以根据学习实验去自行配置cubemx。我使用的是7寸屏1024*800分辨率的。

1.使能LTDC接口,并使用RGB565模式。使能DMA2D。

2.配置PB5为推挽输出、上拉。这是RGB屏的背光控制,这个不属于LTDC接口服务范围内。高电平为点亮背光

3.配置时钟为33MHZ,我反正是懒得学分频倍频的计算,cube就是这点特别好,你设置好了想要的时钟再回车,他就给你计算了。

4.修改个别管脚。因为LTDC接口打开后,cube会自动把管脚比如LTDC_R[7:3]、LTDC_G[7:2]、LTDC_B[7:3]、LTDC_DE等配置好,但这是默认的,比如LTDC_G4在PB10,但是阿波罗在硬件设计上要考虑全部功能的实现,所以把LTDC_G4移到了PH15。所以对照原理图得再修改一下。下图是修改后的。

5.根据RGB屏的参数,比如垂直同步有效脉宽、垂直前廊等,不同大小、分辨率的RGB屏都不同。我是参照阿波罗代码配置的

6.层颜色、显存位置、和Alpha。实际上是两层,但实际只用到第一层,所以只配置第一层即可。以后再拓展吧

7.DMA2D配置。原子也说了一般都不用库函数操作DMA2D效率很低,一般都用寄存器配置。所以这里不配置也可以,在代码中会用寄存器方法配置一遍。

至此cubemx就配置完了。接下来就是在代码中初始化RGB、移植画点、画字符串、修改背景色等驱动。因为我是为了自己用,没有买MCU屏,所以把需要用的从原子的代码上扒下来,弃掉部分功能:MCU屏幕初始化部分、获取ID、判断什么屏幕。

cubemx生成的代码会自己初始化LTDC,但是怎么使用还是得自己去写。

//LCD初始化函数
void LTDC_Init(void)
{
	lcdltdc.pwidth=1024;			//面板宽度,单位:像素
	lcdltdc.pheight=600;			//面板高度,单位:像素
	lcdltdc.hsw=20;				    //水平同步宽度
	lcdltdc.vsw=3;				    //垂直同步宽度
	lcdltdc.hbp=140;			    //水平后廊
	lcdltdc.vbp=20;				    //垂直后廊
	lcdltdc.hfp=160;			    //水平前廊
	lcdltdc.vfp=12;				    //垂直前廊
	lcdltdc.pixsize=2;				//每个像素占2个字节
	
	ltdc_framebuf[0] = (uint32_t *)&ltdc_lcd_framebuf;		//把SDRAM的首地址赋给第一层的地址指针,作为RGBLCD的显存
	
	LTDC_Display_Dir(1);			//默认竖屏
	
	LTDC_Select_Layer(0); 			//选择第1层
	
	HAL_GPIO_WritePin(LCD_BL_GPIO_Port,LCD_BL_Pin,GPIO_PIN_SET);	//点亮背光
	
    LTDC_Clear(0XFFFFFFFF);			//清屏

}

然后再编写测试用例

void LTDC_Test(void)
{
	static uint32_t i = 0;
	switch(i)
	{
		case 0:LTDC_Clear(WHITE);break;
		case 1:LTDC_Clear(BLACK);break;
		case 2:LTDC_Clear(BLUE);break;
		case 3:LTDC_Clear(RED);break;
		case 4:LTDC_Clear(MAGENTA);break;
		case 5:LTDC_Clear(GREEN);break;
		case 6:LTDC_Clear(CYAN);break; 
		case 7:LTDC_Clear(YELLOW);break;
		case 8:LTDC_Clear(BRRED);break;
		case 9:LTDC_Clear(GRAY);break;
		case 10:LTDC_Clear(LGRAY);break;
		case 11:LTDC_Clear(BROWN);break;
	}
	i++;
	if(i == 12)
		i=0; 
	
	POINT_COLOR=RED;	  
	LTDC_ShowString(10,40,260,32,32,	(uint8_t*)"Apollo STM32F4/F7"); 	
	LTDC_ShowString(10,80,240,24,24,	(uint8_t*)"LTDC TEST");
	LTDC_ShowString(10,110,240,16,16,	(uint8_t*)"ATOM@ALIENTEK");
	LTDC_ShowString(10,130,240,16,16,	(uint8_t*)"1024*800");		//显示LCD ID	      					 
	LTDC_ShowString(10,150,240,12,12,	(uint8_t*)"2016/1/6");
}

然后我用摁键的触发调用这个测试函数,效果下图

总结:

考虑篇幅,估计写的太多也没人看,欢迎讨论拓展。

还是要自己动手操作,知识才是自己的,信心都是一步一步建立起来的,如果只是“看”懂,心里还是没底。只有自己创建工程,调试底层,出来效果,才算是自己掌握了。

发布了26 篇原创文章 · 获赞 0 · 访问量 2996

猜你喜欢

转载自blog.csdn.net/nianzhu2937/article/details/103597680