在KEIL环境中通过LVGLpack移植到STM32H750 RTX5工程
测试一个普通的容器控件时没有问题的
当我用单缓冲显示一个开关控件时,它改变状态就会发生显示错误
而当采取全屏幕的双缓冲时,其改变状态后就会“消失”。
static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map)
{
int32_t x;
int32_t y;
x = area->x2 - area->x1 +1;
y = area->y2 - area->y1 +1;
int32_t width = area->x2 - area->x1 + 1;
int32_t height = area->y2 - area->y1 + 1;
uint32_t line_offset = (MY_DISP_HOR_RES - width); // Display stride adjustment
uint32_t addr = (0xD0000000 + (MY_DISP_HOR_RES*area->y1 + area->x1)*2);
_DMA2D_Copy((uint32_t*)px_map,
(void *)addr,
x,
y,
0,
line_offset) ;
lv_display_flush_ready(disp_drv);
}
void _DMA2D_Copy(void * pSrc,
void * pDst,
uint32_t xSize,
uint32_t ySize,
uint32_t OffLineSrc,
uint32_t OffLineDst)
{
uint32_t bufferSize = xSize * ySize * 2; // RGB565=2字节/像素
// 清理CPU缓存确保数据写入物理内存
SCB_CleanDCache_by_Addr(pSrc, bufferSize);
/* DMA2D 采用存储器到存储器模式, 这种模式是前景层作为 DMA2D 输入 */
DMA2D->CR = 0x00000000UL | (1 << 9);
DMA2D->FGMAR = (uint32_t)pSrc;
DMA2D->OMAR = (uint32_t)pDst;
DMA2D->FGOR = OffLineSrc;
DMA2D->OOR = OffLineDst;
/* 前景层和输出区域都采用的 RGB565 颜色格式 */
DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB565;
DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_RGB565;
DMA2D->NLR = (uint32_t)(xSize << 16) | (uint16_t)ySize;
// 启动传输前使D-Cache失效
SCB_InvalidateDCache_by_Addr(pDst, bufferSize);
/* 启动传输 */
DMA2D->CR |= DMA2D_CR_START;
/* 等待 DMA2D 传输完成 */
while (DMA2D->CR & DMA2D_CR_START) {}
}