ESP32-P4 --- LCD 控制与触屏
LCD控制
用户把需要更新的像素数据通过拷贝或者DMA搬到 frame buffer,然后刷一下CACHE
static esp_err_t dpi_panel_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data)
frame buffer 的数据是通过DMA不停的发送到 DSI bridge(FIFO memory of peripheral: DSI),一帧搬完,在完成回调函数重新启动DMA
static esp_err_t dpi_panel_create_dma_link(esp_lcd_dpi_panel_t *dpi_panel)
DMA的源地址和目的地址在这里设置
完成回调函数即是场同步信号,可以在这里计数得到实际刷新频率(frame per second)
IRAM_ATTR static bool dma_trans_done_cb(dw_gdma_channel_handle_t chan, const dw_gdma_trans_done_event_data_t *event_data, void *user_data) { bool yield_needed = false; esp_lcd_dpi_panel_t *dpi_panel = (esp_lcd_dpi_panel_t *)user_data; uint8_t fb_index = dpi_panel->cur_fb_index; dw_gdma_link_list_handle_t link_list = dpi_panel->link_lists[fb_index]; // restart the DMA transfer, keep refreshing the LCD dw_gdma_block_markers_t markers = { .is_valid = true, .is_last = true, }; dw_gdma_lli_set_block_markers(dw_gdma_link_list_get_item(link_list, 0), markers); dw_gdma_channel_use_link_list(chan, link_list); dw_gdma_channel_enable_ctrl(chan, true); // 启动 DMA 搬移 // the DMA descriptor is large enough to carry a whole frame buffer, so this event can also be treated as a fake "vsync end" if (dpi_panel->on_refresh_done) { if (dpi_panel->on_refresh_done(&dpi_panel->base, NULL, dpi_panel->user_ctx)) { yield_needed = true; } } return yield_needed; }
当数据从缓存拷贝到帧缓存,会回调函数 on_color_trans_done
当数据从帧缓存发送到DSI,会回调函数 on_refresh_done
ESP_LOGI(TAG, "Register DPI panel event callback for LVGL flush ready notification"); esp_lcd_dpi_panel_event_callbacks_t cbs = { .on_color_trans_done = example_notify_lvgl_flush_ready, #if CONFIG_EXAMPLE_MONITOR_FPS_BY_GPIO .on_refresh_done = example_monitor_fps, #endif };
防撕裂
on_refresh_done 释放信号量,表示搬完一帧数据到LCD
把数据刷新到帧缓存,并且把 cur_fb_index 更新为已经更新过数据的帧缓存的索引
刷新数据到帧缓存后,先清空信号量再等待信号量
防撕裂需要双帧缓存,lvgl支持双缓存
触屏
触屏中断脚的中断服务函数设置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2018-04-23 UDP 和 TCP 的对比
2018-04-23 UDP ------ UDP打洞
2016-04-23 MP150 AC-DC电源芯片note
2016-04-23 JAVA tomcat