STM32469iDiscovery + LVGL 窗帘现象

怎么移植就不说了,网上很多,只谈下最近碰到的一个现象

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

//    int32_t x;
//    int32_t y;
//		int32_t offset;
//    for(y = area->y1; y <= area->y2; y++) {
//			offset = 0xc0000000 + (area->x1 + y * disp_drv->hor_res)*4;
//        for(x = area->x1; x <= area->x2; x++) {
//            /*Put a pixel to the display. For example:*/
//            /*put_px(x, y, *color_p)*/
						BSP_LCD_DrawPixel(x,y,color_p->full);
//						*(uint32_t*)(offset)=color_p->full;
//						offset+=4;
//            color_p++;
//        }
//    }
		uint32_t startx,starty;
		uint32_t sizex,sizey;
		if(area->x1x2)
		{
			startx=area->x1;
			sizex = area->x2 - area->x1 + 1;
		}
		else
		{
			startx=area->x2;
			sizex = area->x1 - area->x2 + 1;
		}
		if(area->y1y2)
		{
			starty=area->y1;
			sizey = area->y2 - area->y1 + 1;
		}
		else
		{
			starty=area->y2;
			sizey = area->y1 - area->y2 + 1;
		}
		
		DMA2D_SetArea((uint32_t *)color_p,(uint32_t *)0xc0000000, startx, starty, sizex,sizey);

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

如果不用硬件,直接一个像素一个像素的写入,BSP_LCD_DrawPixel(x,y,color_p->full);没问题一切正常。但用DMA2D后,不论是等着DMA2D传输结束还是在传输结束中断里lv_disp_flush_ready(disp_drv);都会出现像窗帘一样的现象,百思不得其解。

在DMA2D操作后加入几毫秒延时可以解决,但这就失去用DMA2D的意义了。

STM32469iDiscovery + LVGL 窗帘现象_第1张图片

今天在想是不是需要自动刷新,而非手动HAL_DSI_Refresh(&hdsi_eval);   时发现DSI有个设置和范例不同。

  CmdCfg.TearingEffectSource   = DSI_TE_EXTERNAL;//DSI_TE_DSILINK;

TearingEffectSource开始是用SDILINK, 改成EXTERNAL后意外发现窗帘消失了

STM32469iDiscovery + LVGL 窗帘现象_第2张图片

 

 

你可能感兴趣的:(stm32)