簡(jiǎn) 介
HPM6700/6400系列 MCU來(lái)自上海先楫半導(dǎo)體科技有限公司的高性能實(shí)時(shí)RISC-V微控制器,為工業(yè)自動(dòng)化及邊緣計(jì)算應(yīng)用提供了極大的算力、高效的控制能力及豐富的多媒體功能。HPM6700/6400自帶的顯示控制系統(tǒng),包括LCD控制器及2D圖形加速單元,性能也非常強(qiáng)悍,可以輕松驅(qū)動(dòng)1366x768高分辨率的LCD屏,且可達(dá)到60fps的高刷新幀率。
本文主要介紹了HPM6700/6400的顯示控制系統(tǒng),包括LCD控制器和2D圖形加速單元,并使用LVGL圖形庫(kù)開(kāi)發(fā)的應(yīng)用示例,方便開(kāi)發(fā)者快速開(kāi)發(fā)。
LCD 控制器 (LCDC)
HPM6700/6400系列的圖形顯示接口 LCDC 支持連接多種不同種類(lèi),不同分辨率的 LCD(TFT) 顯示屏。LCDC 支持 24 位并行數(shù)據(jù)線,支持時(shí)鐘信號(hào) PCLK,支持 HSYNC 和 VSYNC 同步信號(hào)。LCDC 可以作為總線主設(shè)備讀取片上和片外的存儲(chǔ)器的圖像數(shù)據(jù),并發(fā)送到外部顯示屏上。LCDC 的特性如下:
支持多達(dá) 24 位 RGB 顯示接口;
內(nèi)置 DMA,作為總線主設(shè)備讀取顯存數(shù)據(jù);
支持可配置的分辨率顯示屏,刷新率可達(dá) 1366x768, 60 fps;
支持多種數(shù)據(jù)格式輸入 ARGB8888,RGB565,YUV422/YCbCr422,Y8,1bpp,2bpp,4bpp 和 8bpp;
支持多達(dá)8 個(gè)圖層 Alpha Blending(混合疊加),其中 2 個(gè)主圖層支持逐行 YUV422/YCbCr422;
支持最大 pixclk 為 85MHz 。

LCDC 功能框圖
2D 圖形加速單元 (PDMA)
本產(chǎn)品支持 1 個(gè) 2D 圖形加速單元 PDMA。PDMA 支持處理逐行圖像數(shù)據(jù),支持按像素處理多種尺寸,多種顏色格式的圖形;
支持同時(shí)取2個(gè)圖層的數(shù)據(jù),每個(gè)圖層獨(dú)立啟用控制;
支持圖像格式轉(zhuǎn)換,包括ARGB8888,RGB565,YUV422H1P 圖像轉(zhuǎn)換;
支持圖像0°/90°/180°/270°旋轉(zhuǎn);
支持水平、垂直的翻轉(zhuǎn);
支持圖像縮放,X/Y拉伸、壓縮;
支持圖像截圖。
PDMA功能框圖
LVGL 應(yīng)用開(kāi)發(fā)
1. LVGL 介紹
LVGL(輕巧而多功能的圖形庫(kù))是一個(gè)免費(fèi)的開(kāi)放源代碼圖形庫(kù),它提供創(chuàng)建具有易于使用的圖形元素,精美的視覺(jué)效果和低內(nèi)存占用的嵌入式GUI所需的一切。
主要特性:
功能強(qiáng)大的構(gòu)建塊,例如按鈕,圖表,列表,滑塊,圖像等;
帶有動(dòng)畫(huà),抗鋸齒,不透明,平滑滾動(dòng)的高級(jí)圖形各種輸入設(shè)備,例如觸摸板,鼠標(biāo),鍵盤(pán),編碼器等;
支持UTF-8編碼的多語(yǔ)言;
多顯示器支持,如TFT,單色顯示器;
完全可定制的圖形元素;
獨(dú)立于任何微控制器或顯示器使用的硬件;
可擴(kuò)展以使用很少的內(nèi)存(64 KB閃存,16 KB RAM)進(jìn)行操作;
操作系統(tǒng),支持外部存儲(chǔ)器和GPU,但不是必需的;
單幀緩沖區(qū)操作,即使具有高級(jí)圖形效果;
用C語(yǔ)言編寫(xiě),以實(shí)現(xiàn)最大的兼容性(與C ++兼容);
模擬器可在沒(méi)有嵌入式硬件的PC上進(jìn)行嵌入式GUI設(shè)計(jì)。
可移植到MicroPython;
可快速上手的教程、示例、主題;
豐富的文檔教程;
在MIT許可下免費(fèi)和開(kāi)源。
2. LVGL移植適配
官方已經(jīng)移植和適配好了LVGL,代碼結(jié)構(gòu)如下:
?./lvgl庫(kù)本身
?./lv_drivers顯示和輸入設(shè)備驅(qū)動(dòng)程序
?./lv_examples示例和演示
?Lvgl官方網(wǎng)站(https://docs.lvgl.io)
?Lvgl官方博客站點(diǎn)(https://blog.lvgl.io)
?Sim在線模擬器網(wǎng)站(https://sim.lvgl.io)
?lv_sim_... 適用于各種IDE和平臺(tái)的模擬器項(xiàng)目
?lv_port_... 移植到其他開(kāi)發(fā)板
?lv_binding_... 綁定到其他語(yǔ)言
?lv _… 移植到其他平臺(tái)
其中,lvgl,lv_examples和lv_drivers是最受維護(hù)、關(guān)注的核心存儲(chǔ)庫(kù)。

lv_drivers顯示接口:
要設(shè)置顯示,必須初始化 lv_disp_draw_buf_t 和 lv_disp_drv_t 變量。
lv_disp_draw_buf_t 保存顯示緩沖區(qū)信息的結(jié)構(gòu)體
lv_disp_drv_t HAL要注冊(cè)的顯示驅(qū)動(dòng)程序、與顯示交互并處理與圖形相關(guān)的結(jié)構(gòu)體、回調(diào)函數(shù)。
顯示緩沖器:
關(guān)于緩沖區(qū)大小,有 3 種情況:
(1)一個(gè)緩沖區(qū):LVGL將屏幕的內(nèi)保存到緩沖區(qū)中并將其發(fā)送到顯示器。緩沖區(qū)可以小于屏幕。在這種情況下,較大的區(qū)域?qū)⒈恢禺?huà)成多個(gè)部分。如果只有很小的區(qū)域發(fā)生變化(例如按下按鈕),則只會(huì)刷新該部分的區(qū)域。
(2)兩個(gè)非屏幕大小的緩沖區(qū):具有兩個(gè)緩沖區(qū)的 LVGL 可以將其中一個(gè)作為顯示緩沖區(qū),而另一緩沖區(qū)的內(nèi)容發(fā)送到后臺(tái)顯示。應(yīng)該使用 DMA 或其他硬件將數(shù)據(jù)傳輸?shù)斤@示器,以讓CPU同時(shí)繪圖。這樣,渲染和刷新并行處理。與一個(gè)緩沖區(qū)的情況類(lèi)似,如果緩沖區(qū)小于要刷新的區(qū)域,LVGL將按塊繪制顯示內(nèi)容
(3)兩個(gè)屏幕大小的緩沖區(qū):與兩個(gè)非屏幕大小的緩沖區(qū)相反,LVGL將始終提供整個(gè)屏幕的內(nèi)容,而不僅僅是塊。這樣,驅(qū)動(dòng)程序可以簡(jiǎn)單地將幀緩沖區(qū)的地址更改為從 LVGL 接收的緩沖區(qū)。因此,當(dāng)MCU具有 LCD/TFT 接口且?guī)彌_區(qū)只是 RAM 中的一個(gè)位置時(shí),這種方法的效果很好。
一旦緩沖區(qū)初始化準(zhǔn)備就緒,就需要初始化顯示驅(qū)動(dòng)程序。
lv_disp_drv_t的初始化,需要使用 lv_disp_drv_init(&disp_drv) 進(jìn)行初始化。最后,要為 LVGL 注冊(cè)顯示設(shè)備,需要調(diào)用lv_disp_drv_register(&disp_drv)。
在最簡(jiǎn)單的情況下,僅需要設(shè)置 lv_disp_drv_t 的以下兩個(gè)字段:
?draw_buf 指向已初始化的 lv_disp_buf_t 變量的指針。
?flush_cb 回調(diào)函數(shù),用于將緩沖區(qū)的內(nèi)容復(fù)制到顯示的特定區(qū)域。刷新準(zhǔn)備就緒后,需要調(diào)用lv_disp_flush_ready()。LVGL可能會(huì)以多個(gè)塊呈現(xiàn)屏幕,因此多次調(diào)用flush_cb。使用 lv_disp_flush_is_last() 可以查看哪塊是最后渲染的。
其中,有一些可選的數(shù)據(jù)字段:
?hor_res 顯示器的水平分辨率。(默認(rèn)為 lv_conf.h 中的 LV_HOR_RES_MAX )
?ver_res 顯示器的垂直分辨率。(默認(rèn)為 lv_conf.h 中的 LV_VER_RES_MAX )
?color_chroma_key 色彩鍵控支持透明色。(默認(rèn)為 lv_conf.h 中的 LV_COLOR_TRANSP )
?user_data 驅(qū)動(dòng)程序的自定義用戶(hù)數(shù)據(jù)。可以在 lv_conf.h 中修改其類(lèi)型。
?anti-aliasing 使用抗鋸齒(anti-aliasing)(邊緣平滑)。缺省情況下默認(rèn)為 lv_conf.h 中的 LV_ANTIALIAS 。
?rotated 如果 1 交換 hor_res 和 ver_res 。兩種情況下 LVGL 的繪制方向相同(從上到下的線條),因此還需要重新配置驅(qū)動(dòng)程序以更改顯示器的填充方向。
?screen_transp 如果為 1 ,則屏幕可以具有透明或不透明的樣式。需要在 lv_conf.h 中啟用 LV_COLOR_SCREEN_TRANSP 。
要使用GPU,可以使用以下回調(diào):
?gpu_fill_cb 用顏色填充內(nèi)存中的區(qū)域。
?gpu_blend_cb 使用不透明度混合兩個(gè)內(nèi)存緩沖區(qū)。
?gpu_wait_cb 如果在 GPU 仍在運(yùn)行 LVGL 的情況下返回了任何 GPU 函數(shù),則在需要確保GPU渲染就緒時(shí)將使用此函數(shù)。
其他一些可選的回調(diào),使單色、灰度或其他非標(biāo)準(zhǔn)RGB顯示一起使用時(shí)更輕松、優(yōu)化:
?rounder_cb 四舍五入要重繪的區(qū)域的坐標(biāo)。例如。2x2像素可以轉(zhuǎn)換為2x8。如果顯示控制器只能刷新特定高度或?qū)挾鹊膮^(qū)域(對(duì)于單色顯示器,通常為8 px高),則可以使用它。
?set_px_cb 編寫(xiě)顯示緩沖區(qū)的自定義函數(shù)。如果顯示器具有特殊的顏色格式,則可用于更緊湊地存儲(chǔ)像素。(例如1位單色,2位灰度等)。這樣,lv_disp_buf_t中使用的緩沖區(qū)可以較小,以?xún)H保留給定區(qū)域大小所需的位數(shù)。set_px_cb不能與兩個(gè)屏幕大小的緩沖區(qū)一起顯示緩沖區(qū)配置。
?monitor_cb 回調(diào)函數(shù)告訴在多少時(shí)間內(nèi)刷新了多少像素。
?clean_dcache_cb清除與顯示相關(guān)的所有緩存的回調(diào)
lv_drivers顯示接口:
要設(shè)置輸入設(shè)備,必須初始化 lv_indev_drv_t 變量,類(lèi)型(indev_drv.type)可以是:
?LV_INDEV_TYPE_POINTER觸摸板或鼠標(biāo)
?LV_INDEV_TYPE_KEYPAD鍵盤(pán)或小鍵盤(pán)
?LV_INDEV_TYPE_ENCODER帶有左,右,推動(dòng)選項(xiàng)的編碼器
?LV_INDEV_TYPE_BUTTON外部按鈕按下屏幕
3. 應(yīng)用開(kāi)發(fā)
LVGL圖形庫(kù)功能控件有很多,這里不在詳細(xì)介紹,詳細(xì)API介紹查閱LVGL官網(wǎng)。
LVGL主要控件功能有:

使用 lvgl 圖形庫(kù)之前,我們還必須初始化 lvgl 以及相關(guān)其他組件。初始化的順序?yàn)椋?/strong>
?調(diào)用 lv_init() 初始化 lvgl 庫(kù);
?初始化驅(qū)動(dòng)程序;
?在 LVGL 中注冊(cè)顯示和輸入設(shè)備驅(qū)動(dòng)程序;
?在中斷中每隔 x毫秒調(diào)用 lv_tick_inc(x)用以告知 lvgl 經(jīng)過(guò)的時(shí)間;
?每隔 x毫秒定期調(diào)用 lv_task_handler()用以處理與 lvgl 相關(guān)的任務(wù)。
SquareLine_Studio設(shè)計(jì)器:
(1)創(chuàng)建項(xiàng)目

(2)控件布局設(shè)計(jì)

(3)代碼生成


(4)代碼適配工程


(5)添加事件響應(yīng)代碼
運(yùn)行效果:

性能測(cè)試:
fps幀率:每秒鐘LCD圖形刷新的幀數(shù);
LVGL會(huì)通過(guò)內(nèi)部的tick,定時(shí)去刷屏幕;
10即1000ms/10ms=100FPS;
這個(gè)宏定義限定了LVGL刷屏幀率的上限,設(shè)定滿幀100幀;
使用全尺寸雙buffer。
實(shí)測(cè)結(jié)果:


總 結(jié)
本文介紹了 HPM6700/6400 LCD 控制器和2D圖形加速單元模塊,同時(shí)介紹了 LVGL 圖形界面庫(kù)功能及移植適配要點(diǎn),并基于 LVGL 圖形界面庫(kù)開(kāi)發(fā)驅(qū)動(dòng)點(diǎn)亮LCD屏的應(yīng)用示例。根據(jù)實(shí)測(cè)結(jié)果,LCD 幀率可達(dá)到60fps。官方 HPM-SDK 已將LVGL圖形庫(kù)移植適配完成,也提供了基于 LVGL 的demo示例,用戶(hù)可以非常便捷的使用HPM6700/6400 SDK 來(lái)完成LCD相關(guān)的應(yīng)用開(kāi)發(fā)。
-
mcu
+關(guān)注
關(guān)注
147文章
18934瀏覽量
398484
發(fā)布評(píng)論請(qǐng)先 登錄
先楫方案 | LED車(chē)尾燈純硬件高刷新率解決方案
經(jīng)驗(yàn)分享 | eclipse搭建先楫開(kāi)發(fā)環(huán)境
先楫半導(dǎo)體榮膺“年度優(yōu)秀AI機(jī)器人創(chuàng)新產(chǎn)品獎(jiǎng)” | “芯”動(dòng)力賦能產(chǎn)業(yè)升級(jí)
先楫半導(dǎo)體生態(tài)日成功舉辦,高性能RISC-V MCU開(kāi)發(fā)者共筑新生態(tài)
先楫半導(dǎo)體完成B+輪融資,中移和創(chuàng)投資加持
元禾控股投資先楫半導(dǎo)體:國(guó)產(chǎn)高性能MCU駛?cè)霗C(jī)器人控制“快車(chē)道”
上榜福布斯:先楫半導(dǎo)體入選亞洲百家最具潛力企業(yè)《Forbes Asia 100 to Watch》
K230上使用圖層layer = Display.LAYER_OSD2顯示完圖像后,怎么關(guān)閉這個(gè)圖層不再顯示?
先楫半導(dǎo)體高性能MCU入駐立創(chuàng)商城,國(guó)產(chǎn)芯勢(shì)力再添新動(dòng)能
先楫半導(dǎo)體HPM6E8Y:先楫實(shí)時(shí)控制芯片驅(qū)動(dòng)的機(jī)器人關(guān)節(jié)“芯”時(shí)代
【強(qiáng)勢(shì)上新】HPM5E00:EtherCAT運(yùn)動(dòng)控制MCU,先楫半導(dǎo)體再拓工業(yè)總線產(chǎn)品新版圖
【強(qiáng)勢(shì)上新】HPM5E00:EtherCAT運(yùn)動(dòng)控制MCU,先楫半導(dǎo)體再拓工業(yè)總線產(chǎn)品新版圖
驚艷就在眼前!來(lái)感受先楫MCU八圖層高清顯示
評(píng)論