2414859_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2414859_zh-CN

2414859_zh-CN

求助关于RT1052显示旋转问题

因为购买的屏幕是竖屏,而我需要横屏显示。我使用的是guiguider生成RT1052的基础显示代码

并且添加软件旋转

disp_drv.sw_rotate = 1;
disp_drv.rotated = 1;
 
设置成单缓冲
SDK_ALIGN( __attribute__((section("lvglDisplayBuffer"))) static uint8_t s_frameBuffer[1][DEMO_FB_SIZE], DEMO_FB_ALIGN);
SDK_ALIGN( __attribute__((section("lvglDisplayBuffer"))) static uint8_t s_lvglBuffer[DEMO_DB_SIZE], DEMO_FB_ALIGN);
屏幕能够正常显示,但是刷新速度太慢,不符合我的需求。
 
设置成双缓冲
SDK_ALIGN( __attribute__((section("lvglDisplayBuffer"))) static uint8_t s_frameBuffer[2][DEMO_FB_SIZE], DEMO_FB_ALIGN);
只有背光亮,屏幕黑屏。
这是为什么?
 

#if FB_USE_SRAM
static void DEMO_WaitVsync(lv_disp_drv_t *disp_drv)
{
s_framePending = true;

#if defined(SDK_OS_FREE_RTOS)
if (xSemaphoreTake(s_frameSema, portMAX_DELAY) != pdTRUE)
{
PRINTF("Display flush failed\r\n");
assert(0);
}
#else
while (s_framePending)
{
}
#endif
}

static void copy_area(const lv_area_t *area, lv_color_t *color_p, uint8_t *fb, uint32_t fbStrideBytes)
{
uint32_t y;
uint32_t areaWidth = lv_area_get_width(area);

fb += (area->y1 * fbStrideBytes + area->x1 * sizeof(lv_color_t));

for (y = area->y1; y <= area->y2; y++)
{
lv_memcpy(fb, color_p, areaWidth * sizeof(lv_color_t));
fb += fbStrideBytes;
color_p += areaWidth;
}
}

static void DEMO_FlushDisplay(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
/* Wait VSYNC for each small update. */
DEMO_WaitVsync(disp_drv);

/* Copy data from draw buffer to frame buffer. */
copy_area(area, color_p, (uint8_t*) s_frameBuffer, LCD_WIDTH * LCD_FB_BYTE_PER_PIXEL);

SCB_CleanInvalidateDCache();

lv_disp_flush_ready(disp_drv);
}
#else

static void DEMO_FlushDisplay(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{


// DCACHE_CleanByRange((uint32_t)color_p, DEMO_FB_SIZE);
DCACHE_CleanInvalidateByRange((uint32_t)color_p, DEMO_FB_SIZE);

ELCDIF_SetNextBufferAddr(LCDIF, (uint32_t)color_p);

s_framePending = true;

#if defined(SDK_OS_FREE_RTOS)
if (xSemaphoreTake(s_frameSema, portMAX_DELAY) == pdTRUE)
{
/* IMPORTANT!!!
* Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp_drv);
}
else
{
PRINTF("Display flush failed\r\n");
assert(0);
}
#else
while (s_framePending)
{
}

/* IMPORTANT!!!
* Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp_drv);
#endif
}
#endif

i.MXRT 105xRe: 求助关于RT1052显示旋转问题

Hi @dsd ,

感谢您的问题!

首先,请检查以下LVGL的限制,启用了full_refresh=1时,不支持屏幕旋转。请参考:

 
另外,RT1050有硬件pxp支持旋转,这是更推荐的方案,请参考:https://docs.nxp.com/bundle/GUIGUIDERUG-1.6.1/page/topics/rotate_screen_and_widgets.html
以及SDK中的PXP旋转相关demo。
 
Best regards,
Gavin
Re: 求助关于RT1052显示旋转问题

Helllo,

在使用 NXP i.MX RT1052 结合 Guiguider (LVGL) 进行屏幕旋转开发时,你遇到的“单缓冲刷新慢、双缓冲黑屏”问题,核心原因在于软件旋转(Software Rotate)与硬件 ELCDIF 控制器、双缓冲切换机制以及内存地址索引没有适配好。


Best Regards

Re: 求助关于RT1052显示旋转问题非常感谢,pxp旋转确实可行,完美解决问题
Tags (1)
No ratings
Version history
Last update:
a week ago
Updated by: