Description
I am using V8.1.0, and the display driver uses double buffering (modify the buffer address to refresh the display). Running the “lv_demo_music” template will cause a splash screen problem.
What MCU/Processor/Board and compiler are you using?
F1C100S(Run freertos),MDK
What have you tried so far?
- I tried to record the entire flashing process with my mobile phone. The flashing is like adding a mask to the screen.
- I have tried many versions, in 7.2.0 7.11.0 8.0 8.1, this problem will appear on the development board.
- I tried to test the F1C100S refresh frame rate, 800*480 RGB565 can reach 60Hz.
- I try to solve this problem by waiting 20ms after setting the buffer address, but I think this is very unreasonable.
Code to reproduce
This is my display driver code:
void lv_port_disp_init(void)
{
/* Example for 3) also set disp_drv.full_refresh = 1 below*/
static lv_disp_draw_buf_t draw_buf_dsc_3;
static __align(32) lv_color_t buf_3_1[800 * 480]; /*A screen sized buffer*/
static __align(32) lv_color_t buf_3_2[800 * 480]; /*An other screen sized buffer*/
lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, 800 * 480); /*Initialize the display buffer*/
/*-----------------------------------
* Register the display in LVGL
*----------------------------------*/
static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
/*Set up the functions to access to your display*/
/*Set the resolution of the display*/
disp_drv.hor_res = 800;
disp_drv.ver_res = 480;
/*Used to copy the buffer's content to the display*/
disp_drv.flush_cb = disp_flush;
/*Set a display buffer*/
disp_drv.draw_buf = &draw_buf_dsc_3;
/*Required for Example 3)*/
disp_drv.full_refresh = 1;
/* Fill a memory array with a color if you have GPU.
* Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
* But if you have a different GPU you can use with this callback.*/
//disp_drv.gpu_fill_cb = gpu_fill;
/*Finally register the driver*/
lv_disp_drv_register(&disp_drv);
}
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*/
atk_fb_set_present(lcd_fb, 0, color_p); /* Set buffer address */
lv_disp_flush_ready(disp_drv);
}