imxrt1052 emwin pxp 显存起点出现偏移

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

imxrt1052 emwin pxp 显存起点出现偏移

402 Views
ccc_clive
Contributor III

当前pxp可以显示GUI_DRAW_BMPM8888I的图片,GUI_DRAW_BMP8888的图片显示异常。

但调用pxp后疑似显存起点发生偏移,且偏移位置随机。如下,图片的白色部分为特意去掉的

Snipaste_2026-03-28_12-03-08.png

Snipaste_2026-03-28_12-03-51.png

如图,左右出现随机的偏差,但垂直方向偏差几乎很小。

不用pxp绘图,则不会出现偏移的现象。应该是pxp的绘图时出现问题。

请问该如何来解决这个问题呢

Labels (1)
0 Kudos
Reply
2 Replies

356 Views
ccc_clive
Contributor III
主ram是dtcram,显示buff是写回不共享,无缓存的也试过了,没作用, *((volatile uint32_t *)0x41044100) = 11;
*((volatile uint32_t *)0x41043100) = 5; // 15;总线的优先级也设置了,不知道该如何来解决了
0 Kudos
Reply

229 Views
Gavin_Jia
NXP TechSupport
NXP TechSupport

Hi @ccc_clive ,

感谢您提出的问题,抱歉我回复迟了。

您提到的这个问题更像是一个系统的问题,我没办法一一确定,但是我查看了您提供的源码,发现了几个问题点,可能需要注意:

1. _Malloc()中存在一个逻辑错误:

if (NumBytes > sizeof(_pxp_buffer))
{
    _pBuffer = NULL;
}
_pBuffer = _pxp_buffer;

这里应当写为如下逻辑:

static void *_Malloc(U32 NumBytes)
{
#if USE_PXP_BUFFER
if (NumBytes > sizeof(_pxp_buffer))
{
_pBuffer = NULL;
return NULL;
}
_pBuffer = _pxp_buffer;
#else
...
#endif
return _pBuffer;
}

 

2. block size 配成 8x8,但 _PXP_CheckSizes() 却按 16x16 做补偿,需要统一;

3. GUI_DRAW_BMP8888 进入了错误的 PXP 输入路径

_LCD_PXP_SetAlphaSurface((void *)p, BytesPerLine, xSize, ySize, kPXP_AsPixelFormatARGB8888);
_LCD_PXP_AlphaBlending()->Mode = BLEND_MODE_NORMAL;
pCtx->pProcessSurface = pPS = &_PXP_aBuffer[BUFFER_TYPE_PROCESS_SURFACE];
*pPS = *pCtx->pOutputBuffer;
pPS->Format.Ps = kPXP_PsPixelFormatRGB565;
_LCD_PXP_DrawBitmap(pCtx);

需要确认 GUI_DRAW_BMP8888 是3Bpp还是4Bpp。

如果是 3Bpp:它更像 packed RGB888,不能直接喂给 PXP 的 PS/AS RGB888 输入。
正确做法是:先用 CPU 展开成 4Bpp(ARGB8888 或 unpacked RGB888),再喂给 PXP。

如果是 4Bpp:那它可能适合走 kPXP_PsPixelFormatRGB888 或 kPXP_AsPixelFormatARGB8888 之类 32-bit slot 路径。 

另外,需要考虑把“带 alpha”和“不带 alpha”的 32bpp 图彻底分流
带透明 → 走 AS / ARGB8888
不带透明 → 优先考虑走 PS

Best regards,
Gavin

0 Kudos
Reply