STM32移植LVGL9.2.1教程

一、環境說明

(1)開發板:STM32F401RCT6核心板(網上很多,價格只有幾塊錢)

(2)屏幕:2.8寸spi屏+gt911觸摸 + 轉接板(某寶有賣,沒有推廣自行搜索)

(3)開發工具:stm32 cubemx + Keil5

(4)開發庫:STM32 HAL庫

(5)LVGL版本:9.2.1(和nxp gui guider版本保持一致,可圖形化開發)

二、圖片展示

?效果圖:

?接線圖:

三、視頻展示

?【開源!在7塊錢的開發版上跑LVGL9.2?】 https://www.bilibili.com/video/BV1wQ8vz8EUG/?share_source=copy_web&vd_source=fe79bb5485e516d8c2620e2fed931723

說明:項目完整代碼可以在視頻評論區獲取

四、 移植流程

1、裁剪代碼

需要的代碼不多主要就是lvgl的src目錄和幾個配置文件,自己可以再創建一個porting目錄用來放自己的接口代碼,如下:

?lvgl.mk這個文件很重要可以查看所有的lvgl.c文件,根據自己需要包含進工程,或者干脆全部包含。

然后直接用官方的lv_conf_template.h文件修改為lv_conf.h,里面的配置項不要亂改,不改都可以,后面根據自己情況再調整。

2、清除報錯

不要著急去改lvgl配置和移植接口,先保證工程編譯不報錯為止,缺少函數定義就去找函數定義的文件包含進工程,代碼區超了就裁剪,內存超了就減少緩沖區定義大小。

3、lvgl移植

?(1)在main函數中調用lv_init(),然后如果有報錯就繼續解決報錯。在while循環中調用lv_timer_handler(),我是在自己寫的接口函數lv_porting中調用lv_init的,放lcd_init后面就行,都一樣。

	gt911_init();LCD_Init();lv_porting();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){lv_timer_handler();gt911_scan(&gt911_point);HAL_Delay(10);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

?(2)在systick中斷中添加lv_tick_inc(1)函數,如下:

void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 */lv_tick_inc(1);/* USER CODE END SysTick_IRQn 1 */
}

?4、驅動移植

主要就是注冊顯示設備和輸入設備,代碼如下,lvgl9相比lvgl8驅動接口寫法簡單太多了。

int lv_porting(void)
{/*Initialize LVGL*/lv_init();/*Initialize the display, and the input devices*/hal_init(MY_DISP_HOR_RES, MY_DISP_VER_RES);/*Open a demo or an example*/gui_test();/*To hide the memory and performance indicators in the corners*disable `LV_USE_MEM_MONITOR` and `LV_USE_PERF_MONITOR` in `lv_conf.h`*/return 0;
}static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map)
{/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/uint16_t wr_color = RED;uint16_t * p_color = (uint16_t *)px_map;LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,p_color);/*IMPORTANT!!!*Inform the graphics library that you are ready with the flushing*/lv_display_flush_ready(disp_drv);
}static void tslib_read(lv_indev_t * drv, lv_indev_data_t * data)
{data->point.x = gt911_point.points.x1;data->point.y = gt911_point.points.y1;data->state = gt911_point.press ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
}lv_indev_t * lv_gt911_touchscreen_create(void)
{lv_indev_t * indev = lv_indev_create();lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);lv_indev_set_read_cb(indev, tslib_read);lv_indev_set_mode(indev, LV_INDEV_MODE_TIMER);return indev;
}/*** Initialize the Hardware Abstraction Layer (HAL) for the LVGL graphics* library*/static lv_display_t * hal_init(int32_t w, int32_t h)
{LV_ATTRIBUTE_MEM_ALIGNstatic uint8_t buf_2_1[MY_DISP_HOR_RES * 20 * BYTE_PER_PIXEL];LV_ATTRIBUTE_MEM_ALIGNstatic uint8_t buf_2_2[MY_DISP_HOR_RES * 20 * BYTE_PER_PIXEL];lv_display_t * disp;lv_group_set_default(lv_group_create());disp = lv_display_create(w, h);lv_display_set_flush_cb(disp, disp_flush);lv_display_set_buffers(disp, buf_2_1, buf_2_2, sizeof(buf_2_1)-MY_DISP_HOR_RES*3, LV_DISPLAY_RENDER_MODE_PARTIAL);lv_display_set_default(disp);lv_indev_t * touchscreen = lv_gt911_touchscreen_create();lv_indev_set_display(touchscreen, disp);lv_indev_set_group(touchscreen, lv_group_get_default());return disp;
}

五、總結

自己移植中間有很多坑不是三言兩句說得清楚的,后面有事件可以考慮出個視頻教程,有些我自己還沒完全搞明白,也在摸索當中,總之先把屏幕點起來,然后再考慮優化等等問題。

有興趣的可以從上面視頻關注我的b站賬號,視頻評論區也有完整項目工程代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91327.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91327.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python學智能算法(二十九)|SVM-拉格朗日函數求解中-KKT條件理解

【1】引言 前序學習階段中,我們掌握了最佳分割超平面對應的構造拉格朗日函數極值為: L(w,b,α)∑i1mαi?12∑i,j1mαiαjyiyjxiTxjL(w,b,\alpha)\sum_{i1}^{m}\alpha_{i}-\frac{1}{2}\sum_{i,j1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}L(w,…

大模型應用開發1-認識大模型

1.基礎概念 1.1 AI的概念: AI,??智能(Artificial Intelligence),使機器能夠像?類?樣思考、學習和解決問題的技術。AI發展?今?概可以分為三個階段:其中,深度學習領域的自然語言處理&#…

Linux 遠程連接解析:SSH 協議理論與應用

Linux 遠程連接解析:SSH 協議理論與應用在網絡互聯的時代,遠程管理服務器已成為常態。SSH(Secure Shell)作為一種安全的網絡協議,憑借其加密機制和靈活的功能,成為 Linux 系統遠程操作的事實標準。本文將從…

ubuntu22.04系統入門 linux入門 簡單命令基礎復習 實現以及實踐

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址:星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了,可以私信我獲取最新兌換碼!&a…

軟考中級-信息安全工程師-每日一學(1)

前提概要本文章主要用于分享軟考中級-信息安全工程師-學習,以下是一些個人理解,請大家結合參考其他文章中的相關信息及個人經驗進行歸納和補充,內容會存在一定錯誤,希望讀者多多評論批評,本人在此先說感謝啦。1.密碼學…

EEG手工特征提取總結

目錄一、引言EEG信號簡介EEG特征提取的重要性本次匯報目的與內容概述二、EEG信號核心特征時域特征 (Time-Domain Features)頻域特征 (Frequency-Domain Features)三、EEG信號高級特征時頻域特征 (Time-Frequency Domain Features)空間域特征 (Spatial-Domain Features)復雜動力…

React 路由守衛

下面,我們來系統的梳理關于 React Router 路由守衛 的基本知識點:一、路由守衛概述 1.1 什么是路由守衛 路由守衛是一種在用戶導航到特定路由之前或離開特定路由時執行邏輯的機制。它允許開發者控制用戶訪問權限、驗證條件或執行數據預加載等操作。 1.2 …

7月31日作業

1&#xff1a;請使用函數模板&#xff0c;寫一個能夠針對所有數據類型的數據的快速排序函數 并多寫幾個數組做測試代碼#include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector…

客戶服務自動化:如何用CRM減少50%人工工單?

通過CRM系統實現客戶服務自動化&#xff0c;企業可以顯著減少人工工單的數量&#xff0c;提升整體服務效率。那么如何利用CRM系統實現客戶服務自動化&#xff1f;幫助企業從根本上解決人工工單處理的難題&#xff0c;提升服務質量&#xff0c;優化資源配置&#xff0c;最終實現…

常用設計模式系列(十四)—模板方法模式

常用設計模式系列&#xff08;十四&#xff09;—模板方法模式 第一節 前言 之前我完成了創建型設計模式和結構型設計模式&#xff0c;我們今天將踏入設計模式的第三章&#xff1a;行為型設計模式&#xff0c;你是否還記得什么是行為型設計模式嗎&#xff1f;行為型模式&#x…

DoRA詳解:從LoRA到權重分解的進化

DoRA??是一種用于??大語言模型&#xff08;LLM&#xff09;微調??的技術&#xff0c;全稱為 ??"Weight-Decomposed Low-Rank Adaptation"??&#xff08;權重分解的低秩自適應&#xff09;。它是對現有微調方法&#xff08;如 ??LoRA??&#xff09;的改…

RocksDB關鍵設計詳解

0 說明 近日工作中使用了 RocksDB。RocksDB 的優點此處無需多說&#xff0c;它的一個 feature 是其有很多優化選項用于對 RocksDB 進行調優。欲熟悉這些參數&#xff0c;必須對其背后的原理有所了解&#xff0c;本文主要整理一些 RocksDB 的 wiki 文檔&#xff0c;以備自己參考…

Kotlin -> 普通Lambda vs 掛起Lambda

1. 普通Lambda vs 掛起Lambda的本質區別 1.1 普通Lambda&#xff08;同步執行&#xff09; val lambda: (Int) -> String { it.toString() }// 編譯器生成&#xff1a; class Lambda$1 : Function1<Int, String> {override fun invoke(p1: Int): String {return p1.t…

Apache Ignite 中如何配置和啟用各類監控指標

這段文檔是關于 Apache Ignite 中如何配置和啟用各類監控指標&#xff08;Metrics&#xff09; 的詳細說明。核心思想是&#xff1a;“指標收集有性能開銷&#xff0c;因此默認不開啟所有指標&#xff0c;需要你按需手動開啟。” 下面我們來逐層拆解、通俗易懂地理解這些內容。…

uniapp x swiper/image組件mode=“aspectFit“ 圖片有的閃現后黑屏

部分安卓機針對大寫.JPG 有的豎圖正常&#xff0c;橫圖/正方形不對。解決方案&#xff1a;加border-radius: 1rpx;就行<!-- 圖片預覽彈出框 --><fui-backdrop v-model:visible"imgPreviewVisible" :closable"true" onclick"imgPreviewVisibl…

conda安裝jupter

conda自帶的jupter本來在base里沒有在pytorch環境中 安裝jupter conda install nb_conda 此擴展程序在 Jupyter 文件瀏覽器中添加了一個 Conda 選項卡。選擇 Conda 選項卡將顯示&#xff1a; 當前存在的 Conda 環境列表當前配置的通道中可用的 Conda 包列表&#xff08;htt…

嵌入式操作系統快速入門(1):快速入門操作系統常見基礎概念

快速體會操作系統常見基礎概念 1 初識基本概念 1.1 操作系統 一個軟件程序&#xff1b;用于解決計算機多任務執行時的資源爭搶問題&#xff1b;管理計算機中的各種資源&#xff0c;確保計算機正常完成各種工作&#xff08;任務&#xff09;&#xff0c;解決多任務環境中任務的調…

網絡安全-同形異義字攻擊:眼見并非為實(附案例詳解)

什么是同形異義字攻擊&#xff1f;對人眼而言&#xff0c;一切看起來完全正常。但實際上&#xff0c;例如單詞 Ηоmоgraph 并不完全等同于單詞 Homograph。它們之間的差異非常細微&#xff0c;難以察覺。Ηоmоgraph 實際上包含了幾個非拉丁字母。在本例中&#xff0c;我們將…

windows服務器 maven 配置環境變量,驗證maven環境變量是否配置成功

前置條件&#xff1a;先確認對應版本的jdk已安裝配置好&#xff0c;可使用java -version檢測; 我使用的apache-maven-3.6.3是對應jdk1.8 1.找到系統變量配置窗口 以windows server2019為例&#xff0c;右鍵計算機屬性&#xff0c; 高級系統設置–》環境變量–》系統變量2.新建M…

安裝 docker compose v2版 筆記250731

安裝 docker compose v2版 筆記250731 簡述 v2版是插件形式 確認系統要求, 已安裝 Docker Engine&#xff08;版本 20.10.5 或更高&#xff09; 安裝方式可分為 apt 或 yum 安裝 (能自動升級) apt install docker-compose-pluginyum install docker-compose-plugin 手動二…