打印
[研电赛技术支持]

gd32f450 tft-lcd接口的图层

[复制链接]
480|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wowu|  楼主 | 2024-12-4 16:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
概要
gd32f450的显示器并行接口,硬件上就支持两个图层,对于需要静态显示背景,动态显示顶层的应用场合非常适合。同样的芯片还有stm32f429等。

对于图像的混合在这两款芯片中实际上有两个概论,一个是显示控制器,还有一个则是利用DMA的图像加数器,两款芯片暂时还没发现寄存器的配置上有什么区别,只是在名称上有些区别。

本文主要针对显示控制器多层混合相关细节进行探讨,以gd32f450的官方用户手册和官方库函数为参考。stm32f429类似。

整体流程
在手册中层混合过程框图:



层0和层1可由具体的寄存器配置存储区,那么用户可以更改自己的显示类容。

BG层只有一个寄存器可以去配置单一的一种颜色。

目标层为混合后,在屏幕显示的类容。

如何混合
需要搞清楚手册中提供的混合公式。公式如下:



BC:最终混合出来的颜色
BF1:混合因子1
C:当前层颜色
BF2:混合因子2
Cs:下一级混合的颜色,对于层0就是BG层,对于层1就是层0和BG层混合后的零时层。
混合因子1和混合因子2可由对应层的混合寄存器配置计算方法:



说明:

        恒定Alpha:可由层的恒定Alpha寄存器进行配置

        归一化恒定Alpha:恒定Alpha / 255。

        归一化的像素Alpha: 当像素带有透明度的时候,对于混合的结果可由像素去决定。

        为何要归一化? 若两个像素混合相加的结果大于其颜色深度,该如何解决?归一化就是解决这个问题,两个像素按比例相加,这样就避免了这个问题。

举个例子
按照混合的顺序,需要把层0当作背景层,层1当作前景层。

对于层0,我们需要配置恒定Alpha为255,混合因子的计算方式为归一化的恒定Alpha,那么根据公式可得到:

BC=1*C +(1-1)*Cs=C

那么零时层就等于层0;达到了我们把层0当作背景的目的。

对于层1,我们需要配置恒定Alpha为255,混合因子的计算方式为归一化的像素Alpha乘以归一化的恒定Alpha,那么可分为两种情况:

        若像素的Alpha为255:

BC=1*1*C+(1-1)*1*Cs=C

        若像素的Alpha为0:

  BC=0*1*C+(1-0)*1*Cs=Cs

可以发现,把层1需要显示的部分设为不透明,不需要显示的部分设为透明,即可与背景完美融合。

部分代码
层0和层1的配置:

    tli_layer_init_struct.layer_window_leftpos = WINDOW_HOR_OFS;
    tli_layer_init_struct.layer_window_rightpos = TLI_PIX_WIDTH - 1 + WINDOW_HOR_OFS;
    tli_layer_init_struct.layer_window_toppos = WINDOW_VER_OFS;
    tli_layer_init_struct.layer_window_bottompos =TLI_PIX_HEIGHT - 1 + WINDOW_VER_OFS;
    tli_layer_init_struct.layer_ppf = LAYER_PPF_RGB565;
    tli_layer_init_struct.layer_sa = 0xff;
    tli_layer_init_struct.layer_default_blue = 0;        
    tli_layer_init_struct.layer_default_green = 0;      
    tli_layer_init_struct.layer_default_red = 0;         
    tli_layer_init_struct.layer_default_alpha = 0;
    tli_layer_init_struct.layer_acf1 = LAYER_ACF1_PASA;   
    tli_layer_init_struct.layer_acf2 = LAYER_ACF2_PASA;
    tli_layer_init_struct.layer_frame_bufaddr = (uint32_t)gImage_bg_buf;
    tli_layer_init_struct.layer_frame_line_length = TLI_PIX_WIDTH*2+3;
    tli_layer_init_struct.layer_frame_buf_stride_offset = TLI_PIX_WIDTH*2;

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_38974298/article/details/143730931

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

96

主题

4119

帖子

1

粉丝