对于这个F429啊,真是神奇,就显示,还搞两个分层,不知道干什么,反正SDRAM还是得读写,好像不但没增加什么东西,反正加重了带宽负载,要是我就直接显示单层了,但是既然有这个功能,我们还是发挥一下这个多层显示的能力吧.我们可以用LTDC_Display_2Layers.有两个头文件,分别定义不同的内容,有两个变量ST_LOGO_1和ST_LOGO_2.分别在不同的Layer上.
在初始化时候,有公共参数,是初始化背景的,背景不需要缓冲,因为都是一个颜色.
/* Configure R,G,B component values for LCD background color */ LTDC_InitStruct.LTDC_BackgroundRedValue = 0; LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; LTDC_Init(<DC_InitStruct);
另外每层显示的图像,大小都是19200个uint32_t,也就是38400个点,也就是传说中的240*160,另外一个也是240*160,所以组合起来,就刚好是一个LCD界面.设置LTDC_CFBLineNumber为160,就是完全显示,设置80,他就只刷到80行,但是刷列就不一样了.受LTDC_CFBPitch和LTDC_CFBLineLength的影响.先测试一下,比如我把LTDC_BackgroundRedValue修改成200,那么就应该背景变红.
这时候Layer2也是覆盖到Layer1上.如果我把Layer1的LTDC_CFBLineNumber的160,改成80,就会显示只有部分,不见了一半.
如果要把屏幕显示的240全范围改成120,有多种办法,一种是改LTDC_CFBLineLength,使得缓冲中只刷前面120位,但是后面120位虽然读取,但是不刷.方法二是改小缓冲区,但是无论哪个修改,都要修改LTDC_HorizontalStop,比如如下是修改过的代码:
LTDC_Layer_InitStruct.LTDC_HorizontalStop = (120 + 30 - 1); LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((120 * 2) + 3);
那么显示效果就变成这样了.
另外这货支持透明度设置,比如我把Layer 1透明度设置到150,Layer 2是100,这个应该可以做出一些毛玻璃效果?透明度通过改变LTDC_ConstantAlpha来改变,最大是255.
剩下参数是他们两个图层的合并方式LTDC_BlendingFactor1_CA或者LTDC_BlendingFactor2_PAxCA,另外图片的滚动,全靠主程序调用LTDC_LayerPosition实现,这个并没难度,一看就明白.对于LCD的双层,也就解释到这儿,总结起来就是Layer 2覆盖Layer 1,然后Layer 1可以做背景,如任务栏,而Layer 2可以做窗体.