簡 介
HPM6700/6400系列 MCU來自上海先楫半導體科技有限公司的高性能實時RISC-V微控制器,為工業自動化及邊緣計算應用提供了極大的算力、高效的控制能力及豐富的多媒體功能。HPM6700/6400自帶的顯示控制系統,包括LCD控制器及2D圖形加速單元,性能也非常強悍,可以輕松驅動1366x768高分辨率的LCD屏,且可達到60fps的高刷新幀率。
本文主要介紹了HPM6700/6400的顯示控制系統,包括LCD控制器和2D圖形加速單元,并使用LVGL圖形庫開發的應用示例,方便開發者快速開發。
LCD 控制器 (LCDC)
HPM6700/6400系列的圖形顯示接口 LCDC 支持連接多種不同種類,不同分辨率的 LCD(TFT) 顯示屏。LCDC 支持 24 位并行數據線,支持時鐘信號 PCLK,支持 HSYNC 和 VSYNC 同步信號。LCDC 可以作為總線主設備讀取片上和片外的存儲器的圖像數據,并發送到外部顯示屏上。LCDC 的特性如下:
支持多達 24 位 RGB 顯示接口;
內置 DMA,作為總線主設備讀取顯存數據;
支持可配置的分辨率顯示屏,刷新率可達 1366x768, 60 fps;
支持多種數據格式輸入 ARGB8888,RGB565,YUV422/YCbCr422,Y8,1bpp,2bpp,4bpp 和 8bpp;
支持多達8 個圖層 Alpha Blending(混合疊加),其中 2 個主圖層支持逐行 YUV422/YCbCr422;
支持最大 pixclk 為 85MHz 。
LCDC 功能框圖
2D 圖形加速單元 (PDMA)
本產品支持 1 個 2D 圖形加速單元 PDMA。PDMA 支持處理逐行圖像數據,支持按像素處理多種尺寸,多種顏色格式的圖形;
支持同時取2個圖層的數據,每個圖層獨立啟用控制;
支持圖像格式轉換,包括ARGB8888,RGB565,YUV422H1P 圖像轉換;
支持圖像0°/90°/180°/270°旋轉;
支持水平、垂直的翻轉;
支持圖像縮放,X/Y拉伸、壓縮;
支持圖像截圖。
PDMA功能框圖
LVGL 應用開發
1. LVGL 介紹
LVGL(輕巧而多功能的圖形庫)是一個免費的開放源代碼圖形庫,它提供創建具有易于使用的圖形元素,精美的視覺效果和低內存占用的嵌入式GUI所需的一切。
主要特性:
功能強大的構建塊,例如按鈕,圖表,列表,滑塊,圖像等;
帶有動畫,抗鋸齒,不透明,平滑滾動的高級圖形各種輸入設備,例如觸摸板,鼠標,鍵盤,編碼器等;
支持UTF-8編碼的多語言;
多顯示器支持,如TFT,單色顯示器;
完全可定制的圖形元素;
獨立于任何微控制器或顯示器使用的硬件;
可擴展以使用很少的內存(64 KB閃存,16 KB RAM)進行操作;
單幀緩沖區操作,即使具有高級圖形效果;
用C語言編寫,以實現最大的兼容性(與C ++兼容);
模擬器可在沒有嵌入式硬件的PC上進行嵌入式GUI設計。
可移植到MicroPython;
可快速上手的教程、示例、主題;
豐富的文檔教程;
在MIT許可下免費和開源。
2. LVGL移植適配
官方已經移植和適配好了LVGL,代碼結構如下:
?./lvgl庫本身
?./lv_drivers顯示和輸入設備驅動程序
?./lv_examples示例和演示
?Lvgl官方網站(https://docs.lvgl.io)
?Lvgl官方博客站點(https://blog.lvgl.io)
?Sim在線模擬器網站(https://sim.lvgl.io)
?lv_sim_... 適用于各種IDE和平臺的模擬器項目
?lv_port_... 移植到其他開發板
?lv_binding_... 綁定到其他語言
?lv _… 移植到其他平臺
其中,lvgl,lv_examples和lv_drivers是最受維護、關注的核心存儲庫。
lv_drivers顯示接口:
要設置顯示,必須初始化 lv_disp_draw_buf_t 和 lv_disp_drv_t 變量。
lv_disp_draw_buf_t 保存顯示緩沖區信息的結構體
lv_disp_drv_t HAL要注冊的顯示驅動程序、與顯示交互并處理與圖形相關的結構體、回調函數。
顯示緩沖器:
關于緩沖區大小,有 3 種情況:
(1)一個緩沖區:LVGL將屏幕的內保存到緩沖區中并將其發送到顯示器。緩沖區可以小于屏幕。在這種情況下,較大的區域將被重畫成多個部分。如果只有很小的區域發生變化(例如按下按鈕),則只會刷新該部分的區域。
(2)兩個非屏幕大小的緩沖區:具有兩個緩沖區的 LVGL 可以將其中一個作為顯示緩沖區,而另一緩沖區的內容發送到后臺顯示。應該使用 DMA 或其他硬件將數據傳輸到顯示器,以讓CPU同時繪圖。這樣,渲染和刷新并行處理。與一個緩沖區的情況類似,如果緩沖區小于要刷新的區域,LVGL將按塊繪制顯示內容
(3)兩個屏幕大小的緩沖區:與兩個非屏幕大小的緩沖區相反,LVGL將始終提供整個屏幕的內容,而不僅僅是塊。這樣,驅動程序可以簡單地將幀緩沖區的地址更改為從 LVGL 接收的緩沖區。因此,當MCU具有 LCD/TFT 接口且幀緩沖區只是 RAM 中的一個位置時,這種方法的效果很好。
顯示驅動器:
一旦緩沖區初始化準備就緒,就需要初始化顯示驅動程序。
lv_disp_drv_t的初始化,需要使用 lv_disp_drv_init(&disp_drv) 進行初始化。最后,要為 LVGL 注冊顯示設備,需要調用lv_disp_drv_register(&disp_drv)。
在最簡單的情況下,僅需要設置 lv_disp_drv_t 的以下兩個字段:
?draw_buf 指向已初始化的 lv_disp_buf_t 變量的指針。
?flush_cb 回調函數,用于將緩沖區的內容復制到顯示的特定區域。刷新準備就緒后,需要調用lv_disp_flush_ready()。LVGL可能會以多個塊呈現屏幕,因此多次調用flush_cb。使用 lv_disp_flush_is_last() 可以查看哪塊是最后渲染的。
其中,有一些可選的數據字段:
?hor_res 顯示器的水平分辨率。(默認為 lv_conf.h 中的 LV_HOR_RES_MAX )
?ver_res 顯示器的垂直分辨率。(默認為 lv_conf.h 中的 LV_VER_RES_MAX )
?color_chroma_key 色彩鍵控支持透明色。(默認為 lv_conf.h 中的 LV_COLOR_TRANSP )
?user_data 驅動程序的自定義用戶數據。可以在 lv_conf.h 中修改其類型。
?anti-aliasing 使用抗鋸齒(anti-aliasing)(邊緣平滑)。缺省情況下默認為 lv_conf.h 中的 LV_ANTIALIAS 。
?rotated 如果 1 交換 hor_res 和 ver_res 。兩種情況下 LVGL 的繪制方向相同(從上到下的線條),因此還需要重新配置驅動程序以更改顯示器的填充方向。
?screen_transp 如果為 1 ,則屏幕可以具有透明或不透明的樣式。需要在 lv_conf.h 中啟用 LV_COLOR_SCREEN_TRANSP 。
要使用GPU,可以使用以下回調:
?gpu_fill_cb 用顏色填充內存中的區域。
?gpu_blend_cb 使用不透明度混合兩個內存緩沖區。
?gpu_wait_cb 如果在 GPU 仍在運行 LVGL 的情況下返回了任何 GPU 函數,則在需要確保GPU渲染就緒時將使用此函數。
其他一些可選的回調,使單色、灰度或其他非標準RGB顯示一起使用時更輕松、優化:
?rounder_cb 四舍五入要重繪的區域的坐標。例如。2x2像素可以轉換為2x8。如果顯示控制器只能刷新特定高度或寬度的區域(對于單色顯示器,通常為8 px高),則可以使用它。
?set_px_cb 編寫顯示緩沖區的自定義函數。如果顯示器具有特殊的顏色格式,則可用于更緊湊地存儲像素。(例如1位單色,2位灰度等)。這樣,lv_disp_buf_t中使用的緩沖區可以較小,以僅保留給定區域大小所需的位數。set_px_cb不能與兩個屏幕大小的緩沖區一起顯示緩沖區配置。
?monitor_cb 回調函數告訴在多少時間內刷新了多少像素。
?clean_dcache_cb清除與顯示相關的所有緩存的回調
lv_drivers顯示接口:
要設置輸入設備,必須初始化 lv_indev_drv_t 變量,類型(indev_drv.type)可以是:
?LV_INDEV_TYPE_POINTER觸摸板或鼠標
?LV_INDEV_TYPE_KEYPAD鍵盤或小鍵盤
?LV_INDEV_TYPE_ENCODER帶有左,右,推動選項的編碼器
?LV_INDEV_TYPE_BUTTON外部按鈕按下屏幕
3. 應用開發
LVGL圖形庫功能控件有很多,這里不在詳細介紹,詳細API介紹查閱LVGL官網。
LVGL主要控件功能有:
使用 lvgl 圖形庫之前,我們還必須初始化 lvgl 以及相關其他組件。初始化的順序為:
?調用 lv_init() 初始化 lvgl 庫;
?初始化驅動程序;
?在 LVGL 中注冊顯示和輸入設備驅動程序;
?在中斷中每隔 x毫秒調用 lv_tick_inc(x)用以告知 lvgl 經過的時間;
?每隔 x毫秒定期調用 lv_task_handler()用以處理與 lvgl 相關的任務。
SquareLine_Studio設計器:
(1)創建項目
(2)控件布局設計
(3)代碼生成
(4)代碼適配工程
(5)添加事件響應代碼
運行效果:
性能測試:
fps幀率:每秒鐘LCD圖形刷新的幀數;
LVGL會通過內部的tick,定時去刷屏幕;
10即1000ms/10ms=100FPS;
這個宏定義限定了LVGL刷屏幀率的上限,設定滿幀100幀;
使用全尺寸雙buffer。
實測結果:
總 結
本文介紹了 HPM6700/6400 LCD 控制器和2D圖形加速單元模塊,同時介紹了 LVGL 圖形界面庫功能及移植適配要點,并基于 LVGL 圖形界面庫開發驅動點亮LCD屏的應用示例。根據實測結果,LCD 幀率可達到60fps。官方 HPM-SDK 已將LVGL圖形庫移植適配完成,也提供了基于 LVGL 的demo示例,用戶可以非常便捷的使用HPM6700/6400 SDK 來完成LCD相關的應用開發。
-
mcu
+關注
關注
146文章
17170瀏覽量
351415
發布評論請先 登錄
相關推薦
評論