阿波罗的教程在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 *)<dc_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");
}
然后我用摁键的触发调用这个测试函数,效果下图
总结:
考虑篇幅,估计写的太多也没人看,欢迎讨论拓展。
还是要自己动手操作,知识才是自己的,信心都是一步一步建立起来的,如果只是“看”懂,心里还是没底。只有自己创建工程,调试底层,出来效果,才算是自己掌握了。