
一般是颜色字节顺序问题比如RGB565的红色是0xF800 ,ST7789要求先发高位再发低位 。默认pix_map的颜色顺序是 pix_map[0] 0x00 , pix_map[1] 0xF8 ,当你使用DMA画质按字节按顺序发送时就会是先发0x00 再发0xF8。 所以颜色错误。第一步启用交换字节版本的RGB565即LV_DRAW_SW_SUPPORT_RGB565_SWAPPED#define LV_DRAW_SW_SUPPORT_RGB565 1 #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED 1 #define LV_DRAW_SW_SUPPORT_RGB565A8 0 #define LV_DRAW_SW_SUPPORT_RGB888 0 #define LV_DRAW_SW_SUPPORT_XRGB8888 0 #define LV_DRAW_SW_SUPPORT_ARGB8888 0 #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED 0 #define LV_DRAW_SW_SUPPORT_L8 0 #define LV_DRAW_SW_SUPPORT_AL88 0 #define LV_DRAW_SW_SUPPORT_A8 0 #define LV_DRAW_SW_SUPPORT_I1 0第二步 lv_port_disp_init内设置使用交换字节版本的RGB565必须且set format 要在 set_flush_cb 之前调用。void lv_port_disp_init(void) { /*------------------------- * Initialize your display * -----------------------*/ disp_init(); /*------------------------------------ * Create a display and set a flush_cb * -----------------------------------*/ lv_display_t * disp lv_display_create(MY_DISP_HOR_RES, MY_DISP_VER_RES); // set format 要在 set_flush_cb 之前调用 lv_display_set_color_format( disp, LV_COLOR_FORMAT_RGB565_SWAPPED ; lv_display_set_flush_cb(disp, disp_flush); // /* Example 1 // * One buffer for partial rendering*/ LV_ATTRIBUTE_MEM_ALIGN static uint8_t buf_1_1[MY_DISP_HOR_RES * 10 * BYTE_PER_PIXEL]; /*A buffer for 10 rows*/ lv_display_set_buffers(disp, buf_1_1, NULL, sizeof(buf_1_1), LV_DISPLAY_RENDER_MODE_PARTIAL); // /* Example 2 // * Two buffers for partial rendering // * In flush_cb DMA or similar hardware should be used to update the display in the background.*/ // LV_ATTRIBUTE_MEM_ALIGN // static uint8_t buf_2_1[MY_DISP_HOR_RES * 10 * BYTE_PER_PIXEL]; // LV_ATTRIBUTE_MEM_ALIGN // static uint8_t buf_2_2[MY_DISP_HOR_RES * 10 * BYTE_PER_PIXEL]; // lv_display_set_buffers(disp, buf_2_1, buf_2_2, sizeof(buf_2_1), LV_DISPLAY_RENDER_MODE_PARTIAL); // /* Example 3 // * Two buffers screen sized buffer for double buffering. // * Both LV_DISPLAY_RENDER_MODE_DIRECT and LV_DISPLAY_RENDER_MODE_FULL works, see their comments*/ // LV_ATTRIBUTE_MEM_ALIGN // static uint8_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES * BYTE_PER_PIXEL]; // LV_ATTRIBUTE_MEM_ALIGN // static uint8_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES * BYTE_PER_PIXEL]; // lv_display_set_buffers(disp, buf_3_1, buf_3_2, sizeof(buf_3_1), LV_DISPLAY_RENDER_MODE_DIRECT); }