硬汉嵌入式论坛

 找回密码
 立即注册
查看: 767|回复: 4
收起左侧

[GUI] 【求助】GUIX屏幕闪烁,点击按钮显示残影

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-8-15 06:43:21 | 显示全部楼层 |阅读模式
我使用STM32H750,一直GUIX,静态显示正常,点击按钮后显示有问题。

RGB屏:1024*600
SDRAM: 32M,带宽16位
LTDC配置:

hltdc.Instance = LTDC;
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  hltdc.Init.HorizontalSync = 0;
  hltdc.Init.VerticalSync = 0;
  hltdc.Init.AccumulatedHBP = 160;
  hltdc.Init.AccumulatedVBP = 23;
  hltdc.Init.AccumulatedActiveW = 1184;
  hltdc.Init.AccumulatedActiveH = 623;
  hltdc.Init.TotalWidth = 1200;
  hltdc.Init.TotalHeigh = 624;
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 0;
  hltdc.Init.Backcolor.Red = 0;
  if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  {
    Error_Handler();
  }
  pLayerCfg.WindowX0 = 0;
  pLayerCfg.WindowX1 = 1024;
  pLayerCfg.WindowY0 = 0;
  pLayerCfg.WindowY1 = 600;
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
  pLayerCfg.Alpha = 255;
  pLayerCfg.Alpha0 = 255;
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
  pLayerCfg.FBStartAdress = 0xD0000000;
  pLayerCfg.ImageWidth = 1024;
  pLayerCfg.ImageHeight = 600;
  pLayerCfg.Backcolor.Blue = 0;
  pLayerCfg.Backcolor.Green = 0;
  pLayerCfg.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  {
    Error_Handler();
  }


使用gx_display_driver_stm32h7_24xrgb.c

static void stm32h7_24xrgb_buffer_toggle(GX_CANVAS *canvas, GX_RECTANGLE *dirty)
{
        GX_RECTANGLE    Limit;
//        GX_RECTANGLE    Copy;
        ULONG           offset;
        INT             copy_width;
        INT             copy_height;

#if !defined(GX_CHROMEART_ENABLE)
        INT             row;
        INT             src_stride_ulongs;
        INT             dest_stride_ulongs;
#endif

        ULONG *get;
        ULONG *put;

        gx_utility_rectangle_define(&Limit, 0, 0,
                                                canvas->gx_canvas_x_resolution - 1,
                                                canvas->gx_canvas_y_resolution - 1);

        if (gx_utility_rectangle_overlap_detect(&Limit, dirty, dirty))
        {
                copy_width = dirty->gx_rectangle_right - dirty->gx_rectangle_left;
                copy_height = dirty->gx_rectangle_bottom - dirty->gx_rectangle_top;

                /* 从canvas读取更新区 */
                offset = dirty->gx_rectangle_top * canvas->gx_canvas_x_resolution + dirty->gx_rectangle_left;
                get = canvas ->gx_canvas_memory + offset;
               
                /* 从LCD显存读取要更新的区域,将canvas更新的数据复制进来 */
                put = (ULONG *) FrameBufer;
                offset = (canvas->gx_canvas_display_offset_y + dirty->gx_rectangle_top)* g_LcdWidth;
                offset += canvas->gx_canvas_display_offset_x + dirty->gx_rectangle_left;
                put += offset;

#if !defined(GX_CHROMEART_ENABLE)       
                src_stride_ulongs = canvas ->gx_canvas_x_resolution;
                dest_stride_ulongs = g_LcdWidth;
               
                for(row = 0; row < copy_height; row++)
                {
                        memcpy(put, get, copy_width * 4);
                        put += dest_stride_ulongs;
                        get += src_stride_ulongs;
                }
#else       

                       
          DMA2D->CR &= ~(DMA2D_CR_START);
    DMA2D->CR = DMA2D_M2M_PFC;
                DMA2D->FGMAR = (uint32_t)get;
                DMA2D->OMAR = (uint32_t)put;               
                DMA2D->FGOR = canvas->gx_canvas_x_resolution - copy_width;       
                DMA2D->OOR = g_LcdWidth - copy_width;
                 
    DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
                DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_RGB888;   
    DMA2D->NLR = (uint32_t)(copy_width << 16) | (uint16_t)copy_height;
   
    /* 启动DMA2D */
    DMA2D->CR |= DMA2D_CR_START;
   
    /* 等待DMA2D传输结束 */
    while ((DMA2D->ISR & (DMA2D_FLAG_TC)) == 0){}
   
    /* 清除DMA2D传输完成标志 */
    DMA2D->IFCR |= DMA2D_FLAG_TC;
               
#endif
        }
}


/*
*        函 数 名: stm32h7_graphics_driver_setup_24xrgb
*        功能说明: 驱动接口函数
*        形    参: --
*        返 回 值: GX_SUCCESS
*/
UINT stm32h7_graphics_driver_setup_24xrgb(GX_DISPLAY *display)
{       
        _gx_display_driver_24xrgb_setup(display, (VOID*)STM32_SCREEN_HANDLE, stm32h7_24xrgb_buffer_toggle);
  //_gx_display_driver_32argb_setup(display, (VOID*)STM32_SCREEN_HANDLE, stm32h7_24xrgb_buffer_toggle);
#if defined(GX_CHROMEART_ENABLE)       
  display -> gx_display_driver_pixelmap_blend     = gx_chromeart_pixelmap_blend;
        display -> gx_display_driver_pixelmap_draw      = gx_chromeart_pixelmap_draw;
        display -> gx_display_driver_canvas_copy        = gx_chromeart_canvas_copy;

  display -> gx_display_driver_horizontal_line_draw = gx_chromeart_horizontal_line_draw;
  display -> gx_display_driver_vertical_line_draw = gx_chromeart_vertical_line_draw;
        display -> gx_display_driver_8bit_glyph_draw    = gx_chromeart_glyph_8bit_draw;
#endif

    return(GX_SUCCESS);
}



静态显示

静态显示

点击按钮

点击按钮
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-15 09:54:20 | 显示全部楼层
这个加速去掉,看看正常不

#if defined(GX_CHROMEART_ENABLE)      
  display -> gx_display_driver_pixelmap_blend     = gx_chromeart_pixelmap_blend;
        display -> gx_display_driver_pixelmap_draw      = gx_chromeart_pixelmap_draw;
        display -> gx_display_driver_canvas_copy        = gx_chromeart_canvas_copy;

  display -> gx_display_driver_horizontal_line_draw = gx_chromeart_horizontal_line_draw;
  display -> gx_display_driver_vertical_line_draw = gx_chromeart_vertical_line_draw;
        display -> gx_display_driver_8bit_glyph_draw    = gx_chromeart_glyph_8bit_draw;
#endif
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-8-15 22:01:06 | 显示全部楼层
eric2013 发表于 2024-8-15 09:54
这个加速去掉,看看正常不

#if defined(GX_CHROMEART_ENABLE)      

感谢硬汉,去掉试过,也是一样。点击其他地方,屏幕会闪横的条纹。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-16 09:45:07 | 显示全部楼层
fengyu02412 发表于 2024-8-15 22:01
感谢硬汉,去掉试过,也是一样。点击其他地方,屏幕会闪横的条纹。

合理配置下MPU/Cache试试,参考我们工程的配置方式
回复

使用道具 举报

9

主题

60

回帖

102

积分

初级会员

积分
102
发表于 2024-8-16 10:26:18 | 显示全部楼层
我之前出现同样的问题,把LTDC时钟降低就好了。LCD数据手册上写着支持50Mhz,但就是花屏,降到20、30Mhz才稳定。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-29 03:32 , Processed in 0.220210 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表