|
我使用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);
}
|
-
静态显示
-
点击按钮
|