完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这几天我用ESP32通过LVGL成功驱动了一块ILI9488的TFT。
但是遇到一个问题始终不能解决。 无论我放置什么组件到屏幕的右侧边缘(屏幕的 x = 0 在最左边)总会出现一串亮点,并且有从上到下越来越亮的现象。 是不是很有趣的现象? 起初问题的表现为图1,经过我的观察,总共有8个亮点,而我的屏幕y轴分辨率为 320. 仔细思考后,猜测,是否再刷新LCD时,LVGL把整个屏幕分成了8块,而每一块的最后一个点数据错误,导致变色。 随后我更改了 lvgl_helpers.h 中的这个宏定义: #elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 #define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) /* 我将 40 改为20 */ 因为 40 * 8 刚好是 320 , 而他定义的 DISP_BUF_SIZE 是屏幕宽度(480)的 40 倍,这样算下来刚好 8 次刷满一个屏幕。 现在我把常数 40 改为 20 , 会不会出现16个渐渐变亮的点呢? 后来我又怀疑是不是屏幕本身的质量问题,导致了这样的结果。经过反复测试,无论我把屏幕定义为多大, 也就是: #define LV_HOR_RES_MAX 480 #define LV_VER_RES_MAX 320 这无论无何改变,所规定的屏幕边缘区域都会出现这样一排亮点。 也就是说 如果我把屏幕变为 LV_HOR_RES_MAX 320 ,假设是一块320 x 320的屏幕,在屏幕 X = 320 的纵轴上依然会出现这样的亮点。 下面是我目前的代码: 1>gui任务初始化部分 static void guiTask(void *pvParameter) { (void)pvParameter; xGuiSemaphore = xSemaphoreCreateMutex(); lv_init(); /* Initialize SPI or I2C bus used by the drivers */ lvgl_driver_init(); lv_color_t *buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA); assert(buf1 != NULL); static lv_color_t *buf2 = NULL; static lv_disp_draw_buf_t disp_buf; uint32_t size_in_px = DISP_BUF_SIZE; /* 就是这里传入了显示BUFF的大小 480 x 40 */ /* Initialize the working buffer depending on the selected display. * NOTE: buf2 == NULL when using monochrome displays. */ lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.flush_cb = disp_driver_flush; disp_drv.hor_res = LV_HOR_RES_MAX; disp_drv.ver_res = LV_VER_RES_MAX; disp_drv.draw_buf = &disp_buf; lv_disp_drv_register(&disp_drv); /* Register an input device when enabled on the menuconfig */ #if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE lv_indev_drv_t indev_drv; lv_indev_drv_init(&indev_drv); indev_drv.read_cb = touch_driver_read; indev_drv.type = LV_INDEV_TYPE_POINTER; lv_indev_drv_register(&indev_drv); #endif /* Create and start a periodic timer interrupt to call lv_tick_inc */ const esp_timer_create_args_t periodic_timer_args = { .callback = &lv_tick_task, .name = "periodic_gui"}; esp_timer_handle_t periodic_timer; ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer)); ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, portTICK_PERIOD_MS * 1000)); /* Create the demo application */ create_demo_application(); while (1) { /* Delay 1 tick (assumes FreeRTOS tick is 10ms */ vTaskDelay(pdMS_TO_TICKS(10)); /* Try to take the semaphore, call lvgl related function on success */ if (pdTRUE == xSemaphoreTake(xGuiSemaphore, portMAX_DELAY)) { lv_task_handler(); xSemaphoreGive(xGuiSemaphore); } } /* A task should NEVER return */ free(buf1); #ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME free(buf2); #endif vTaskDelete(NULL); } 2>界面实体部分 LV_IMG_DECLARE(back_img); /* 用于桌面背景的图片 size = 480 x 320 */ static void create_demo_application(void) { #if 1 /* 这里显示的图片就是背景图片,图片本身没有问题,我也用纯色的图片测试过,甚至改变桌面的颜色 结果都一样 */ lv_obj_t *back_img_hal = lv_img_create(lv_scr_act()); lv_img_set_src(back_img_hal, &back_img); lv_obj_align(back_img_hal, LV_ALIGN_TOP_LEFT, 0, 0); ....以下绘制了一些用于显示内容的 box ,无论是否编译对该问题没有影响。 有没有大神帮忙分析一下,问题出在哪里?我该如何处理? 谢谢您的解答,不甚感激! |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
321 浏览 0 评论
1178 浏览 1 评论
586浏览 6评论
483浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
468浏览 5评论
467浏览 4评论
442浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 03:40 , Processed in 1.356378 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号